ログイン
編集不可のページディスカッション情報添付ファイル
clear/wm_devel/2013-02-11

MMA

ウィンドウの配置

参照: ICCCM 4.1.5

ConfigureRequest

雑多なメモ

クライアントはConfigureWindowリクエストによってウィンドウの以下の属性を変更できる。

WMが存在しなければこのリクエストは直ちにXサーバによって処理されるが、WM存在下ではWMにリダイレクトされてConfigureRequestイベントとして届く(Xサーバはリクエストを処理しない)。

ConfigureRequestが処理され、クライアントの座標やサイズが実際に変化するとクライアントにはConfigureNotifyが送信される。ConfigureRequestがWMにリダイレクトされた場合、WMがどうするかでConfigureNotifyが届くかどうかが変わる。

WMがConfigureNotifyを作って送るとき、ウィンドウの座標はルートウィンドウの座標系での値でなければならない(フレーム内でのクライアントウィンドウの座標をルートウィンドウ内での座標に変換する必要がある)。

以下、注意点

で、結局どうすれば良いのか

  1. ConfigureRequestを投げてきたウィンドウがWMの管理下にあるか調べる

    • 管理していないウィンドウなら、リクエストしてきたとおりにConfigureWindowしておしまい

    • これをやらないと、MapRequestしてくる前に自前でウィンドウを設定するクライアントが正常に動作しない

      • 例えばxtermは初め1x1+0+0でウィンドウを作り、適切な位置、サイズにConfigureしてからMapする
  2. リクエストに従ってウィンドウのパラメータを変更する
    • リクエストをどう扱うかはWMの自由(ICCCMには、WMがリクエストの通りにする保証はないと書かれている)
    • gravityに基づいて座標の調整を行う
      • 計算の際、ウィンドウ枠幅はクライアントがリクエストしてきた値を用いる
  3. ConfigureWindowリクエストを発行してウィンドウに変更を加える

    • reparentしている場合、フレームウィンドウに対して変更を加えることになる
    • reparentしていてかつリサイズを行った場合は、クライアントウィンドウもリサイズする
  4. まったく変更を行わなかった場合、またはリサイズを行わずに移動だけを行った場合は、ConfigureNotifyイベントをクライアントウィンドウに送る

    • クライアントウィンドウに座標(ルートウィンドウに対する)とサイズを通知するため
    • リサイズした場合はXサーバから真のConfigureNotifyが送られる

clear/wm_devel/2013-02-11 (最終更新日時 2013-02-25 21:09:39 更新者 clear)