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は各自指定。デバッグログが出てる。