Gnome shell扩展:来自GLib.IOChannel的stdout

时间:2012-03-07 17:35:28

标签: javascript gnome-3 gnome-shell

所以我正在进行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改变时,它仍然没有给我任何方法来获得一些回调。只要流中有新行,我就需要做一些事情。

1 个答案:

答案 0 :(得分:2)

Gnome Shell扩展通常用JavaScript编写。他们使用JavaScript绑定到像Cib这样用C语言编写的库。还有对这些库的Vala绑定,这就是您正在查看的文档。 Here是JS绑定的文档,非官方的。

StringBuilder是一种Vala语言功能,与JS中的GLib.String对应。

你怎么知道add_watch()不起作用?您期望什么,它做什么呢?