2012-03-07 3 views
1

그래서 Gnome 셸 확장을 만들고 있습니다. 그리고 나는 어떤 명령을 실행할 수 있기를 원한다. 지금까지 수행 첫 번째 줄 내 프로세스를 생성Gnome 셸 확장 : 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]) 

인 것을 그래서

, (이 명령은 실제로 "synclient의 -m 100"이지만, 그 주제 꺼짐). 확실히 일하고 있습니다.

[3]은 프로세스의 stout에 대한 파일 설명자입니다. (파이프와 관련이 있습니다. 파이프 전체에 대해서는 잘 모르겠습니다.)

어쨌든 내 문제는 synclient의 출력에서 ​​아무것도 읽을 수없는 것입니다.

This 내가 참조 용으로 사용하지만 모든 기능이 작동하지 않는 것 같습니다. 예를 들어, add_watch를 사용하고 싶지만, 그놈은 gnome 확장과 함께 apperently 작동하지 않습니다.

나는 묶음을 사용하거나 함수와 특히 read_line_string을 사용해 보았지만 모두 문제가 있습니다. read_line_string 들어, 그것을 제외한 모든 작동해야합니다 StringBuilder 개체를 인수로 전달하는 방법을 알아낼 수없는 것 같습니다.

그래서 누구나 명령의 출력을 얻는 방법을 알고 있습니까?

편집 : 또한 확장 프로그램에서 사용하는 언어에 대해 혼란스러워합니다. 나는 그것이 자바 스크립트라고 생각하지만, 내가 사용하고있는 문서들은 Vala를 생각하게 만드는 것처럼 보인다. (나는 자바의 변형을 추측하고 있는가?).

편집 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 셸 확장은 JavaScript로 작성됩니다. 그들은 C로 작성된 GLib와 같은 라이브러리에 JavaScript 바인딩을 사용합니다. 또한 해당 라이브러리에 Vala 바인딩이 있으며, 이는 사용자가보고있는 문서입니다. Here은 비공식 JS 바인딩의 설명서입니다.

StringBuilder은 JS의 GLib.String에 해당하는 발라 언어 기능입니다.

add_watch()이 (가) 어떻게 작동하지 않습니까? 당신은 무엇을 기대하며, 그 대신에 무엇을합니까?

+0

그 링크는 많은 도움이됩니다. 'add_watch()'는 그것이 정의되지 않았다고 말하기 때문에 작동하지 않습니다.하지만 잘못했을 수도 있습니다. 어쨌든 나는 약간 다른 방식으로, 내 질문에 편집을 참조하십시오. – Jay

+0

아마도 새로운 질문을 열어야합니다. – ptomato