结构体
GioSettingsSchema
以来:2.32
描述 [源代码]
struct GSettingsSchema {
/* No available fields */
}
GSettingsSchemaSource
和 GSettingsSchema
API 提供了一种机制,用于高级控制架构的加载以及对其内容的内省。
想要为插件提供访问设置的插件加载系统会遇到一个问题,那就是如何使这些设置的架构对 GSettings 可见。通常,插件会希望将架构与其自身一起分发,而不会将其安装到标准系统架构目录中。
GSettingsSchemaSource
通过允许创建一个新的“架构源”,从而获得这种机制。然后,该架构源可以成为与插件相关联的元数据的一部分,并在需要访问某些设置时进行查询。
考虑以下示例
typedef struct
{
…
GSettingsSchemaSource *schema_source;
…
} Plugin;
Plugin *
initialise_plugin (const gchar *dir)
{
Plugin *plugin;
…
plugin->schema_source =
g_settings_schema_source_new_from_directory (dir,
g_settings_schema_source_get_default (), FALSE, NULL);
…
return plugin;
}
…
GSettings *
plugin_get_settings (Plugin *plugin,
const gchar *schema_id)
{
GSettingsSchema *schema;
if (schema_id == NULL)
schema_id = plugin->identifier;
schema = g_settings_schema_source_lookup (plugin->schema_source,
schema_id, FALSE);
if (schema == NULL)
{
… disable the plugin or abort, etc …
}
return g_settings_new_full (schema, NULL, NULL);
}
上述代码展示了如何向初始化(或启用)插件的代码中添加钩子,以创建架构源,以及如何将 API 添加到插件系统中,以便插件能够方便地使用所分发的架构访问其设置。
从插件的角度看,它需要确保将 gschemas.compiled 文件作为自身的一部分分发,然后只需做以下操作
{
GSettings *settings;
gint some_value;
settings = plugin_get_settings (self, NULL);
some_value = g_settings_get_int (settings, "some-value");
…
}
也有可能插件系统期望的是架构源文件(即 .gschema.xml
文件),而不是 gschemas.compiled
文件。在这种情况下,插件加载系统必须在尝试创建设置源之前自行编译架构。
以来:2.32