2013-09-26 3 views
2

Я боролся с документацией ужасающую Gnome API и пришел с этим расширением:Как сделать Gnome Shell Extension запрос для изменения

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 для этого нового контента, который будет показан. Теперь, конечно, есть способ сделать это динамически, но я просто ничего не нашел в документации. Сообщение в панели должно в основном всегда отражать все, что есть в файле. Есть идеи, как это сделать?

ответ

4

Вы хотите получить Gio.File дескриптор для файла hello, а затем monitor его:

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 
}); 
+0

Это здорово! Я хочу, чтобы этот материал был где-то документально зафиксирован: Еще один вопрос: как бы вы отслеживали вывод команды? Предположим, я хочу запустить ping и отобразить время каждого пакета в верхней панели? Спасибо за вашу помощь! – mart1n

+0

Это стоит целый вопрос и ответ сам по себе, но этот код C может начать вас: https://github.com/ptomato/gnome-inform7/blob/master/src/spawn.c#L215 Говоря о коде C , к сожалению, ваша лучшая альтернатива надлежащей документации GJS - прочитать C API: https://developer.gnome.org/gio/stable/GFileMonitor.html#GFileMonitor-changed – ptomato

0

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

  • Добавить импортируют

    константный 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}); 
    

 Смежные вопросы

  • Нет связанных вопросов^_^