所以我正在进行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的输出中读取任何内容。
我正在使用This作为参考,但似乎并非所有功能都有效。例如,我想使用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改变时,它仍然没有给我任何方法来获得一些回调。只要流中有新行,我就需要做一些事情。
答案 0 :(得分:2)
Gnome Shell扩展通常用JavaScript编写。他们使用JavaScript绑定到像Cib这样用C语言编写的库。还有对这些库的Vala绑定,这就是您正在查看的文档。 Here是JS绑定的文档,非官方的。
StringBuilder
是一种Vala语言功能,与JS中的GLib.String
对应。
你怎么知道add_watch()
不起作用?您期望什么,它做什么呢?