【发布时间】:2012-03-07 17:35:28
【问题描述】:
所以我正在制作一个 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 更改时获得一些回调。每当流中有新行时,我都需要能够做某事。
【问题讨论】:
标签: javascript gnome-3 gnome-shell