Итак, я делаю расширение для 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. Мне нужно что-то делать, когда в потоке появляется новая строка.