Login
Immutable PageDiscussionInfoAttachments
clear/wm_devel/2013-02-28

MMA

進捗

枠だけドラッグ

ウィンドウを移動、あるいはリサイズする時に、毎回ウィンドウそのものを移動/リサイズしていると毎回ウィンドウの再描画が必要になって重い。確定するまでウィンドウ枠だけ描画すると大分マシになる。twmとかevilwmはこれを実装している。

実現方法

  1. 準備: 描画用のグラフィクスコンテキストを以下のように作成する
    • functionにinvertを指定。これで2回同じものを描画すると消えるようになる
    • subwindow modeにIncludeInferiorsを指定。トップレベルウィンドウの上に描画可能になる

  2. ドラッグ開始時: サーバとマウスポインタをグラブする
    • サーバをグラブすると、自分以外のクライアントからのリクエストと切断要求が処理されなくなる
    • 他のウィンドウが何かすると色々と崩壊するのでこうする
  3. ドラッグ中: マウスポインタの移動に合わせて、ルートウィンドウ上に枠を描画する
    • まず、以前に描いた枠をもう一度描画して消す
    • 新しい枠を描画する
  4. ドラッグ終了: 枠を消してサーバのグラブを解除する。ウィンドウを実際に移動あるいはリサイズする

この方法でいいはず…なのだが、XCBで書いてみたところ、サーバをグラブしたことによって自分に対してもMotionNotifyが届かなくなってしまった(グラブを解除した途端にどさっとまとめてやって来る)。これでは全く意味がない。どうしてこうなった……

ついでに、この方法の根本的な問題: サーバのグラブが不可避

clear/wm_devel/2013-02-28 (last edited 2013-03-05 18:54:52 by clear)