ウィンドウの配置
参照: ICCCM 4.1.5
ConfigureRequest
クライアントはConfigureWindowリクエストによってウィンドウの以下の属性を変更できる。
- (x,y)座標(ルートウィンドウに対する)
- サイズ(枠を含まない)
- 枠の幅
- スタック順序
WMが存在しなければこのリクエストは直ちにXサーバによって処理されるが、WM存在下ではWMにリダイレクトされてConfigureRequestイベントとして届く(Xサーバはリクエストを処理しない)。
- このときWMは要求をどのように扱っても良い(WMがクライアントの要求通りにする保証はない)
- WMはリクエストされた値をウィンドウの初期座標を決定するときと同様に扱う
- ウィンドウのgravityを尊重する
ConfigureRequestが処理され、クライアントの座標やサイズが実際に変化するとクライアントにはConfigureNotifyが送信される。ConfigureRequestがWMにリダイレクトされた場合、WMがどうするかでConfigureNotifyが届くかどうかが変わる。
- 完全に無視した場合: 届かない
- 座標やスタック順序だけを変更した場合: reperenting WMでは届かない
- reparentしていると、クライアントウィンドウの座標系はフレームウィンドウに対するものになる
- ウィンドウの移動はフレームウィンドウの移動によって行われるので、クライアントウィンドウの座標は変化しない
- スタック順序についても同じ
WMは、クライアントウィンドウの移動をクライアントに通知するために人工の(synthetic)ConfigureNotifyを作ってクライアントに送る
- ウィンドウサイズ、あるいはウィンドウ枠の幅を変更した場合: 届く
- リサイズの場合はフレームと共にクライアントウィンドウをリサイズする必要がある
WMによってクライアントウィンドウに変更されるので、ConfigureNotifyが届く
- ウィンドウ枠についても同様だが、reparenting WMは通常クライアントウィンドウの枠を取り去ってから自分で枠をつけるのであまり関係ない
WMがConfigureNotifyを作って送るとき、ウィンドウの座標はルートウィンドウの座標系での値でなければならない(フレーム内でのクライアントウィンドウの座標をルートウィンドウ内での座標に変換する必要がある)。