タスクバーとの連携
そんなに簡単ではなかったのでまとめておく。
用語について
同様の機能を持つものがバーと名づけられていたりパネルと名づけられていたり色々で面倒だが、ここではまとめて「タスクバー」と呼ぶことにする。
- EWMHでは「ページャ」と「タスクバー」を区別している
- デスクトップの縮小図を表示して、その中でウィンドウを動かせるのがページャ
- ウィンドウタイトルの一覧を表示して、ウィンドウを最小化したり戻したりできるのがタスクバー
- タスクバー上にさらにページャやトレイ(通知領域)が乗っていることも多い
- EWMH中で他の一般のクライアントと区別する必要があるときは、これら2つを総称して「ページャ」と呼んでいる
以下、「クライアント」は「WMとタスクバー及びページャ(広義のページャ)を除くXクライアント」を指すものとする。
一般的なタスクバーの機能
- ウィンドウの一覧を表示する
- ウィンドウ名
- アイコン
- ウィンドウの表示/非表示(最小化)の切り替え
- 仮想デスクトップの操作
- 仮想デスクトップを実現するのはWMだが、タスクバーを通して操作が可能になっている場合が多い
- 上に色々のせるための土台
- ランチャとか通知領域とか
- ここでは触れない
WMが実装すべき機能
WMからタスクバーに提供する情報
WMはルートウィンドウや各クライアントウィンドウにプロパティを設定することでタスクバーに情報を与える。何を必須とするかはタスクバーによって違う。
- _NET_CLIENT_LIST
- WMが管理しているクライアントの一覧(古いものが先頭)
- タスクバーはこのリストを使ってどんなクライアントが居るかを知るので、これがないと話にならない
- スタック順(bottom-to-top)の_NET_CLIENT_LIST_STACKINGもある
- タスクバーはこれが無くてもそれなりに動く
- ページャはウィンドウの上下関係を知る必要があるのでこれがないと動かない
- _NET_ACTIVE_WINDOW
- 現在フォーカスを得ているウィンドウを表す
- アクティブなウィンドウだけ見た目を変えるのに使われる
- 仮想デスクトップ関連の情報
- 仮想デスクトップを認識するタスクバーは最低限以下のようなプロパティを必要とする
- _NET_NUMBER_OF_DESKTOPS: 仮想デスクトップの数
- _NET_CURRENT_DESKTOP: 現在の仮想デスクトップ([0, _NET_NUMBER_OF_DESKTOPS-1])
- _NET_WM_DESKTOP: クライアントがどの仮想デスクトップに属しているか(上2つは全てルートウィンドウのものだが、これはクライアントウィンドウのプロパティ)
- 仮想デスクトップを認識するタスクバーは最低限以下のようなプロパティを必要とする
- _NET_WM_STATE
- クライアントウィンドウの状態(最大化されてるとかフルスクリーンだとか隠されてるとか)
ICCCMのNormalState,IconicStateのさらに細かい属性として考える
- 「最大化で表示」「最大化で非表示」みたいな違いを表現する
- これはWMが設定する
- クライアントウィンドウの状態(最大化されてるとかフルスクリーンだとか隠されてるとか)
仮想デスクトップ操作機能を備えたタスクバーの中には、仮想デスクトップ関係のプロパティが取得できないとそもそも起動しなかったり、仮想デスクトップ操作以外の部分が正しく動作しないものが存在する1。よって、WMが仮想デスクトップをサポートしていない場合でも仮想デスクトップ関係のプロパティを設定しておいたほうが良い。値は以下のようにしておく。
- _NET_NUMBER_OF_DESKTOP: 1で固定
- _NET_CURRENT_DESKTOP: 0で固定
- _NET_WM_DESKTOP: 全クライアントについて0で固定
こうして「1つだけの仮想デスクトップがある」ことをタスクバーに示しておけば、とりあえずは何とかなる。
タスクバーからWMへの要求
タスクバーはWMが設定したプロパティの変更要求を送ることがある。これはタスクバーからWMへの要求を表している。例えば_NET_CURRENT_DESKTOPの変更要求は、WMに対して仮想デスクトップの切り替えを要求していることになる。要求の実体はルートウィンドウへのClientMessageとなっていて、中身は
- 対象とするウィンドウ(あれば)
- 変更を要求するプロパティ
- 新しい値
のようなものが入っている。
WMは要求を無視しても良い(例えば、仮想デスクトップに対応していないWMは仮想デスクトップ関連の要求を全て無視するしかない)。
以下のような要求が可能になっている。
- ウィンドウの表示/非表示
ただのMapRequest: タスクバーがクライアントウィンドウをmapするとリダイレクトされた結果これが来る
WM_CHANGE_STATE: ICCCMで定義されている。これによる遷移は表示->最小化のみ
- _NET_WM_STATE_HIDDEN: 現在アクティブな仮想デスクトップ内にあるが、非表示の状態である(最小化されている)ことを表す
- 状態のトグルが可能となっている。つまり最小化からの復帰要求がありうる
- フォーカスの変更: _NET_ACTIVE_WINDOW
- 仮想デスクトップ関連
- 仮想デスクトップ数の変更: _NET_NUMBER_OF_DESKTOP
- 仮想デスクトップの切り替え: _NET_CURRENT_DESKTOP
- ウィンドウの仮想デスクトップ間での移動: _NET_WM_DESKTOP
単純なタスクバーであればこれくらいで十分だが、他にも色々と用意されている。
pypanelとか (1)