座標系について
- 各ウィンドウはそれぞれの座標系を持っている
- 原点は左上角、ウィンドウ枠の内側
- ウィンドウの座標はそのウィンドウの左上角の点の座標で表す
- こちらは枠の外側の角
- 子ウィンドウの座標は親ウィンドウの座標系における座標
- トップレベルウィンドウの座標は、ルートウィンドウの座標系においてのもの
- reparentすると座標系が変わる
ConfigureRequestの希望座標はルートウィンドウの座標系でやってくる
ConfigureNotifyを送るときはルートウィンドウの座標系を用いる
- ウィンドウの幅と高さに枠の幅は含まない
- リサイズ時は注意する
- XinearmaやRandR使用時はルートウィンドウが複数の物理モニタにまたがる可能性がある
- 画面上の原点とルートウィンドウの原点は必ずしも一致しない
タイトルバー再考
- いるのか
- ウィンドウ名を表示するだけならバー/パネルの類でも可能かつ省スペース
- バーをWMに組み込んでしまうと外部のものを使えなくなる
- 組み込む方が実装は楽でオーバーヘッドも少ない
- 「一つのことを行え」というUnix哲学的にはよくない
- WMの付属品として、WMからは分離して別に作る
- 使うかどうかはユーザに任せる
- 無くてもWMは動作可能であることが望ましい
- 少なくとも、他のものに変えても動作するようでないと分離する意味がない
- 必然的に、連携はEWMHのプロパティを介して行うことになる
- バーをWMに組み込んでしまうと外部のものを使えなくなる
- タイトルバーはウィンドウに追従するので、画面上部/下部に固定されるバーより分かりやすい
- 「閉じる」ボタンのようなものを付けるならタイトルバーが適している
WMを外部のバー/パネルと連携させるために最低限対応すべきと思われるEWMHのプロパティ
プロパティ |
内容 |
備考 |
_NET_CLIENT_LIST |
存在するクライアントのリスト(古いものが先頭) |
|
_NET_CLIENT_LIST_STACKING |
同上、ただしbottom-to-topのスタック順 |
|
_NET_NUMBER_OF_DESKTOPS |
仮想デスクトップ数 |
これが設定されていないと動かないバー/パネルがある |
_NET_CURRENT_DESKTOP |
現在のデスクトップ |
|
_NET_ACTIVE_WINDOW |
現在フォーカスを得ているウィンドウ |
|
_NET_WM_DESKTOP |
ウィンドウが属しているデスクトップ |
これが設定されていないと動かないバー/パネルがある |
_NET_WM_STRUT |
パネルが必要とする領域 |
最大化を正しく行うために必要 |
_NET_WM_STRUT_PARTIAL |
パネルが必要とする領域(上より細かい指定) |
同上 |