GSettings 的配置文件是 xml 格式的,文件需以 .gschema.xml 结尾,文件名通常与 id 相同。配置文件安装在 /usr/share/glib-2.0/schemas/ 目录下,手动添加进去的文件需要执行 sudo glib-complie-schemas /usr/share/glib-2.0/schemas 让其生效。
以创建com.deepin.test为例:
1.cd /usr/share/glib-2.0/schemas
2.touch com.deepin.test.schemas.xm
3. sudo glib-compile-schemas /usr/share/glib-2.0/schemas //类似于更新,如果不执行,g_setting_new()时找不到com.deepin.test文件。
文件内容简要格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<schema path="" id="">
<key type="" name="">
<default></default>
<summary></summary>
<description></description>
</key>
</schema>
</schemalist>
可以看到一个文件里可以包含多个 schema ,每个 schema 可由多个 key 组成。详细说明如下:
id
schema 中的 id 需要在整个配置系统中是唯一的,不然执行 glib-compile-schemas 时会忽略重复的 id ; id 的开头通常使用与应用相关的域名
path
schema 中的 path 必须是以 / 开头并且以 / 结尾,不能包含连续的 / , path 用于指定在 storage 中存储路径,可以与 id 不一致
name
key 的名称,需要在此 schema 中是唯一的, name 的值由小写字母、数字和 - 组成,并且开头必须是小写字母,不能以 - 结尾,也不能出现连的 -
type
key 的类型,需要是 GVariant 支持的类型,除了可以使用基本的类型外,也可按照 GVariant 的方式组合类型
default
key 的默认值
summary
key 的简单描述
description
key 的详细描述
举例:
1.schema文件:
<?xml version="1.0" encoding="UTF-8"?>
<schemalist>
<enum id="com.deepin.test.LogLevel">
<value nick="debug" value="1" />
<value nick="info" value="2" />
<value nick="fatal" value="3" />
</enum>
<schema path="/com/deepin/test/" id="com.deepin.test">
<key type="b" name="enabled">
<default>true</default>
<summary>Enable this module.</summary>
<description>Whether enable this module.</description>
</key>
<key enum="com.deepin.test.LogLevel" name="loglevel">
<default>'info'</default>
<summary>Log level.</summary>
<description>Log level.</description>
</key>
<key type="i" name="interval">
<default>10</default>
<range min="0" max="60" />
<summary>Timer duration.</summary>
<description>Timer duration.</description>
</key>
<key type="(ii)" name="size">
<default>(800,600)</default>
<summary>The window size.</summary>
<description>The window size.</description>
</key>
</schema>
</schemalist>2.C文件:
#include <gio/gio.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
GSettings *gs;
gboolean enabled;
gint loglevel, interval, width, height;
// if failed, will segmetfault
gs = g_settings_new("com.deepin.test");
if(gs==NULL){
printf("g_set_new error\n");
return -1;
}
enabled = g_settings_get_boolean(gs, "enabled");
g_print("Enabled: %d\n", enabled);
loglevel = g_settings_get_enum(gs, "loglevel");
g_print("Log level: %d\n", loglevel);
interval = g_settings_get_int(gs, "interval");
g_print("Timer duration: %d\n", interval);
g_settings_get(gs, "size", "(ii)", &width, &height);
g_print("Width: %d, height: %d\n", width, height);
g_object_unref(gs); //释放
return 0;
}
3.Makefile文件:
app:test.c
gcc test.c -g -o app -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include/ -lgio-2.0 -lglib-2.0 -lgobject-2.0
clean:
rm -rf app
如果没有后面的动态库文件,执行apt-get install libglib2.0-dev
4.通过dconf-edit gui工具辅助查看
sudo apt-get install dconf-edit