Как сделать запрос расширения Gnome Shell на изменения

Я боролся с ужасной документацией Gnome API и придумал это расширение:

const St = imports.gi.St;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const GLib = imports.gi.GLib;

let label;

function init() {
    label = new St.Bin({ style_class: 'panel-label' });

    let stuff = GLib.spawn_command_line_sync("cat /home/user/temp/hello")[1].toString();
    let text = new St.Label({ text: stuff });

    label.set_child(text);
}

function enable() {
    Main.panel._rightBox.insert_child_at_index(label, 0);
}

function disable() {
    Main.panel._rightBox.remove_child(label);
}

Это должно прочитать все, что находится в файле hello, и отобразить его на верхней панели. Однако, если я изменю содержимое файла hello, мне придется перезапустить Gnome, чтобы отобразить этот новый контент. Теперь, конечно, есть способ сделать это динамически, но я просто не смог ничего найти в документации. Сообщение на панели в основном всегда должно отражать все, что находится в файле. Любые идеи, как это сделать?


person mart1n    schedule 26.09.2013    source источник


Ответы (2)


Вам нужно получить дескриптор Gio.File для вашего файла hello, а затем следить за этим:

let helloFile = Gio.File.new_for_path('/home/user/temp/hello');
let monitor = helloFile.monitor(Gio.FileMonitorFlags.NONE, null);
monitor.connect('changed', function (file, otherFile, eventType) {
    // change your UI here
});
person ptomato    schedule 28.09.2013
comment
Это круто! Хотелось бы, чтобы этот материал был где-то четко задокументирован :( Еще вопрос: как бы вы отслеживали вывод команды? Допустим, я хочу запустить ping и отобразить время каждого пакета в верхней панели? Спасибо за помощь! - person mart1n; 30.09.2013
comment
Это само по себе стоит целого вопроса и ответа, но этот код C может помочь вам начать: github.com/ptomato/gnome-inform7/blob/master/src/spawn.c#L215 Говоря о коде C, к сожалению, лучшей альтернативой надлежащей документации GJS является прочтите C API: developer.gnome.org/gio/stable/< /а> - person ptomato; 01.10.2013

Это сработало для меня. Он будет обновлять значение метки каждые 30 секунд.

  • Добавьте следующий импорт

    const Mainloop = imports.mainloop;

  • В вашем методе инициализации

    Mainloop.timeout_add(30000, function () { 
     let stuff = GLib.spawn_command_line_sync("your_command")[1].toString();
     let label = new St.Label({ text: stuff });
     button.set_child(label);return true});
    
person martinchin2289    schedule 15.02.2016