exp/drawパッケージでウインドウを出そう

今日もGo言語のお話。
試験中パッケージですが、exp/drawパッケージを使えばX-windowシステムでGUIなことができますよ。

今日はそんなお話です。


そういうわけで今日の話題の中心は「exp/draw」パッケージです。

気づいたら仕様が変わってたので、ついでに書こうかなと。

マウスがあったところに点を書きながら、おきたイベントをコンソールに垂れ流すプログラム。

package main

import (
	"exp/draw"
	"exp/draw/x11"
	"image"
	"fmt"
	)

func main() {
	//create and get the window
	win,err := x11.NewWindow()
	if err != nil {
		fmt.Printf("error.\n")
		return
	}

	//get image from Window
	img := win.Screen()


	fmt.Printf("%d, %d\n", img.Bounds().Size().X, img.Bounds().Size().Y)

	for {
		//when event is occored, it can pull EventChan()
		evnt := <-win.EventChan()
		if mouse,ok := evnt.(draw.MouseEvent); ok == true {
			//if event is mousemoving(with type-assersion)
			fmt.Printf("mouse : (%d, %d) : %d\n", mouse.Loc.X, mouse.Loc.Y, mouse.Buttons)
			if mouse.Buttons == 1 {
				img.Set(mouse.Loc.X, mouse.Loc.Y , image.White)
				win.FlushImage()
			}

		} else if key,ok := evnt.(draw.KeyEvent); ok == true {
			//if event is keypushing
			fmt.Printf("key   : %d\n",key.Key)
			if key.Key == -101 {
				win.Close()
				break
			}
		} else if errev,ok := evnt.(draw.ErrEvent); ok == true{
			fmt.Printf("error : %s",errev.Err.String())
		} else if _,ok := evnt.(draw.ConfigEvent); ok == true {
			fmt.Printf("Config events\n")
		} else {
			fmt.Printf("unknown event. %T\n",evnt)
			return
		}
	
	}
	return

}

簡単に言えば、

  • ウインドウを作る。
  • クリックしてる間にマウスが移動すればソコに点を打つ
  • 'e'キーをクリックされたら終了(なんでqにしなかったのか当時の俺に聞きたい)
  • イベントをとにかくコンソールへ垂れ流す

って動作をします。


draw.Windowがウインドウをあらわす構造体で、これはexp/draw/x11パッケージのNewWindow()で作れます。


イベントの発生はWindowが持ってるEventChan()メソッドのチャネルで知らせられます。
これは結構分かりやすくて、まぁやってることはソースのとおりです。
EventChan()はinterface{}型のチャネルなんで何が帰ってくるかわからんです。そういうわけでこういう風にifをつなげるか型switchで調べないといけないです。
あと、バッテンボタンでウインドウを消すと何故か型のチャネルが帰ってきて、すっげー気持ち悪いです。ここら辺はちゃんと調べてないので解らない。


今日のところはそんな感じです。



そういうわけで、Windowでjpegを表示するの巻へ続きます
(次回予告)

keyword:Go言語 golang draw