所以我正在制作一个 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 更改时获得一些回调。每当流中有新行时,我都需要能够做某事。