Расширения оболочки Gnome: стандартный вывод из GLib.IOChannel - PullRequest
1 голос
/ 07 марта 2012

Итак, я делаю расширение для Gnome Shell. И я хочу иметь возможность выполнить какую-то команду. (На самом деле команда "synclient -m 100", но это не по теме)

Итак, что я сделал до сих пор, это

s=GLib.spawn_async_with_pipes(null, ["synclient","-m","100"], null, GLib.SpawnFlags.SEARCH_PATH,null)
c=GLib.IOChannel.unix_new(s[3])

Первая строка порождает мой процесс. Это определенно работает.

s [3] - дескриптор файла для полного процесса. (Это как-то связано с трубами. Не совсем уверен насчет всей трубы).

Во всяком случае, моя проблема в том, что я не могу ничего прочитать из вывода synclient.

Это - это то, что я использую для справки, но кажется, что не все функции работают. Например, я хочу использовать add_watch, но это не работает с расширениями gnome.

Я пытался использовать несколько функций или функций чтения, в частности read_line_string, но у них всех есть проблемы. Для read_line_string кажется, что все должно работать, за исключением того, что я не могу понять, как создать объект StringBuilder для передачи в качестве аргумента.

Итак, кто-нибудь знает, как получить вывод команды?

Редактировать: также я не совсем понимаю, какой язык используют расширения. Я думаю, что это javascript, но документы, которые я использую, похоже, заставляют меня думать о Vala, что бы это ни было (я предполагаю вариант java?).

Редактировать 2:

Итак, теперь у меня есть

let [res, pid, in_fd, out_fd, err_fd] = 
  GLib.spawn_async_with_pipes(
    null, ["synclient","-m","100"], null, GLib.SpawnFlags.SEARCH_PATH, null);
out_reader = new Gio.DataInputStream({ base_stream: new Gio.UnixInputStream({fd: out_fd}) });

И прочитать строку:

let [out, size] = out_reader.read_line(null);

Это дает мне вывод команды, но все равно не дает мне никакого способа получить обратный вызов при изменении DataInputStream. Мне нужно что-то делать, когда в потоке появляется новая строка.

1 Ответ

2 голосов
/ 08 марта 2012

Расширения Gnome Shell обычно написаны на JavaScript. Они используют привязки JavaScript к библиотекам, таким как GLib, которые написаны на C. Есть также привязки Vala к этим библиотекам, и именно эту документацию вы просматриваете. Здесь - документация для привязок JS, пока неофициальная.

StringBuilder - это особенность языка Vala, которая соответствует GLib.String в JS.

Откуда вы знаете, add_watch() не работает? Что вы ожидаете и что он делает вместо этого?

...