だから私は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] は、プロセスの stout のファイル記述子です。(パイプと関係があります。パイプ全体についてはよくわかりません。)
とにかく、私の問題は、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 が変更されるたびにコールバックを取得する方法はまだありません。ストリームに新しい行があるときはいつでも、何かを実行できる必要があります。