1

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

4

1 回答 1

2

Gnome Shell 扩展通常是用 JavaScript 编写的。他们使用 JavaScript 绑定到用 C 编写的 GLib 等库。这些库也有 Vala 绑定,这就是您正在查看的文档。是 JS 绑定的文档,尚未正式发布。

StringBuilderGLib.String是JS中对应的 Vala 语言特性。

你怎么知道add_watch()行不通?你期望什么,它会做什么?

于 2012-03-08T09:49:57.243 回答