⇤ ← 2012-12-11 04:01:02時点のリビジョン1
サイズ: 4284
コメント:
|
サイズ: 4690
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 15: | 行 15: |
* 2013/02/01追記: reparentを行う場合はこれを正しく設定しないとxkillにWMを殺される悲劇が発生する。reparentによってWMの作成したフレームウィンドウがトップレベルウィンドウとなるが、reparent対象のウィンドウにWM_STATEを設定しないとフレームウィンドウを対象にKillClientリクエストが発行されてWMが死ぬ |
最低限のWM-クライアント間通信
クライアント間通信についてはICCCMやEWMHで規定されているが、全て実装していると日が暮れるどころか年が明けても全然終わらない(そもそもWMの備える機能によっては実装する意味がないものもある)。
しかし、ICCCMで規定されているものには「最低限これはないと不味い」というものがあるので記録しておく。
WM_DELETE_WINDOW
WMからウィンドウを閉じること(タイトルバーとボタンを備えたWMなら、「閉じる」ボタンが押された場合)を考える。単純な方法としてXKillClientが存在するが、これは問答無用で対象のウィンドウを持っているクライアントを殺してしまうため以下の問題がある。
- クライアントの終了処理が行われない(即死する)
- クライアントが複数のトップレベルウィンドウを持っており、そのうちの1つを閉じる場合でもクライアント自体を殺してしまう
WM_DELETE_WINDOW(正確にはこれを含むClientMessageイベント)をクライアントに送ることで、クライアントに終了を要求することができる。ただし全てのクライアントがこれを扱えるとは限らないので、対象ウィンドウのWM_PROTOCOLSプロパティを確認する必要がある。WM_DELETE_WINDOWを受け付けないクライアントに対しては単にXKillClientを実行してよい。
WM_STATE
ウィンドウの状態を表すプロパティ。各トップレベルウィンドウに対してWMが設定する。ユーザにウィンドウをクリックすることでウィンドウを指定させるプログラム(例えばxpropとかxkill)はこのプロパティを使ってウィンドウを検索するらしい。このプロパティを設定しないとxkillが-fを付けないと動かないことを確認したので、多分設定しておいた方が良い。
2013/02/01追記: reparentを行う場合はこれを正しく設定しないとxkillにWMを殺される悲劇が発生する。reparentによってWMの作成したフレームウィンドウがトップレベルウィンドウとなるが、reparent対象のウィンドウにWM_STATEを設定しないとフレームウィンドウを対象にKillClientリクエストが発行されてWMが死ぬ
値としては、
ウィンドウが表示されていればNormalState
(twmのタイトルバー左のボタンを押したときみたいに)アイコン化されていればIconicState
ウィンドウ本体もアイコンも不可視であればWithdrawnState
EWMHでは_NET_WM_STATEが定義されていて、最大化や最小化、フルスクリーン(最大化とは意味が違う)などの状態が表せるようになっている。
WM_HINTS
アプリケーションがWMのために設定するプロパティ。いくつかの値が含まれる。
最低でもInputHintは見るべき。この値はウィンドウが入力フォーカスをどう扱うか(受動的に得る、能動的に得る、そもそも必要としない)を示していて、Falseになっているウィンドウは入力フォーカスを得ることを意図していない。代表例はxloadとかxclockのような、そもそも入力を受ける余地がないものだが、より深刻な例としてはJEDのVineに入っているWnnの変換候補ウィンドウがこれに当てはまり、eclipse + Wnn有効の状況で変換候補ウィンドウにフォーカスを持っていかれてまともに入力できなくなる現象を確認した。
取得自体は簡単なので、余裕があれば他にStateHintとかWindowGroupHint、UrgencyHintあたりを見ると良さそう。
WM_NORMAL_HINTS
各ウィンドウのサイズに関する指示を示すプロパティ。クライアントが設定する。このプロパティにはクライアント側が希望するウィンドウの最小サイズ、最大サイズ、アスペクト比の範囲などの情報が含まれる。無視することもできるが「最小サイズ = 最大サイズ」となっているウィンドウは固定サイズで表示されることを期待しているので、最低限これだけは見ておいた方が良い。