= タスクバーとの連携 = そんなに簡単ではなかったのでまとめておく。 == 用語について == 同様の機能を持つものがバーと名づけられていたりパネルと名づけられていたり色々で面倒だが、ここではまとめて「タスクバー」と呼ぶことにする。 * 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が設定する 仮想デスクトップ操作機能を備えたタスクバーの中には、仮想デスクトップ関係のプロパティが取得できないとそもそも起動しなかったり、仮想デスクトップ操作以外の部分が正しく動作しないものが存在する<>。よって、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 _NET_WM_STATE_HIDDENについて * ウィンドウが不可視<>であることを表す(例: 最小化されたウィンドウ) * EWMHには、「このプロパティをトグルする要求については無視すべきであろう」と書かれている<> * 理由: この状態は独立した一つの状態ではない * 最小化だけでなく、巻き上げ<>によっても生じうる * 最小化/復帰はICCCMの範囲(WM_CHANGE_STATEとMapRequest)でまかなえる * このプロパティはページャが(ページャ内に)ウィンドウを表示するかどうかに関わる<> * このプロパティを持っているクライアントはページャに表示されない * WMがこのプロパティをサポートしているがウィンドウにはプロパティが設定されていない場合、ウィンドウの状態<>にかかわらずページャに表示される * WMがこのプロパティをサポートしていない場合、IconicStateのウィンドウはページャに表示されない * WMによって_NET_WM_STATE_HIDDENについての要求が来たときの対応が色々 * awesome,openbox,fluxbox: 普通に要求を処理 * evilwm: サポートすることは示している(_NET_SUPPORTEDに入れている)が、一切設定しないし処理もしない * サポートを表明しているのは全ウィンドウをページャ上に表示させるためらしい 単純なタスクバーであればこれくらいで十分だが、他にも色々と用意されている。