所以我在做一個Gnome Shell擴展。我希望能夠運行一些命令。 (該命令實際上是「synclient -m 100」,但這是題外話)Gnome shell擴展:來自GLib.IOChannel的stdout
所以,我做了什麼至今
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發生變化。只要流中有新行,我就需要做些事情。
該鏈接幫助很大。 'add_watch()'不起作用,因爲它說它是未定義的,但也許我做錯了。 無論如何,我做了一個稍微不同的方式,請參閱編輯我的問題。 – Jay 2012-03-08 22:23:36
你應該爲此打開一個新的問題。 – ptomato 2012-03-09 10:23:05