DefaultScreen

カラーマップで黒や白以外の色も指定したいが、まずはDefaultScreenでデフォルトスクリーン番号を取得しにいく。

X11
黒、白以外の色を使う

DefaultRootWindowだと一気にルートウィンドウまで取得してしまったが、こちらはデフォルトスクリーン番号を取得するだけ。

たいていは0
たいていは0

たいていは0である。

Sample/xlib/DefaultScreen/DefaultScreen/src/DefaultScreen at master · bg1bgst333/Sample · GitHub

XSetCloseDownMode

より正しい終了のさせ方としては、XSetCloseDownModeで、Xサーバとの切断で、すべてのリソースを破棄するようにした方がいい。

Manpage of XSetCloseDownMode
X Window System(X11)のプログラムを正常に終了させる方法 - Qiita

XSetCloseDownModeでDestroyAllを指定。

起動して
起動して

起動して、

終了
終了

終了。
見た目変わらないがより安全。

Sample/xlib/XSetCloseDownMode/XSetCloseDownMode/src/XSetCloseDownMode at master · bg1bgst333/Sample · GitHub

XDestroyWindow

これまで、XCloseDisplayでXサーバとのセッションを切断して、そのままプログラム終了という形で書いてきたが、正しいウィンドウの閉じ方、終了の仕方ではないので、XDestroyWindowでウィンドウを閉じる。

Manpage of XDestroyWindow
X Window System(X11)のプログラムを正常に終了させる方法 - Qiita

ClientMessageで、WM_DELETE_WINDOWなら、XDestroyWindowでウィンドウを破棄。
そうすると、

DestroyNotifyに来るので、XCloseDisplayとプログラムの終了である"return 0;"を通る。
これが正しいプログラム終了と。

で、これで実際に動かしてみたら、DestroyNotifyに来ない。

clear/wm_devel/2011-08-16 - 電気通信大学MMA

どうもStructureNotifyMaskが必要みたいで、

こうすると、

表示しているがここでウィンドウを閉じる
表示しているがここでウィンドウを閉じる

この状態から閉じると、

DestroyNotifyに来ている
DestroyNotifyに来ている

DestroyNotifyに来ているのがわかる。

Sample/xlib/XDestroyWindow/XDestroyWindow/src/XDestroyWindow at master · bg1bgst333/Sample · GitHub

XInternAtom

XInternAtomで、アトムを取得したり、生成できる

Manpage of XInternAtom
Xlib ウィンドウの閉じるボタンが押された時の処理を書く

WM_DELETE_WINDOWプロパティと同様に、WM_PROTOCOLSプロパティもアトムを取得できる。
(ただ、XWindowのこのプロパティの構造というか概念が感覚的にわかりにくい。Windowsのウィンドウメッセージのような並列した概念ではない模様。)

このように取得。
XSetWMProtocolsのところとは全く関係なくアトムはアトムとして取得できる。
で、これをどこに使うかというと、

event.xclient.message_typeの判定で使える。

表示
表示

表示して閉じると、

WM_PROTOCOLS!
WM_PROTOCOLS!

確かに、event.xclient.message_typeはWM_PROTOCOLS。
ただ、WM_DELETE_WINDOWも、WM_PROTOCOLSも、どこにあるのか探したけど見つからなかった。
(他にどんなプロパティがあるかがあまり情報が無い。)
いずれまた今度探してみよう。
また、第3引数をTrueにして生成もできるらしいが、生成する場面がわからないので、これもまた今回は見送り・・・。

Sample/xlib/XInternAtom/XInternAtom/src/XInternAtom at master · bg1bgst333/Sample · GitHub

XSetWMProtocols

閉じるボタンでウィンドウを閉じる処理は、ウィンドウマネージャとのやり取りでもちょっと特殊で、WM_PROTOCOLSプロパティというものに、条件となるイベントのプロパティWM_DELETE_WINDOWを設定する必要がある。

Manpage of XSetWMProtocols
ウィンドウマネージャとのやりとり

まず、XInternAtomという関数で、WM_DELETE_WINDOWのアトムを取得する。
アトムは、WindowsAPIのRegisterClassでも出てきたが、識別子(ID)だと思えばいい。
(Falseって型が用意されてるのか。)
これをXSetWMProtocolsにセットする。
こうすると、

閉じるボタンを押すと、ClientMessageというイベントが飛んでくる。
event.xclient.data.l[0]がWM_DELETE_WINDOWのアトムなら、
"WM_DELETE_WINDOW!!"をターミナルに出力しつつ、終了するようにしている。

右上の閉じるボタンを押すと
右上の閉じるボタンを押すと

右上の閉じるボタンを押すと、

終了する。
終了する。

"WM_DELETE_WINDOW!!"を出力して終了する。

Sample/xlib/XSetWMProtocols/XSetWMProtocols/src/XSetWMProtocols at master · bg1bgst333/Sample · GitHub

XSetWMProperties

ウィンドウにタイトルを付けるにはウィンドウマネージャとやりとりしないといけない。
XSetWMPropertiesでタイトルのテキストプロパティをセットする。

Manpage of XSetWMProperties
ウィンドウマネージャとのやりとり

これらを用意して、

このようにセット。

タイトル"ABCDE"
タイトル"ABCDE"

タイトルは"ABCDE"になったけど、

不明なプログラム
不明なプログラム

タスクバーというかここは変わらないのか・・・。

Sample/xlib/XSetWMProperties/XSetWMProperties/src/XSetWMProperties at master · bg1bgst333/Sample · GitHub

XSelectInput

XSelectInputでイベントマスクをセットする時に"|"を使うと、複数のイベントを拾える。

X11

今回は、マウスを離した時のイベントも拾う。

ButtonPressMaskに加えて、ButtonReleaseMaskも指定。
ButtonReleaseの時は、"ButtonRelease!!"と出力するだけ。

最初はこの状態
最初はこの状態

最初はこの状態で、

押しっぱなし
押しっぱなし

押しっぱなしだと、位置が出るだけだが、離すと、

離すとこうなる
離すとこうなる

"ButtonRelease!!"と出る。

最後
最後

最後の10回目だけ、押したときに終了してしまうので、離したときの出力は出ないけど。

Sample/xlib/XSelectInput/XSelectInput/src/XSelectInput at master · bg1bgst333/Sample · GitHub