gsetting的使用

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。