【问题标题】:How to get range of a GLib.Settings如何获取 GLib.Settings 的范围
【发布时间】:2020-01-22 10:11:49
【问题描述】:

通常我使用下面的代码从 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'

当搜索 thr valadoc.org 时,GLib.Settings.get_range 已被弃用。它说需要改用GLib.SettingsSchemaKey.get_range

但是GLib.SettingsSchemaKeyGLib.SettingsSchemaGLib.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打交道时也遇到过类似的事情。 :(

【问题讨论】:

    标签: gtk3 vala


    【解决方案1】:

    您可以从SettingsSchema 获得SettingsSchemaKey,从SettingsSchemaSource 获得SettingsSchema

    要获得SettingsSchemaSource,您可以致电SettingsSchemaSource.get_default ()SettingsSchemaSource.from_directory ()

    get_default () 是一种静态方法,可为您获取系统架构源代码。

    from_directory () 是一个构造函数,它将从您必须指定的文件系统目录中获取模式源。

    【讨论】:

    • 当然,我错过了SettingsSchemaSource.get_default
    猜你喜欢
    • 2017-01-22
    • 2019-11-11
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多