go言語とx11

かいらぼ勉強会で、go言語でx11が使えると言うことだったので試してみた。まぁ、このへんの内容は、いろんなブログで書かれているから、そっちを参照したほうが良いと思う。

go言語がインストールされている環境なら、$GOROOT/src/pkg/exp 以下の draw と draw/x11 で以下のコマンドで使えるようになる。

$ cd $GOROOT/src/pkg/exp/draw
$ make
$ make install
$ cd x11
$ make
$ make install

基本的には、使用する ext/draw/x11 を import (描画する場合は ext/draw も import)して利用する。 x11.NewWindow() でウィンドウが開き、戻り値の1つ目が Window オブジェクト(実際は、 x11/conn.go で定義される構造体)を使ってごにょごにょするらしい。

現時点でできることは、 Image インターフェースの Set(x, y int, c image.Color) を使ったピクセル単位の描画と、マウスやキーボードイベントの処理など。

イベント処理は、 go が適宜呼び出すらしい pumper() で処理される。
マウスは、 draw/event.go で MouseChan () としてインターフェースが用意されている。
実際は x11/conn.go で Windowオブジェクトもどきのバッファを[0:32]読み込み、バッファの最初の1バイトにより、0x02,0x03 キーボードのup/down 、0x04,0x05 マウスボタンのup/down、0x06 マウスの移動、0x0c ウィンドウの expose(再描画が必要だよ〜というイベント)のみ定義されている。

つまり、ドキュメントにあるResizeChan(0x19)やQuitChan(0x11)は使えないっぽい。しかも、keysymは常にint (" ")なので0x20が返ってくる。

まぁ、BUGS
This is a toy library and not ready for production use.
と書かれているそのままの状況ですね。

これを使って、いつものGUIプログラミング入門で Hello, World! するのもありだけど、もう少し使えるようになってからのほうが良いような気がする。