ログイン
編集不可のページディスカッション情報添付ファイル
"clear/wm_devel/2013-03-08"の差分

MMA
2と3のリビジョン間の差分
2013-03-08 23:05:17時点のリビジョン2
サイズ: 6039
編集者: clear
コメント:
2013-03-09 00:21:52時点のリビジョン3
サイズ: 7589
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 65: 行 65:
  * _NET_WM_STATE_HIDDEN: 現在アクティブな仮想デスクトップ内にあるが、非表示の状態である(最小化されている)ことを表す
   * 状態のトグルが可能となっている。つまり最小化からの復帰要求がありうる
  * _NET_WM_STATE_HIDDEN: 後述
行 73: 行 72:
_NET_WM_STATE_HIDDENについて
 * ウィンドウが不可視<<FootNote(現在の仮想デスクトップ内にあっても)>>であることを表す(例: 最小化されたウィンドウ)
 * EWMHには、「このプロパティをトグルする要求については無視すべきであろう」と書かれている<<FootNote(_NET_WM_STATE_HIDDENのImplementation Noteを参照)>>
  * 理由: この状態は独立した一つの状態ではない
   * 最小化だけでなく、巻き上げ<<FootNote(タイトルバーだけを表示すること。twmのアイコン化はこれ)>>によっても生じうる
  * 最小化/復帰はICCCMの範囲(WM_CHANGE_STATEとMapRequest)でまかなえる
 * このプロパティはページャが(ページャ内に)ウィンドウを表示するかどうかに関わる<<FootNote(EWMH Implementation Note "Pagers and Taskbars")>>
  * このプロパティを持っているクライアントはページャに表示されない
  * WMがこのプロパティをサポートしているがウィンドウにはプロパティが設定されていない場合、ウィンドウの状態<<FootNote(ICCCMでのNormalStateかIconicStateか)>>にかかわらずページャに表示される
  * WMがこのプロパティをサポートしていない場合、IconicStateのウィンドウはページャに表示されない
 * WMによって_NET_WM_STATE_HIDDENについての要求が来たときの対応が色々
  * awesome,openbox,fluxbox: 普通に要求を処理
  * evilwm: サポートすることは示している(_NET_SUPPORTEDに入れている)が、一切設定しないし処理もしない
   * サポートを表明しているのは全ウィンドウをページャ上に表示させるためらしい

タスクバーとの連携

そんなに簡単ではなかったのでまとめておく。

用語について

同様の機能を持つものがバーと名づけられていたりパネルと名づけられていたり色々で面倒だが、ここではまとめて「タスクバー」と呼ぶことにする。

  • 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

_NET_WM_STATE_HIDDENについて

  • ウィンドウが不可視2であることを表す(例: 最小化されたウィンドウ)

  • EWMHには、「このプロパティをトグルする要求については無視すべきであろう」と書かれている3

    • 理由: この状態は独立した一つの状態ではない
      • 最小化だけでなく、巻き上げ4によっても生じうる

    • 最小化/復帰はICCCMの範囲(WM_CHANGE_STATEとMapRequest)でまかなえる

  • このプロパティはページャが(ページャ内に)ウィンドウを表示するかどうかに関わる5

    • このプロパティを持っているクライアントはページャに表示されない
    • WMがこのプロパティをサポートしているがウィンドウにはプロパティが設定されていない場合、ウィンドウの状態6にかかわらずページャに表示される

    • WMがこのプロパティをサポートしていない場合、IconicStateのウィンドウはページャに表示されない

  • WMによって_NET_WM_STATE_HIDDENについての要求が来たときの対応が色々
    • awesome,openbox,fluxbox: 普通に要求を処理
    • evilwm: サポートすることは示している(_NET_SUPPORTEDに入れている)が、一切設定しないし処理もしない
      • サポートを表明しているのは全ウィンドウをページャ上に表示させるためらしい

単純なタスクバーであればこれくらいで十分だが、他にも色々と用意されている。

  1. pypanelとか (1)

  2. 現在の仮想デスクトップ内にあっても (2)

  3. _NET_WM_STATE_HIDDENのImplementation Noteを参照 (3)

  4. タイトルバーだけを表示すること。twmのアイコン化はこれ (4)

  5. EWMH Implementation Note "Pagers and Taskbars" (5)

  6. ICCCMでのNormalStateIconicStateか (6)

clear/wm_devel/2013-03-08 (最終更新日時 2013-03-09 00:21:52 更新者 clear)