通常我使用下面的代码从GLib.Settings中获取字符串。
var ss = new GLib.Settings ("org.gnome.system.proxy");
string sm = ss.get_string ("mode");
现在我要在bash中获得这样的范围。
⭕ gsettings range org.gnome.system.proxy mode
enum
'none'
'manual'
'auto'
[在valadoc.org上搜索时,GLib.Settings.get_range
已弃用。它说需要使用GLib.SettingsSchemaKey.get_range
代替。
但是GLib.SettingsSchemaKey
GLib.SettingsSchema
GLib.SettingsSchemaSource
弄乱了我。
似乎我可以使用SettingsSchema.get_key (string name).get_range ()
来获取范围。但是如何获得此SettingsSchema
?
[在Mühlenhoff的帮助下,我写了一个示例代码,没有成功。
void check(){
SettingsSchemaSource sss = GLib.SettingsSchemaSource.get_default ();
SettingsSchema schema = sss.lookup ("org.gnome.system.proxy", true); // bool recursive
if (schema == null) {print ("ID not found."); return;}
if(schema.has_key ("mode")){
SettingsSchemaKey ssk = schema.get_key ("mode");
Variant v = ssk.get_range();
size_t length = 0;
print("name: %s\n", ssk.get_name()); //mode
print ("range: '%s', %s\n", v.get_string (out length), length.to_string());
// print ("'%s', %"+size_t.FORMAT+"\n", v.get_string (out length), length);
}else{ print("no key found: mode\n"); return;}
GLib.Settings settings = new GLib.Settings.full (schema, null, null);
string greeting = settings.get_string ("mode");
print("current mode: %s\n", greeting);
}
输出:
name: mode
(list-exec:3899): GLib-CRITICAL **: 16:13:08.313: g_variant_get_string: assertion 'g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) || g_variant_is_of_type (value, G_VARIANT_TYPE_OBJECT_PATH) || g_variant_is_of_type (value, G_VARIANT_TYPE_SIGNATURE)' failed
range: '(null)', 0
current mode: auto
由于这个不推荐使用,我们需要自己分析和处理非常复杂的数据结构(GVariant)。这会浪费很多代码。
我在处理libsvg
时遇到了类似的事情。 :(
您可以从SettingsSchemaKey
获得SettingsSchema
,并从SettingsSchema
获得SettingsSchemaSource
。
要获取SettingsSchemaSource
,您可以调用SettingsSchemaSource.get_default ()
或SettingsSchemaSource.from_directory ()
。
get_default ()是一个静态方法,它将为您提供系统架构源。
from_directory ()是一个构造函数,它将从您必须指定的文件系统目录中获取模式源。