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