## page was renamed from clear/doc/dwm ## page was renamed from clear/dwm <> == なにこれ == dwm ('''dynamic''' window manager) - 最小主義的なウィンドウマネージャ http://dwm.suckless.org/ == 特徴 == * タイル型 * 敷き詰めるようにウィンドウを配置してくれるので、画面を最大限に活用できる * 特に「何かを見ながら何かを書く」ときに強い * そもそもタイル型が適していない(ほとんど使い物にならない)アプリケーションもある * 小さなウィンドウをたくさん出すものは大変なことになる * 小さなダイアログや設定ウィンドウがタイル化された結果残念な気持ちになることがある * フローティング(いわゆる普通のウィンドウマネージャと同じ)モードにもできる * シンプル * ソースコードは単一のファイルで2000行ほど、それに設定を記したヘッダファイルが一つ * minimalistにはおすすめ * 設定がヘッダファイル * 使い方が良く分からないGUIのインターフェースとかそんなものはない * ちょっと設定を変えたくなったらmakeする作業が待っている。特に色周りに凝り出すと非常に面倒 * 仮想デスクトップ「のようなもの」が使える * 比較的充実したキーボード操作 == 導入 == === 基本的な方針 === 設定がヘッダファイル(`config.h`)に記されているので、これを編集し、`make`して自分用の実行ファイルを作ることとなる。各種パッケージ管理システムで検索すれば見つかるかと思われるが、自分の環境に合った設定を施さないと色々と不都合が生じる可能性が高いので、コンパイルして使うことを強く推奨。ただし、パッケージ管理システム上にあるものはOSに合わせた設定が施されている場合もあるようなので、雰囲気を掴むために使ってみる分には良いかもしれない。 === ソースコードの入手 - コンパイル - 実行 === 上記のURLにアクセスして圧縮されたソースコードを持ってくる。下の方の"Download"のところ。展開するとディレクトリが一つできるので、その中に入って`make`を実行すると`dwm`という実行ファイルができる。`make install`することもできるが、あらかじめ用意しておいた適当な場所(`~/bin`とか)に自分で配置して、そこにパスを通しておくのがおすすめ。あとは、`.xinitrc`や`.xsession`で`dwm`を起動すれば良い。 * 一番最初だけは設定に手を加えず起動してみることをおすすめする。操作は[[#操作|こちらを参照]]。 * とりあえず、「Alt + Shift + Enterでxtermが起動」し、「Alt + Shift + qでdwmが終了する」これだけを覚えておけば大丈夫だ、問題ない。 * manは[[http://man.suckless.org/dwm/1/dwm|こちら]] === 設定してみる === 流れとしては「`config.h`を編集して`make`、実行ファイルを置き換え -> 試す」の繰り返し。設定は`config.h`の各項目を編集することで行う。このファイルは見ればだいたい分かるように作られている。詳しくは[[#設定|こちら]]で。 == 予備知識 == 用語など。 === フォーカスについて === dwmでは、twmなどと同じくfocus-follows-mouse([[http://www.jp.freebsd.org/www.freebsd.org/doc/ja_JP.eucJP/books/handbook/x-understanding.html|ここ]]の5.2.3節を参照)でウィンドウのフォーカスが切り替わる。 === バー === 上にあるやつ。 * 左からタグの一覧(デフォルトでは1から9)、現在のウィンドウ配置モード、現在フォーカスがあるウィンドウのタイトルが表示されている * 右端に表示されているのはXのルートウィンドウのタイトル(WM_NAME)。何もしなければdwmのバージョンが設定される * ここに時計とか、ノートPCならバッテリ残量とかを表示するといい * 設定は `xsetroot -name hogehoge` で。コマンドを組み合わせてお好みの文字列を作る * 実は下に表示することもできる * 参考までにスクリーンショットを1枚。ただし、デフォルトの設定から色々いじっている {{attachment:dwm_scrshot01_captioned.png|スクリーンショット1|width=512 height=300}} === タグ === 仮想デスクトップ「のようなもの」。何が「のようなもの」なのかというと、このタグは「個々のウィンドウに対して」設定されるもの。「このウィンドウは1番と3番」のようにタグ番号を設定しておいて、操作に応じて「n番が設定されているウィンドウを表示」しているに過ぎない。 == 操作 == dwmに対する操作は"修飾キー + 別のキー"という形で行う。修飾キーは初期設定ではMod1。Mod1がどのキーかは、`xmodmap`コマンドをオプションなしで実行すればわかる(何もしていなければAlt/Meta)。初期設定でのキーバインドは以下のとおり。 ||Mod1-Shift-Enter||端末(初期設定ではxterm)を開く|| ||Mod1-Shift-c||フォーカスのあたっているウィンドウを閉じる|| ||Mod1-Shift-q||ウィンドウマネージャの終了|| ||Mod1-t||タイル表示に切り替え|| ||Mod1-f||フローティング表示に切り替え|| ||Mod1-m||タイル表示のとき、フォーカスのあたっているウィンドウを最大化(Mod1-tでタイルに戻す)|| ||Mod1-[1...n]||n番のタグが設定されているウィンドウを表示|| ||Mod1-0||すべてのウィンドウを表示|| ||Mod1-Shift-[1...n]||フォーカスのあたっているウィンドウにn番のタグを設定(他のタグの設定は消去される)|| ||Mod1-Shift-Control-[1...n]||フォーカスのあたっているウィンドウにn番のタグを追加/削除(他のタグの設定は残る)|| ||Mod1-Shift-0||フォーカスのあたっているウィンドウにすべてのタグを設定(タグを切り替えても常に表示されるようになる)|| ||Mod1-b||バーの表示/非表示の切り替え|| ||Mod1-Shift-space||フォーカスのあたっているウィンドウの状態をタイル/フローティングで切り替える|| ||Mod1-j, Mod1-k||ウィンドウのフォーカスを移動|| ||Mod1-h, Mod1-l||(タイル配置時)ウィンドウの幅を変更|| ||Mod1-Enter||(タイル配置時)スタックのトップウィンドウを切り替え|| ||Mod1-左クリック||ドラッグしてウィンドウを移動(ウィンドウはフローティング状態へ)|| ||Mod1-右クリック||ドラッグしてウィンドウサイズを変更(同上)|| ||Mod1-中クリック||Mod1-Shift-spaceに同じ|| ||And more||manを参照のこと|| == ウィンドウ配置 == 素のdwmは3つのウィンドウ配置モードをサポートしている。 * タイル * 2つめ以降のウィンドウはスクリーンの右半分に積まれていく * フローティング * いわゆる普通のウィンドウマネージャと同じように表示される * ウィンドウをフローティングで表示する方法は3つある * あらかじめフローティングに切り替えた上でウィンドウを表示する * ウィンドウを移動したり、ウィンドウのサイズを変更する * `config.h`で特定のウィンドウに対するルールを書く * 最大化 * タイル配置しているときに有効。フローティング状態のウィンドウに適用しても何も起こらない == 設定 == === 修飾キーの変更 === 初期状態では修飾キーがMod1、すなわちAltキーに割り当てられている。"Alt + 何か"のキーバインドを持つアプリケーションを実行すると入力を全部dwmに吸い込まれて非常に残念な気持ちになれるので、修飾キーを変更するのがおすすめ。たいていWindowsキー(や、それに相当するもの)が遊んでいるのでこいつに割り当ててしまう。 1. 使うキーのキーコード|キーシンボルを確認する `xev`コマンドを使う。実行すると小さな四角形が描かれたウィンドウが表示される。このウィンドウ上でマウスカーソルを動かしたりキーを押下すると、それによって生じたイベントの情報がコンソールに出力される。ここでは、左Windowsキーをdwmの操作用に使うこととする。 {{{ KeyPress event, serial 27, synthetic NO, window 0x1000001, root 0xaa, subw 0x0, time 3537403, (402,400), root:(403,417), state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES, XKeysymToKeycode returns keycode: 102 XLookupString gives 0 bytes: XmbLookupString gives 0 bytes: XFilterEvent returns: False }}} 個々のキーを押したときの出力はこんな感じになる。見るのは {{{ keycode 133 (keysym 0xffeb, Super_L) }}} の部分。これは押されたキー(ここではWindowsキー)のキーコードが133、キーシンボルはSuper_Lであることを示している。Windowsキーは物理的な位置に応じてSuper_L|Super_Rになっているはず。 2. 修飾キーを確認する `xmodmap`コマンドを使う。'''注: 以下の出力例は、`.Xmodmap`を書いて既に修飾キーを変更した環境でのものです''' {{{ $ xmodmap xmodmap: up to 4 keys per modifier, (keycodes in parentheses): shift Shift_L (0x32), Shift_R (0x3e) lock control Control_L (0x25), Control_L (0x42), Control_R (0x69) mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) mod2 Num_Lock (0x4d) mod3 mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf) mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb) }}} 見ての通り、Super_LはMod4に設定されていることが分かる。 3. `config.h`を書き換え、`make`する {{{#!highlight c numbers=off /* key definitions */ #define MODKEY Mod1Mask }}} これを {{{#!highlight c numbers=off /* key definitions */ #define MODKEY Mod4Mask /* <- Mod4Maskに変更 */ }}} のように書き換える。ModにModMaskが対応する。編集後、dwmをmakeして置き換えると、Mod4で操作できるようになっているはず。 4. 修飾キーの追加、変更 '''(必要に応じて)''' こうして設定したは良いが、万が一設定したキーが存在しないキーボードを繋いだマシンでdwmを使うようなことがあると、非常に残念なことになる。このような状況が考えられる場合(種類の異なるキーボードが繋がれた複数の端末を使うときとか)、他に余っているキーをxmodmapを使ってmod4に追加しておくと良い。ここでは、右AltキーをSuper_Rに設定する。ここで先ほどのxmodmapの出力をもう一度見てみる。 {{{ mod1 Alt_L (0x40), Alt_R (0x6c), Meta_L (0xcd) }}} このとおりAlt_Rは既にmod1に登録されているので、これを解除してからSuper_Rに設定する。`.Xmodmap`に次のように書けば良い。 {{{ remove Mod1 = Alt_R keysym Alt_R = Super_R }}} 1行目でAlt_Rをmod1から削除し、2行目でAlt_RをSuper_Rに設定している。 === 外観の設定 === やはり見た目にはこだわりたい。色の設定は`config.h`の冒頭、以下の部分を編集することで行う。 {{{#!highlight c numbers=off /* appearance */ static const char font[] = "-*-terminus-medium-r-*-*-16-*-*-*-*-*-*-*"; static const char normbordercolor[] = "#cccccc"; static const char normbgcolor[] = "#cccccc"; static const char normfgcolor[] = "#000000"; static const char selbordercolor[] = "#0066ff"; static const char selbgcolor[] = "#0066ff"; static const char selfgcolor[] = "#ffffff"; static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ static const Bool showbar = True; /* False means no bar */ static const Bool topbar = True; /* False means bottom bar */ }}} 各項目の意味(書きかけ) * `font` - バーで用いるフォントを指定する * `normbordercolor` - フォーカスがあたっていないウィンドウの境界線の色 * `selbordercolor` - フォーカスがあたっているウィンドウの境界線の色 * `borderpx` - ウィンドウの境界線のピクセル数 * `showbar` - 起動時にバーを表示するかどうか。ここで`False`を指定しても、Mod1-bで表示するように切り替えることは可能と思われる * `topbar` - バーを上に表示するかどうか。`False`を指定すればバーは下に表示される === 個別ルールの設定 === 参考: http://dwm.suckless.org/customisation/rules タイル型ウィンドウマネージャとの相性が悪いアプリケーションも存在する。小さなウィンドウを大量に表示するものやスキンを使うメディアプレーヤー系統が当てはまる。そういったものは常にフローティングで表示するように設定しておくと幸せになれる。個別ルールは`config.h`の以下の部分に追加する。 {{{#!highlight c numbers=off static const Rule rules[] = { /* class instance title tags mask isfloating monitor */ { "Gimp", NULL, NULL, 0, True, -1 }, { "Firefox", NULL, NULL, 1 << 8, False, -1 }, }; }}} 各項目の意味(書きかけ) * `class` * `instance` * `title` * `tags mask` * `isfloating` - `True`ならフローティングで表示されるようになる。後からタイル化することは可能 * `monitor` - モニタが複数ある場合に、表示するモニタの番号を指定できる。-1は現在のモニタ class|instance|titleの設定方法(書きかけ) `xprop`コマンドで調べられる。 === レイアウトに関する設定 === {{{#!highlight c numbers=off /* layout(s) */ static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ static const Bool resizehints = True; /* True means respect size hints in tiled resizals */ static const Layout layouts[] = { /* symbol arrange function */ { "[]=", tile }, /* first entry is default */ { "><>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, }; }}} 各項目の意味 * `mfact` - タイル表示した際の、初期状態での左右の比率。0.50で半々 * `resizehints` - ヒントを使ってリサイズするかどうか ||`resizehints = True`|| || {{attachment:dwm_gap_before_edit.png|True|width=512 height=300}}|| 見づらいが、画面下端と右端にわずかな隙間がある。このような場合、`False`に設定することで隙間を無くすことができる。 ||`resizehints = False`|| ||{{attachment:dwm_gap_after.png|False|width=512 height=300}}|| * `layouts[]` - ウィンドウ配置モードの一覧。コメントにある通り、一番初めの要素がデフォルトの配置方法となる * これは以下のような構造体の配列である {{{#!highlight c numbers=off typedef struct { const char *symbol; void (*arrange)(Monitor *); } Layout; }}} * `symbol` - 配置モードを示す文字列。バーに表示される * `arrange` - 配置を行う関数へのポインタ。`NULL`の場合フローティングとなる。素のdwmでは`tile`(タイル)と`monocle`(最大化)が用意されている === ステータスバー === 時計やバッテリ残量等を表示しておくとよい。サンプルは[[clear/misc#dwm用ステータスバー|このへん]]に置いた == パッチ == 多数存在する。 http://dwm.suckless.org/patches/