GSettings实际上是一组可以使用多个存储后端的API。默认使用dconf作为后台,也可以使用keyfile作为后台。但是由于gio提供了GKeyFile结构来处理keyfile,所以在解析keyfile的时候很少用到GSettingsAPI。这里只介绍使用dconf作为后台的方法。dconfdconf是一个底层配置管理系统,设计为GSettings的后端,提供图形化的配置管理工具dconf-editor,具有以下特点:Databasefile)Data,是一个简单的数据库,以路径映射的形式存储key,检索效率高。默认文件路径为:~/.config/dconf/user支持更改通知dconf支持在密钥更改时发送通知。配置文件GSettings的配置文件是xml格式,文件需要以.gschema.xml结尾,文件名一般ids相同。配置文件安装在/usr/share/glib-2.0/schemas/目录中。手动添加的文件需要执行sudoglib-complie-schemas/usr/share/glib-2.0/schemas才能生效。文件内容的简要格式如下:可以看到一个文件可以包含多个schema,每个schema可以包含多个键组成。具体如下:idschema中的id需要在整个配置系统中是唯一的,否则重复的id在执行glib-compile-schemas时会被忽略;id开头一般使用应用相关的域名。pathschema中的path必须以/开头,以/结尾,不能包含连续的/,path用于指定storage中的存储路径,可以与idnamekeyname不一致,需要在本schema中唯一,取值name由小写字母、数字和-组成,必须以小写字母开头,不能以-结尾,不能有连续的-typekey类型。它需要是GVariant支持的类型。除了使用基本类型外,还可以结合GVariant方式中类型defaultkey的默认值summarykey的简要说明descriptionkey的详细说明下面举例:schemafile:true启用该模块。是否启用该模块。'info'日志级别。日志级别。10定时器持续时间。定时器持续时间。(800,600)窗口大小。窗口大小。程序代码如下:/***Copyright(C)2019jouyouyun**本程序是免费软件;你可以重新分发它和/或根据*自由软件基金会发布的GNU通用公共许可证的条款修改*它;许可证的第3版,或*(由您选择)任何更高版本。**example.c--gsettings的示例。**编译:*gcc-Wall-gexample.c`pkg-config--libs--cflagsgio-2.0`**/#includeintmain(intargc,char*argv[]){GSettings*gs;gboolean启用;gintloglevel,间隔,宽度,高度;//如果失败,将出现segmetfaultgs=g_settings_new("com.deepin.test");enabled=g_settings_get_boolean(gs,"enabled");g_print("启用:%d\n",启用);loglevel=g_settings_get_enum(gs,"loglevel");g_print("日志级别:%d\n",loglevel);间隔=g_settings_get_int(gs,"间隔");g_print("定时器时长:%d\n",间隔);g_settings_get(gs,"尺寸","(ii)",&宽度,&高度);g_print("宽度:%d,高度:%d\n",宽度,高度);g_object_unref(gs);return0;}注意:使用接口调用时,需要保证schema和key存在,否则会触发segmentfault。RelocatableSchema通常有一个id对应固定的路径,但也可以不存在,即没有设置路径,所以是可重定位的schema。此功能对于变量配置很有用,例如用户自定义快捷键:快捷键数量未知。这时候可以利用这个特性,声明一个快捷键模式为模板,然后动态创建多个路径供使用。示例如下:schema文件如下:''快捷方式名称。快捷方式名称。['']快捷键。快捷键。''快捷方式。快捷方式。''快捷方式描述快捷方式说明。程序代码如下:/***Copyright(C)2019jouyouyun**本程序为免费软件;您可以根据*自由软件基金会发布的GNU通用公共许可证的条款重新分发和/或修改*它;许可证的第3版,或*(由您选择)任何更高版本。**relocatable.c--gsettings可重定位路径的示例。**编译:*gcc-Wall-grelocatable.c`pkg-config--libs--cflagsgio-2.0`*/#include#includestaticvoidset_keybind(GSettings*gs);staticvoidget_keybind(GSettings*gs);staticvoidset_keybind(GSettings*gs){gbooleanok;ok=g_settings_set_string(gs,"name","test");if(!ok){g_warning("未能将名称设置为'test'");}constgchar*快捷方式[]={“Control-Alt-T","Super-T",NULL};ok=g_settings_set_strv(gs,"快捷方式",快捷方式);if(!ok){g_warning("无法设置快捷方式");}ok=g_settings_set_string(gs,"action","terminator");if(!ok){g_warning("Failedtosetactionto'terminator'");}ok=g_settings_set_string(gs,"description","theshortcutsforterminator");if(!ok){g_warning("无法将描述设置为'终结符的快捷方式'");}}staticvoidget_keybind(GSettings*gs){gchar*name,*action,*desc;gchar**shortcuts=NULL;name=g_settings_get_string(gs,"name");if(name){g_print("Shortcutname:%s\n",name);g_free(name);}shortcuts=g_settings_get_strv(gs,"shortcuts");if(shortcuts){inti=0;g_print("快捷键:");for(;shortcuts[i];i++){if(i!=0){g_print(",");}g_print("%s",短路uts[i]);g_free(快捷方式[i]);}g_print("\n");g_free(快捷方式);}action=g_settings_get_string(gs,"action");if(action){g_print("快捷方式操作:%s\n",action);g_free(动作);}desc=g_settings_get_string(gs,"描述");if(desc){g_print("快捷方式desc:%s\n",desc);g_free(描述);}}intmain(intargc,char*argv[]){if(argc!=3){g_print("Usage:%s\n""\taction:getorset\n""\tkeybindid:一个非负整数\n",argv[0]);返回0;}GSettings*gs;gcharbuf[1024]={0};if(sprintf(buf,"/com/deepin/test/keybind/%s/",argv[2])<0){g_error("合并路径失败:%s\n",argv[2]);返回-1;}gs=g_settings_new_with_path("com.deepin.test.keybind",buf);如果(g_strcmp0(argv[1],"set")==0){set_keybind(gs);}elseif(g_strcmp0(argv[1],"get")==0){get_keybind(gs);}else{g_warning("无效操作:%s",argv[1]);}g_object_unref(gs);g_settings_sync();return0;}overridegsettings支持override机制,可以改变默认值。通常在文件中已经指定了key的默认值,但有时不同的版本需要不同的默认值。这时候override机制就非常有用了,可以用在不修改配置文件的情况下改变默认值。覆盖文件以number_开头,以.gschema.override结尾。该数字是一个两位数的整数。值越大,优先级越高。覆盖文件也安装在/usr/share/glib-2.0/schemas目录中,需要使用glib-compile-schemas进行编译。override文件格式如下:[schemaid]key=value如果将com.deepin.test中interval的默认值改为30,则内容如下:[com.deepin.test]interval=30然后执行:sudocp./90_com.deepin.test.gschema.override/usr/share/glib-2.0/schemas/sudoglib-compile-schemas/usr/share/glib-2.0/schemaskeychangesignalGSettings提供改变的信号给发送密钥更改事件,例如如果需要可以监视此信号。Toolglib-sompile-schemas{#glib-sompile-schemas}编译schema文件的命令dconf-editor{#dconf-editor}dconf的图形化工具可以管理keydevhelp,API文档查看工具,安装libglib2.0后-docs,可以在devhelp中查看GSettings的API文档。gsettings这是gsettings的配置管理工具。下面介绍一些常用的子命令。详细用法请参考man手册:list-schemas列出所有已安装和可用的schemalist-relocatable-schemaswithafixedpath列出所有已安装的schemalist-没有固定路径的keys列出指定schema中的所有keylist-recursivelylistsall指定schema中的keys及其值,如果未指定schema,则获取指定schema中指定key的值。在指定模式中设置指定键的值。reset重置指定schema中指定key的值,即恢复默认值。Monitor监控指定schema中指定key的变化。如果未指定,则监听所有引用的dconfGSettingsGSettingsAPIGVariant格式字符串