【问题标题】:Gnome shell extensions: stdout from GLib.IOChannelGnome shell 扩展:来自 GLib.IOChannel 的标准输出
【发布时间】: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


    【解决方案1】:

    Gnome Shell 扩展通常是用 JavaScript 编写的。他们使用 JavaScript 绑定到用 C 编写的 GLib 等库。这些库也有 Vala 绑定,这就是您正在查看的文档。 Here 是 JS 绑定的文档,目前还不是官方的。

    StringBuilder 是一种 Vala 语言特性,对应于 JS 中的GLib.String

    你怎么知道add_watch() 不起作用?您期望什么以及它会做什么?

    【讨论】:

    • 那个链接很有帮助。 add_watch() 不起作用,因为它说它是未定义的,但也许我做错了。无论如何,我的做法略有不同,请参阅我的问题的编辑。
    • 你应该为此打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2021-12-24
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多