Невозможно изменить запись dconf с помощью GSettings

В настоящее время я создаю простое приложение на Gjs, которое должно изменить фоновое изображение моей оболочки gnome. . Решение о том, как это можно сделать с помощью gsettings-инструмента, можно найти здесь. .

Поскольку я хочу создать настольное приложение на его основе, я хочу изменить ключ org.gnome.desktop.background.picture-uri с помощью Gio GSettings-класс. Но использование метода set_X() не меняет значение ключа.

Это мой код для изменения значения gsettings:

var gio = imports.gi.Gio;

// Get the GSettings-object for the background-schema:
var background = new gio.Settings({schema: "org.gnome.desktop.background"});

// Read the current Background-Image:
print( "Current Background-Image: "+background.get_string("picture-uri") );

if (background.is_writable("picture-uri")){
    // Set a new Background-Image (should show up immediately):
    if (background.set_string("picture-uri", "file:///path/to/some/pic.jpg")){
        print("Success!");
    }
    else throw "Couldn't set the key!";
} else throw "The key is not writable";

Чтение значения работает должным образом, метод is_writable() возвращает true, а метод set_string() также возвращает true.

Я проверил, что не нахожусь в режиме «отложенного применения», а ключ имеет GVariantType строки, поэтому метод set_string() должен работать.

Использование обычного инструмента командной строки gsettings (как описано в связанном посте) работает просто отлично.

Я не могу понять, в чем проблема, есть ли место, где я могу посмотреть журналы или что-то в этом роде?


person Lukas Knuth    schedule 02.04.2012    source источник


Ответы (1)


Не получив здесь никаких ответов, я задал тот же вопрос на gjs- список рассылки.

Оказалось, что записи в dconf еще не были на диске, когда мой скрипт вышел, поэтому они никогда не применялись.

Решение состояло в том, чтобы вызвать функцию g_settings_sync() (JsDoc ) сразу после функции set_string(), чтобы гарантировать завершение всех операций записи.

if (background.set_string("picture-uri", "file:///path/to/some/pic.jpg")){
    gio.Settings.sync()
    print("Success!");
}

Спасибо Йохану Далину и его ответу.

person Lukas Knuth    schedule 03.04.2012
comment
Я ломал голову над этой проблемой со вчерашнего дня и так рад, что наконец нашел решение. Спасибо! - person Serrano; 02.09.2013