Как получить диапазон GLib.Settings - PullRequest
3 голосов
/ 22 января 2020

Обычно я использую приведенный ниже код для получения строки из 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 valado c .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. (

1 Ответ

3 голосов
/ 23 января 2020

Вы можете получить SettingsSchemaKey от SettingsSchema и SettingsSchema от SettingsSchemaSource.

Чтобы получить SettingsSchemaSource, вы можете либо позвонить SettingsSchemaSource.get_default () или SettingsSchemaSource.from_directory () .

get_default () - это метод stati c, который предоставит вам источник схемы системы.

from_directory () - конструктор это даст вам источник схемы из директории файловой системы, которую вы должны указать.

...