21世紀になったのにXlibを学ぼう!!
というネタをながながとやろうと思ったけど、なんか眠いしあんまり思い付かないのでやめとく。
まず、昨日は、SubstructureRedirectMaskとResizeRedirectMaskができるのは云々と書いたけど、あんまり正確じゃない。
正確には、SubstructureRedirectMaskとResizeRedirectMaskをマスクできるのは、ひとつのウィンドウにつき、ひとつまで、ということのようだ。
だから、まあ、どっかのウィンドウが勝手に自分の子ウィンドウのResizeRedirectをマスクしてもよい。
それが訂正。んで、このSubstructureRedirectとかResizeRedirectは何者なのか、ということである。
昨日ようやく納品が一区切りついて、今日は気が抜けていたので、まあ、ごにょごにょそこらへんを調べたり…してないですよ。
まず、理解しとかないといけないのが、XMapWindow、XConfigureWindow、XResizeWindowの挙動。
http://xjman.dsl.gr.jp/X11R6/X11/CH03.htmlによると、
指定したウィンドウの override-redirect 属性が False False で、かつその親ウィンドウで他のクライアントが SubstructureRedirectMaskを選択している場合には、X サーバは MapRequest関数 XMapWindowはウィンドウをマップしない。 それ以外の場合には、ウィンドウはマップされ、X サーバは MapNotifyイベントを生成する。
と、書いてある。
ちょっとわからなかったけど、色々と挙動を見るかぎり、こういうことだと思う。
- ウィンドウのoverride-redirectフラグがTrueだったら、XMapWindow等は、普通の動きをする。
- 親ウィンドウがSubstructureRedirectをマスクしてなくても、XMapWindow等は、普通に動く。
- 親ウィンドウがSubstructureRedirectをマスクしてると、XMapWindowはマップ処理を行なわないで、親ウィンドウにXMapRequestイベントを投げる
つまり、簡単に言うと、親ウィンドウは、子ウィンドウが許可してた場合(=override_flagがFalseの場合)、MapやらResizeの処理を奪ってしまえる、ということ。
なかなか、それなりに面白い動きだと思うのだけど。
そんで、ここで、ルートウィンドウの直接の子供達のMapやResize、Configureを奪ってしまうXクライアントが、ウィンドウマネージャーである、というわけだ。多分。
おとといのプログラムは、新しいウィンドウが全く表示されないようになっていたはずだ。
あれは、「XMapWindowしてウィンドウを表示したいんだけど、MapWindow奪われちゃったよ。しかも、ウィンドウマネージャーなんもしてくれないよ!なんてこった!これだからソフトウェア業界のマネーja…」と、いった感じになっていたというわけだ。(幸いにして、僕はそういう経験は無いが。と、一応書いておく)
おとといよりは動くようにした。
futonwm
と、いうわけで、刮目せよ!X 2.0の時代がやってきたのだ!!
before(evilwm)
↓
after!!(futonwm)
ヒント:borderが黄色くない。geometryは各自指定。デバッグログが出てる。