Javascript Gnome外壳扩展:GLib.IOChannel的标准输出
所以我在做一个Gnome外壳扩展。我希望能够运行一些命令。(该命令实际上是“synclient-m100”,但这与主题无关) 到目前为止,我所做的是Javascript Gnome外壳扩展:GLib.IOChannel的标准输出,javascript,gnome-3,gnome-shell,Javascript,Gnome 3,Gnome Shell,所以我在做一个Gnome外壳扩展。我希望能够运行一些命令。(该命令实际上是“synclient-m100”,但这与主题无关) 到目前为止,我所做的是 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]是进程的健壮性的文件描述符。(这与管
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扩展
我尝试过使用bunch或read函数,特别是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,它仍然无法让我获得一些回调。只要流中有新行,我就需要能够做一些事情。Gnome外壳扩展通常是用JavaScript编写的。它们使用JavaScript绑定到用C编写的GLib之类的库。这些库也有Vala绑定,这就是您正在查看的文档。是JS绑定的文档,目前还不是官方的
StringBuilder
是一种Vala语言功能,对应于JS中的GLib.String
你怎么知道
add_watch()
不起作用?你期望得到什么?它能做什么?这个链接帮助很大add_watch()
不起作用,因为它说它未定义,但可能是我做错了。无论如何,我用了一种稍微不同的方式,请看我问题的编辑。你可能应该为此打开一个新问题。