GioSettings

描述 [源代码]

class Gio.Settings : GObject.Object
{
  priv: GSettingsPrivate*
}

GSettings 类提供了一个便利的 API,用于存储和检索应用程序设置。

读写可以认为是非阻塞的。使用GSettings读取设置通常非常快:大约与GHashTable查找同一数量级(但较慢)。写入设置在返回您的应用程序方面也非常快,但可能对其他线程和其他进程非常昂贵。许多设置后端(包括dconf)都有懒初始化,这意味着在用户通常不修改任何设置的常见情况下,可以避免大量工作。对于dconf,在这种情况下甚至不需要启动D-Bus服务。因此,您应该仅在实际用户显式动作的情况下修改GSettings密钥。特别应小心确保不在启动时进行修改——例如,设置首选项小部件的初始值。内置的g_settings_bind()功能注意不在通过修改小部件而产生通知信号的响应中写入设置。

创建一个GSettings实例时,您必须指定一个描述设置中的密钥及其类型和默认值的架构,以及其他一些信息。

通常,架构有一个固定的路径,用于确定设置在概念全球树中的存储位置。然而,架构也可以是“可移动的”,即没有固定的路径。这在例如,架构描述了“账户”,您希望能够存储任意数量的账户时很有用。

路径必须以正斜杠字符(/)开始和结束,并且不能包含连续的两个斜杠字符。路径应根据与属于程序的设置所属的域相关联的域名来选择。路径示例包括 /org/gtk/settings/file-chooser//ca/desrt/dconf-editor/。路径不应以 /apps//desktop//system/ 开头,因为它们在 GConf 中往往如此。

与其他配置系统(如 GConf)不同,GSettings 不限制键的基本类型(如字符串和数字)。GSettings 使用 GVariant 存储值,并允许任何 GVariantType 键。键名仅限于小写字母、数字和 -。此外,名称必须以小写字母开头,不得以 - 结尾,并且不得包含连续的破折号。

与 GConf 类似,GSettings 架构中的默认值可以本地化,但本地化值存储在 gettext 目录中,并通过指定在<schemalist><schema>元素中指定和<default>元素中指定在l10n属性中指定的域和类别来查找。翻译的字符串包括 <default> 元素中包括任何周围引号的所有文本。

l10n 属性必须设置为 messagestime,并设置地区分类以进行翻译。“ messages”类别应默认使用;对于可翻译的日期或时间格式,请使用“ time”。可以在 <default> 元素上面的 XML 注释中添加翻译注释——建议将这些注释添加以帮助翻译者了解默认值的含义和影响。可以在 <default> 元素上设置可选的翻译context属性,以消除使用相同字符串的多个默认值之间的歧义。

例如

 <!-- Translators: A list of words which are not allowed to be typed, in
      GVariant serialization syntax.
      See: https://developer.gnome.org/glib/stable/gvariant-text.html -->
 <default l10n='messages' context='Banned words'>['bad', 'words']</default>

默认值的翻译必须保持作为序列化的GVariant的语法有效性(例如,保留任何周围的引号),或者将发生运行时错误。

GSettings 使用由 glib-compile-schemas 工具创建的紧凑二进制格式的 schema。输入是一个 XML 格式的 schema 描述。

gschema XML 格式的 DTD 可以在这里找到:gschema.dtd

glib-compile-schemas 工具期望 schema 文件扩展名为 .gschema.xml

在运行时,schema 通过其 ID(如 <schema> 元素的 id 属性中指定)来识别。schema ID 的约定是使用点名称,类似于 D-Bus 总线名称的风格,例如 org.gnome.SessionManager。特别是,如果设置是为拥有 D-Bus 总线名称的特定服务,那么 D-Bus 总线名称和 schema ID 应该相匹配。对于处理不与特定应用名称相关联的设置的 schema,ID 不应使用 StudlyCaps,例如 org.gnome.font-rendering

除了 GVariant 类型,键还可以有枚举类型。这些可以通过 <choice><enum><flags> 元素来描述,如下面的第二个示例所示。此类键的底层类型是字符串,但您可以使用 g_settings_get_enum()g_settings_set_enum()g_settings_get_flags()g_settings_set_flags() 访问枚举和标志键的相应数值。

默认值的示例

<schemalist>
  <schema id="org.gtk.Test" path="/org/gtk/Test/" gettext-domain="test">

    <key name="greeting" type="s">
      <default l10n="messages">"Hello, earthlings"</default>
      <summary>A greeting</summary>
      <description>
        Greeting of the invading martians
      </description>
    </key>

    <key name="box" type="(ii)">
      <default>(20,30)</default>
    </key>

    <key name="empty-string" type="s">
      <default>""</default>
      <summary>Empty strings have to be provided in GVariant form</summary>
    </key>

  </schema>
</schemalist>

范围、选择和枚举类型的示例

<schemalist>

  <enum id="org.gtk.Test.myenum">
    <value nick="first" value="1"/>
    <value nick="second" value="2"/>
  </enum>

  <flags id="org.gtk.Test.myflags">
    <value nick="flag1" value="1"/>
    <value nick="flag2" value="2"/>
    <value nick="flag3" value="4"/>
  </flags>

  <schema id="org.gtk.Test">

    <key name="key-with-range" type="i">
      <range min="1" max="100"/>
      <default>10</default>
    </key>

    <key name="key-with-choices" type="s">
      <choices>
        <choice value='Elisabeth'/>
        <choice value='Annabeth'/>
        <choice value='Joe'/>
      </choices>
      <aliases>
        <alias value='Anna' target='Annabeth'/>
        <alias value='Beth' target='Elisabeth'/>
      </aliases>
      <default>'Joe'</default>
    </key>

    <key name='enumerated-key' enum='org.gtk.Test.myenum'>
      <default>'first'</default>
    </key>

    <key name='flags-key' flags='org.gtk.Test.myflags'>
      <default>["flag1","flag2"]</default>
    </key>
  </schema>
</schemalist>

供应商覆盖

默认值定义在应用程序安装的 schema 中。有时,供应商或发行商需要调整这些默认值。由于修补 schema 的 XML 源不便且容易出错,glib-compile-schemas 读取所谓的“供应商覆盖”文件。这些是位于 XML schema 源同一目录中的密钥文件,可以覆盖默认值。schema ID 作为密钥文件中的组名,值期望以序列化 GVariant 形式提供,如下面的示例所示

[org.gtk.Example]
key1='string'
key2=1.5

glib-compile-schemas 期望 schema 文件扩展名为 .gschema.override

绑定

GSettings 的一个非常方便的功能允许您使用 g_settings_bind() 直接将 GObject 属性绑定到设置。一旦一个 GObject 属性被绑定到一个设置,任何一方的更改都会自动传播到另一方。GSettings 处理诸如 GObjectGVariant 类型之间的映射以及防止无限循环等细节。

这使得非常适合将优先级对话框连接到底层设置中。为了让这更加方便,GSettings 会寻找一个名为 sensitivity 的布尔属性,并将其自动绑定到绑定设置的写性上。如果这种“魔法”妨碍了操作,可以使用 G_SETTINGS_BIND_NO_SENSITIVITY 标志来抑制。

可重定位模式

可重定位模式是指在它的 <schema> 元素上没有指定 path 属性的模式。通过使用 g_settings_new_with_path(),可以为可重定位模式创建一个 GSettings 对象,并将路径分配给实例。传递给 g_settings_new_with_path() 的路径通常由一个常前缀加上某种类型的实例标识符动态构建;但它们必须是有效的 GSettings 路径。路径也可以是常量,并与来自依赖库的全球安装的模式一起使用。

例如,可以使用可重定位模式存储应用程序中不同窗口的几何信息。如果模式 IDorg.foo.MyApp.Window,则可以为路径 /org/foo/MyApp/main//org/foo/MyApp/document-1//org/foo/MyApp/document-2/ 等等创建实例。如果有任何路径是众所周知的,则可以将它们指定为父模式中的 <child> 元素,例如:

<schema id="org.foo.MyApp" path="/org/foo/MyApp/">
  <child name="main" schema="org.foo.MyApp.Window"/>
</schema>

构建系统集成

Meson

GSettings 是 Meson 的 GNOME 模块 的原生支持。

您可以像安装其他数据文件一样安装模式

install_data(
  'org.foo.MyApp.gschema.xml',
  install_dir: get_option('datadir') / 'glib-2.0/schemas',
)

您可以使用 gnome.post_install() 函数在安装时编译模式

gnome = import('gnome')
gnome.post_install(
  glib_compile_schemas: true,
)

如果要在 GSettings 模式中使用在 C 头文件中定义的枚举类型,既可以使用模式 XML 中的 <enum> 元素手动定义它,也可以从 C 头文件自动提取。这种方法是首选的,因为它确保两种表示始终同步。为了做到这一点,您需要使用 gnome.mkenums() 函数和以下模板:

schemas_enums = gnome.mkenums('org.foo.MyApp.enums.xml',
  comments: '<!-- @comment@ -->',
  fhead: '<schemalist>',
  vhead: '  <@type@ id="org.foo.MyApp.@EnumName@">',
  vprod: '    <value nick="@valuenick@" value="@valuenum@"/>',
  vtail: '  </@type@>',
  ftail: '</schemalist>',
  sources: enum_sources,
  install_header: true,
  install_dir: get_option('datadir') / 'glib-2.0/schemas',
)

建议您将验证模式作为您应用程序测试套件的一部分进行

test('validate-schema',
  find_program('glib-compile-schemas'),
  args: ['--strict', '--dry-run', meson.current_source_dir()],
)

如果您的应用程序允许运行未安装的程序,您还应该使用 gnome.compile_schemas() 函数在当前构建目录中编译模式

gnome.compile_schemas()

自动工具

GSettings 包含自动工具集成以简化模式的编译和安装。要将 GSettings 支持添加到应用程序中,请向您的 configure.ac 添加以下内容:

GLIB_GSETTINGS

在适当的 Makefile.am 中,使用以下片段编译和安装命名模式:

gsettings_SCHEMAS = org.foo.MyApp.gschema.xml
EXTRA_DIST = $(gsettings_SCHEMAS)

@GSETTINGS_RULES@

如果要在 GSettings 模式中使用在 C 头文件中定义的枚举类型,既可以使用模式 XML 中的 <enum> 元素手动定义它,也可以从 C 头文件自动提取。这种方法是首选的,因为它确保两种表示始终同步。为了做到这一点,请将以下内容添加到相关的 Makefile.am

gsettings_ENUM_NAMESPACE = org.foo.MyApp
gsettings_ENUM_FILES = my-app-enums.h my-app-misc.h

gsettings_ENUM_NAMESPACE 指定了枚举文件的架构命名空间,这些文件在 gsettings_ENUM_FILES 中指定。这将会生成一个包含提取枚举的 org.foo.MyApp.enums.xml 文件,该文件将在架构编译、安装和卸载规则中自动包含。它不应提交到版本控制或包含在 EXTRA_DIST 中。

本地化

为标记架构 XML 文件进行翻译,无需对构建系统进行任何更改。假设它设置了 gettext-domain 属性,如果使用的是 gettext 0.19 或更高版本(翻译的首选方法),则可以通过将其添加到 POTFILES.in 中来标记架构为翻译。

data/org.foo.MyApp.gschema.xml

或者,如果使用的是 intltool 0.50.1

[type: gettext/gsettings]data/org.foo.MyApp.gschema.xml

GSettings 将使用 gettext 查找 <summary><description> 元素以及任何设置了 l10n 属性的 <default> 元素的翻译。

翻译不得通过构建系统包含在 .gschema.xml 文件中,例如通过使用规则从模板生成 XML 文件。

祖先

构造函数

g_settings_new

使用由 schema_id 指定的架构创建一个新的 GSettings 对象。

since: 2.26

g_settings_new_full

使用给定的架构、后端和路径创建一个新的 GSettings 对象。

since: 2.32

g_settings_new_with_backend

使用由 schema_id 指定的架构和一个给定的 GSettingsBackend 创建一个新的 GSettings 对象。

since: 2.26

g_settings_new_with_backend_and_path

使用由 schema_id 指定的架构、一个给定的 GSettingsBackend 和路径创建一个新的 GSettings 对象。

since: 2.26

g_settings_new_with_path

使用由 schema_id 指定的可移动架构和一个给定的路径创建一个新的 GSettings 对象。

since: 2.26

函数

g_settings_list_relocatable_schemas

已弃用。

已弃用:2.40 since: 2.28

g_settings_list_schemas

已弃用。

已弃用:2.40 since: 2.26

g_settings_sync

确保所有挂起的操作对于默认后端都已完成。

g_settings_unbind

object 上删除现有对 property 的绑定。

since: 2.26

实例方法

g_settings_apply

应用对设置所做的任何更改。除非 settings 在 ‘delay-apply’ 模式下;参见 g_settings_delay(),否则此函数不做任何操作。在正常情况下设置总是立即应用。

g_settings_bind

settings 对象中的 keyobject 的属性 property 之间创建绑定。

since: 2.26

g_settings_bind_with_mapping

settings 对象中的 keyobject 的属性 property 之间创建绑定。

since: 2.26

g_settings_bind_with_mapping_closures

g_settings_bind_with_mapping() 的一个版本,使用闭包而不是回调以便于在其它语言中绑定。

since: 2.82

g_settings_bind_writable

settings 对象中的 key 的可写性和 object 的属性 property 之间创建绑定。属性必须是布尔型;小部件的“敏感”或“可见”属性是最可能的目标。

since: 2.26

g_settings_create_action

创建与给定 GSettings 键相对应的 GAction

since: 2.32

g_settings_delay

GSettings 对象更改为 ‘delay-apply’ 模式。在此模式下,对 settings 的更改不会立即传播到后端,而是保留在本地,直到调用 g_settings_apply()

since: 2.26

g_settings_get

获取存储在 settingskey 中的值。

since: 2.26

g_settings_get_boolean

获取存储在 settingskey 中的值。

since: 2.26

g_settings_get_child

创建一个子设置对象,其基本路径为 base-path/name,其中base-pathsettings的基本路径。

since: 2.26

g_settings_get_default_value

获取键的“默认值”。

since: 2.40

g_settings_get_double

获取存储在 settingskey 中的值。

since: 2.26

g_settings_get_enum

获取存储在 settings 中的 key 的值,并将其转换为它所代表的枚举值。

since: 2.26

g_settings_get_flags

获取存储在 settingskey 的值,并将其转换为它所代表的标志值。

since: 2.26

g_settings_get_has_unapplied

返回 GSettings 对象是否有任何未应用更改。这只有在它是 'delayed-apply' 模式时才会发生。

since: 2.26

g_settings_get_int

获取存储在 settingskey 中的值。

since: 2.26

g_settings_get_int64

获取存储在 settingskey 中的值。

since: 2.50

g_settings_get_mapped

获取存储在 settingskey 的值,受应用级验证/映射。

g_settings_get_range

查询键的范围。

已弃用:2.40 since: 2.28

g_settings_get_string

获取存储在 settingskey 中的值。

since: 2.26

g_settings_get_strv

g_settings_get() 的字符串数组的便利变体。

since: 2.26

g_settings_get_uint

获取存储在 settingskey 中的值。

since: 2.30

g_settings_get_uint64

获取存储在 settingskey 中的值。

since: 2.50

g_settings_get_user_value

检查是否存在键的“用户值”。

since: 2.40

g_settings_get_value

获取存储在 settingskey 的值。

since: 2.26

g_settings_is_writable

找出键是否可以写入。

since: 2.26

g_settings_list_children

获取 settings 上的子项列表。

g_settings_list_keys

settings 上检查键的列表。

已弃用: 2.46

g_settings_range_check

检查给定的 value 是否是正确的类型,并且是否在 key 的允许范围内。

已弃用:2.40 since: 2.28

g_settings_reset

key 重置为其默认值。

g_settings_revert

将设置中的所有未应用更改恢复原样。此函数在 settings 在 'delay-apply' 模式下时才执行;请参阅 g_settings_delay()。在正常情况下,设置总是立即应用。

g_settings_set

settings 中的 key 设置为 value

since: 2.26

g_settings_set_boolean

settings 中的 key 设置为 value

since: 2.26

g_settings_set_double

settings 中的 key 设置为 value

since: 2.26

g_settings_set_enum

查找由 value 指定的枚举类型昵称,并将其写入 settings 中的 key

g_settings_set_flags

查找由 value 指定的标志类型昵称,将它们放入字符串数组中,并将数组写入 settings 中的 key

g_settings_set_int

settings 中的 key 设置为 value

since: 2.26

g_settings_set_int64

settings 中的 key 设置为 value

since: 2.50

g_settings_set_string

settings 中的 key 设置为 value

since: 2.26

g_settings_set_strv

settings 中的 key 设置为 value

since: 2.26

g_settings_set_uint

settings 中的 key 设置为 value

since: 2.30

g_settings_set_uint64

settings 中的 key 设置为 value

since: 2.50

g_settings_set_value

settings 中的 key 设置为 value

since: 2.26

GObject 继承的方法(43)

请参见 GObject 了解方法的完整列表。

属性

Gio.Settings:backend

设置存储的上下文名称。

Gio.Settings:delay-apply

如果 GSettings 对象处于 'delay-apply' 模式。有关详细信息,请参阅 g_settings_delay()

since: 2.28

Gio.Settings:has-unapplied

如果此属性为 TRUE,则 GSettings 对象有即将在调用 g_settings_apply() 时应用的未决更改。

Gio.Settings:path

设置存储后端中的路径。

Gio.Settings:schema

描述此 GSettings 对象键类型的模式名称。

已弃用: 2.32

Gio.Settings:schema-id

描述此 GSettings 对象键类型的模式名称。

Gio.Settings:settings-schema

描述此 GSettings 对象键类型的 GSettingsSchema

信号

Gio.Settings::change-event

"change-event" 信号在影响此设置对象的每个更改事件中只触发一次。只有当您对这些更改分组在“changed”信号多次触发之前进行查看感兴趣时,才应该连接到这个信号。对于大多数用例,使用“changed”信号更合适。

Gio.Settings::changed

"changed" 信号在键可能发生变化时触发。您应该调用其中一个 g_settings_get() 调用来检查新的值。

Gio.Settings::writable-change-event

"writable-change-event" 信号在影响此设置对象的每次可写性更改事件中只触发一次。如果您在这个过程中对查看更改分组感兴趣,在将其拆分到“writable-changed”信号的多个触发之前,应该连接到这个信号。对于大多数用例,使用“writable-changed”信号更合适。

Gio.Settings::writable-changed

"writable-changed" 信号在键的可写性可能发生变化时触发。您应该调用 g_settings_is_writable() 以确定新的状态。

GObject 继承的信号 (1)
GObject::notify

在对象的属性通过 g_object_set_property()、g_object_set() 等. 设置值时,会发出 notify 信号。

类结构

struct GioSettingsClass {
  GObjectClass parent_class;
  void (* writable_changed) (
    GSettings* settings,
    const gchar* key
  );
  void (* changed) (
    GSettings* settings,
    const gchar* key
  );
  gboolean (* writable_change_event) (
    GSettings* settings,
    GQuark key
  );
  gboolean (* change_event) (
    GSettings* settings,
    const GQuark* keys,
    gint n_keys
  );
  None padding;
  
}

无描述。

类成员
parent_class: GObjectClass

无描述。

writable_changed: void (* writable_changed) ( GSettings* settings, const gchar* key )

无描述。

changed: void (* changed) ( GSettings* settings, const gchar* key )

无描述。

writable_change_event: gboolean (* writable_change_event) ( GSettings* settings, GQuark key )

无描述。

change_event: gboolean (* change_event) ( GSettings* settings, const GQuark* keys, gint n_keys )

无描述。

padding: None

无描述。