2012-03-07 55 views
1

所以我在做一個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發生變化。只要流中有新行,我就需要做些事情。

回答

2

Gnome Shell擴展通常用JavaScript編寫。他們使用JavaScript綁定到類似GLib的庫,這些庫用C語言編寫。還有對這些庫的Vala綁定,這就是您正在查看的文檔。 Here是非官方的JS綁定文檔。

StringBuilder是一個Vala語言功能,對應於JS中的GLib.String

你怎麼知道add_watch()不工作?你期望什麼?它是做什麼的?

+0

該鏈接幫助很大。 'add_watch()'不起作用,因爲它說它是未定義的,但也許我做錯了。 無論如何,我做了一個稍微不同的方式,請參閱編輯我的問題。 – Jay 2012-03-08 22:23:36

+0

你應該爲此打開一個新的問題。 – ptomato 2012-03-09 10:23:05