Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Возможности тулкита GTK+ и сопутствующих библиотек


Автор: А.Панин
Дата публикации: 3 декабря 2014 г.

Специализированный механизм для работы с данными конфигурации приложений

2. Осуществление доступа к значениям параметров конфигурации приложения

Для доступа к значениям параметров конфигурации приложения необходимо создать объект типа GSettings. Этот объект может быть создан с помощью одной из пяти функций: g_settings_new(), g_settings_new_with_path(), g_settings_new_with_backend(), g_settings_new_with_backend_and_path() или g_settings_new_full(). В подавляющем большинстве случаев используется первая функция, в качестве аргумента которой передается идентификатор схемы параметров конфигурации приложения (в нашем случае org.gtk.GSettingsTest). Остальные функции позволяют использовать схему параметров конфигурации приложения с заданным с помощью аргумента path путем схемы, а также реализацию собственного интерфейса хранения данных, указатель на которую передается с помощью аргумента backend.
GSettings *g_settings_new(const gchar *schema_id); 
GSettings *g_settings_new_with_path(const gchar *schema_id, 
                                    const gchar *path); 
GSettings *g_settings_new_with_backend(const gchar *schema_id, 
                                       GSettingsBackend *backend); 
GSettings *g_settings_new_with_backend_and_path(const gchar *schema_id, 
                                                GSettingsBackend *backend, 
                                                const gchar *path); 
GSettings *g_settings_new_full(GSettingsSchema *schema, 
                               GSettingsBackend *backend, 
                               const gchar *path);
Если вы хотите получить список всех схем параметров конфигурации приложений, установленных в системе, вы можете воспользоваться функциями g_settings_list_schemas() и g_settings_list_relocatable_schemas(). Первая функция позволяет получить список схем, содержащих описания путей, для работы с которыми можно использовать функцию g_settings_new(), вторая - список схем, не содержащих описания путей, для работы с которыми необходимо использовать функцию g_settings_new_with_path(). Возвращаемые обоими функциями списки схем конфигурации приложений не могут модифицироваться, а использованная для их хранения память не может освобождаться.
const gchar *const *g_settings_list_schemas(void);
const gchar *const *g_settings_list_relocatable_schemas(void);
После создания объекта типа GSettings можно начинать работу с значениями параметров конфигурации приложения. Для получения списка всех параметров конфигурации, описанных в рамках схемы, может быть использована функция g_settings_list_keys(). Данная функция используется достаточно редко, так как разработчик чаще всего обладает информацией о том, какие параметры используются для конфигурации приложения.
gchar **g_settings_list_keys(GSettings *settings);

Память, использованная для хранения полученного списка параметров конфигурации приложения, должна освобождаться с помощью функции g_strfreev().

Если вам необходимо получить названия элементов списка или дочерних схем, вы можете воспользоваться функцией g_settings_list_children(). Для работы с каждым из полученных элементов списка может быть использована функция g_settings_get_child(), которая вернет объект типа GSettings, но также не исключены ситуации, в которых вместо списка будет возвращено значение NULL, поэтому не стоит пренебрегать излишними проверками значений.
gchar **g_settings_list_children(GSettings *settings);
GSettings *g_settings_get_child(GSettings *settings, 
                                const gchar *name);

Как и в аналогичных функциях, память, использованная для хранения элементов списка, должна освобождаться с помощью функции g_strfreev().

При работе с объектами типа GSettings у вас имеется возможность создания наборов изменений, которые могут быть атомарно сохранены или отклонены с помощью единственной функции. В этом случае не потребуется отдельных объектов: вместо этого объект GSettings с помощью функции g_settings_delay() может быть переведен в режим "отложенной записи", в котором произведенные средствами объекта типа GSettings изменения не сохраняются до определенного момента. Несмотря на то, что при использовании функций, аналогичных функции g_settings_get(), по отношению к рассматриваемому объекту типа GSettings, будут возвращаться измененные значения, при вызове тех же функций по отношению к другому объекту для той же схемы или из другого процесса значения будут оставаться прежними. При необходимости атомарной записи изменений может быть использована функция g_settings_apply(), а в том случае, если изменения не должны быть записаны, вы можете либо использовать функцию g_settings_revert(), либо удалить все ссылки на объект типа GSettings. Для проверки наличия несохраненных изменений может быть использована функция g_settings_get_has_unapplied(). Принудительная запись изменений параметров конфигурации приложения перед удалением ссылок на объект может быть осуществлена с помощью функции g_settings_sync().
void g_settings_delay(GSettings *settings);
void g_settings_apply(GSettings *settings);
void g_settings_revert(GSettings *settings);
gboolean g_settings_get_has_unapplied(GSettings *settings);
void g_settings_sync(void);
Стоит также обратить внимание на возможность связывания параметров конфигурации со свойствами объектов объектной модели GObject. Такое связывание может быть активировано с помощью функций g_settings_bind(), g_settings_bind_with_mapping(), g_settings_bind_writable() и деактивировано с помощью функции g_settings_unbind():
void g_settings_bind(GSettings *settings, 
                     const gchar *key, 
                     gpointer object, 
                     const gchar *property, 
                     GSettingsBindFlags flags);
void g_settings_bind_with_mapping(GSettings *settings, 
                                  const gchar *key, 
                                  gpointer object, 
                                  const gchar *property, 
                                  GSettingsBindFlags flags, 
                                  GSettingsBindGetMapping get_mapping, 
                                  GSettingsBindSetMapping set_mapping, 
                                  gpointer user_data, 
                                  GDestroyNotify destroy);
void g_settings_bind_writable(GSettings *settings, 
                              const gchar *key, 
                              gpointer object, 
                              const gchar *property, 
                              gboolean inverted);
void g_settings_unbind(gpointer object, 
                       const gchar *property);

Во всех функциях с помощью аргумента key задается имя параметра конфигурации для связывания, с помощью аргумента object - объект, со свойством которого осуществляется связывание, с помощью аргумента property - имя свойства, с которым происходит связывание, а с помощью аргумента flags - битовая маска из флагов связывания: флаг G_SETTINGS_BIND_GET позволяет изменять значение свойства объекта при изменении значения параметра конфигурации, G_SETTINGS_BIND_SET - изменять значение параметра конфигурации при изменении значения свойства объекта, G_SETTINGS_BIND_DEFAULT - выполнять обе описанные операции, G_SETTINGS_BIND_NO_SENSITIVITY - не связывать свойство объекта "sensitivity" с возможностью записи значения параметра конфигурации, G_SETTINGS_BIND_GET_NO_CHANGES - устанавливать значение свойства объекта на основе значения параметра конфигурации и не отслеживать изменения значения этого параметра конфигурации, G_SETTINGS_BIND_INVERT_BOOLEAN - изменять логическое значение на противоположное в случае связывания параметра конфигурации и свойства объекта. С помощью функции g_settings_bind() осуществляется простое связывание значения параметра конфигурации со свойством объекта. При использовании функции g_settings_bind_with_mapping() появляется возможность использования функций преобразования значений параметров конфигурации в значения свойств объекта и наоборот, задаваемых с помощью аргументов get_mapping и set_mapping соответственно, причем с помощью аргумента user_data в функции могут передаваться пользовательские данные, а с помощью аргумента destroy - задаваться функция для освобождения памяти, использованной для хранения пользовательских данных. Функция g_settings_bind_writable() позволяет устанавливать связь между возможностью записи значения параметра конфигурации и свойством объекта, причем при изменении возможности записи значения параметра конфигурации будет изменяться значение свойства объекта, а не наоборот. Чаще всего данная функция используется для связи возможности записи значения параметра конфигурации с такими свойствами объектов виджетов, как "sensitive" (устанавливает возможность работы с виджетом) и "visible" (устанавливает видимость виджета). Разумеется, параметры конфигурации должны иметь логические значения, причем с помощью аргумента inverted может активироваться режим инверсии этого значения.

Кроме того, изменения значений параметров конфигурации могут связываться с действиями типа GAction, причем сами действия с именами, соответствующими именам параметров конфигурации, создаются автоматически с помощью функции g_settings_create_action(). Созданное действие активируется и деактивируется в зависимости от возможности записи значения параметра конфигурации, причем при активации передается значение параметра (за исключением логических параметров):
GAction *g_settings_create_action(GSettings *settings, const gchar *key);
С помощью аргумента key в функцию передается имя параметра конфигурации. Сама же проверка возможности записи значения параметра конфигурации может осуществляться с помощью функции g_settings_is_writable().
gboolean g_settings_is_writable(GSettings *settings, const gchar *name);
Наиболее часто используемыми функциями являются функции для работы с конкретными значениями параметров конфигурации. Эти функции могут быть разделены на три группы:
  1. Функции для получения значений параметров конфигурации
  2. Функции для установки значений параметров конфигурации
  3. Вспомогательные функции

Описание функций двух первых типов приведено в рамках Таблицы 1. Для ознакомления с аргументами упомянутых функций, обратитесь к документации библиотеки GIO, доступной как в сети, так и после установки приложения Devhelp.

Таблица 1. Функции для работы с значениями параметров конфигурации приложения

Функция для получения значения параметра конфигурации Функция для установки значения параметра конфигурации Описание
g_settings_get() g_settings_set() Получение/установка значений параметров конфигурации приложения, упаковываемых в рамках значения типа GVariant. Для упаковки и распаковки значений используются строки форматирования.
g_settings_get_boolean() g_settings_set_boolean() Получение/установка логического значения параметра конфигурации приложения.
g_settings_get_int() g_settings_set_int() Получение/установка знакового целочисленного значения параметра конфигурации приложения.
g_settings_get_uint() g_settings_set_uint() Получение/установка беззнакового целочисленного значения параметра конфигурации приложения.
g_settings_get_double() g_settings_set_double() Получение/установка значения параметра конфигурации с плавающей точкой.
g_settings_get_string() g_settings_set_string() Получение/установка строкового значения параметра конфигурации приложения.
g_settings_get_strv() g_settings_set_strv() Получение/установка значения параметра конфигурации приложения, представленного массивом строк.
g_settings_get_enum() g_settings_set_enum() Получение/установка знакового целочисленного значения параметра конфигурации приложения из заданного перечисления.
g_settings_get_flags() g_settings_set_flags() Получение/установка беззнакового целочисленного параметра конфигурации приложения, используемого для хранения флагов.

Описание вспомогательных функций приведено в Таблице 2.

Таблица 2. Вспомогательные функции

Функция Описание
g_settings_reset() Сброс значения параметра конфигурации приложения до заданного в рамках схемы стандартного значения.
g_settings_get_range() Получение заданного в рамках схемы диапазона значений параметра конфигурации приложения.
g_settings_range_check() Проверка соответствия типа значения параметра конфигурации установленному в рамках схемы типу, а также вхождения этого значения в заданный в рамках схемы диапазон значений.

Единственное, о чем осталось упомянуть - это сигналы, генерируемые средствами объектов типа GSettings при изменении значений параметров конфигурации приложения силами сторонних приложений. Вы можете установить обработчик для сигнала "changed" для отслеживания изменения значений параметров конфигурации приложения (что будет показано в примере) или обработчик для сигнала "changed::<имя параметра>" для отслеживания изменений значения отдельно взятого параметра конфигурации. В том случае, если вам необходимо отслеживать изменения возможности записи множества параметров или одного параметра конфигурации приложения, вы можете установить обработчики для сигналов "writable-changed" и "writable-changed::<имя параметра>" соответственно.


Продолжение статьи : 3. Пример использования.