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

MMA
5と27のリビジョン間の差分 (その間の編集: 22回)
2010-12-26 18:19:02時点のリビジョン5
サイズ: 7931
編集者: clear
コメント:
2011-09-18 22:22:49時点のリビジョン27
サイズ: 16489
編集者: clear
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
## page was renamed from clear/doc/dwm
## page was renamed from clear/dwm
<<TableOfContents>>
行 2: 行 6:
dwm (dynamic window manager)<<BR>>
ウィンドウマネージャです。
dwm ('''dynamic''' window manager) - 最小主義的なウィンドウマネージャ
行 7: 行 10:
== 利点 ==
 * タイル型である
  * 敷き詰めるようにウィンドウを配置してくれるので、ウィンドウ配置に悩まなくてよい。画面を最大限に活用できる
  * 「何かを見ながら何かを書く」ときにすごく強い
 * シンプルで軽い
== 特徴 ==
 * タイル型
  * 敷き詰めるようにウィンドウを配置してくれるので、画面を最大限に活用できる
   * 特に「何かを見ながら何かを書く」ときに強い
  * そもそもタイル型が適していない(ほとんど使い物にならない)アプリケーションもある
   * 小さなウィンドウをたくさん出すものは大変なことになる
    * 小さなダイアログや設定ウィンドウがタイル化された結果残念な気持ちになることがある
   * フローティング(いわゆる普通のウィンドウマネージャと同じ)モードにもできる
 * シンプル
行 16: 行 23:
  * ちょっと設定を変えたくなったらmakeする作業が待っている。特に色周りに凝り出すと非常に面倒
行 17: 行 25:

== 欠点 ==
 * タイル型である
  * 小さなダイアログや設定ウィンドウがタイル化された結果残念な気持ちになることがある
   * OKボタン一つだけのメッセージボックスが画面の半分を占める状況を想像してみよう
  * そもそもタイル型が適していない(ほとんど使い物にならない)アプリケーションもある
   * 特にgimpが悲惨だった。小さなウィンドウをたくさん出すものは大変なことになる。スキンを使うメディアプレーヤー系も同様
    * フローティング(いわゆる普通のウィンドウマネージャと同じ)モードにもできるのでそちらを使う
    * 特定のものに対して特別扱いする設定を書けるので、それを活用して常にフローティングで表示するようにすると若干幸せ
 * 設定がヘッダファイル
  * ちょっと設定を変えたくなったらmakeする作業が待っている
   * 特に色周りに凝り出すと非常に面倒
   * ウィンドウごとに特別扱いしたくなったときもmake。新しいGUIアプリを導入するたびにちゃんと使えるか確認する必要がある
  * 名前はdynamicだが設定は非常にstatic
 * ウィンドウマネージャの操作が特定のキーに集中している(初期状態ではMod1、AltとかMeta)
  * 利点と取るか欠点と取るか
  * 「特定のキー」は変えられるが、一つに依存する面は避けられない
  * 仮にもそのキーが使えない(そもそもキーボード上に存在しないとか…)ようなことがあれば非常に残念なことになる(なった)
   * 具体的にはウィンドウマネージャの終了ができない。killするしかない
 * 比較的充実したキーボード操作
 
行 38: 行 28:
上記のURLにアクセスしてソースコードを持ってくる。下の方の"Download"のところ<<BR>>
デフォルトの設定のまま使うなら、展開してできるディレクトリ内に入ってmakeし、できた実行ファイルを適当な場所に配置するだけ。とりあえず起動してみて雰囲気を掴むといいかもしれない。<<BR>>
manは[[http://man.suckless.org/dwm/1/dwm|こちら]]<<BR>>
グラフィカルログイン時にdwmを起動するには、.xinitrcや.xsessionの最後に"exec dwm"とでも書いておけば良い

== 画面上の要素 ==
=== 基本的な方針 ===
設定がヘッダファイル(`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節を参照)でウィンドウのフォーカスが切り替わる。
行 47: 行 50:
 * 右端に表示されているのはXのルートウィンドウのタイトル(WM_NAME)。何もしなければdwmのバージョンが設定されたはず  * 右端に表示されているのはXのルートウィンドウのタイトル(WM_NAME)。何もしなければdwmのバージョンが設定され
行 49: 行 52:
   * 設定は xsetroot -name hogehoge で。コマンドを組み合わせてお好みの文字列を作る    * 設定は `xsetroot -name hogehoge` で。コマンドを組み合わせてお好みの文字列を作る
 * 実は下に表示することもできる
 * 参考までにスクリーンショットを1枚。ただし、デフォルトの設定から色々いじっている
 {{attachment:dwm_scrshot01_captioned.png|スクリーンショット1|width=512 height=300}}
行 52: 行 58:
仮想デスクトップ「のようなもの」。<<BR>>
何が「のようなもの」なのかというと、このタグは「個々のウィンドウに対して」設定されるもの。「このウィンドウは1番と3番」のようにタグ番号を設定しておいて、操作に応じて「n番が設定されているウィンドウを表示」しているに過ぎない。
仮想デスクトップ「のようなもの」。何が「のようなもの」なのかというと、このタグは「個々のウィンドウに対して」設定されるもの。「このウィンドウは1番と3番」のようにタグ番号を設定しておいて、操作に応じて「n番が設定されているウィンドウを表示」しているに過ぎない。
行 56: 行 61:
dwmに対する操作は"修飾キー + 別のキー"という形で行う。修飾キーは初期設定ではMod1。Mod1がどのキーかは、xmodmapをオプションなしで実行すればわかる(AltとかMetaのはず)。<<BR>>
初期設定でのキーバインドは以下のとおり。
dwmに対する操作は"修飾キー + 別のキー"という形で行う。修飾キーは初期設定ではMod1。Mod1がどのキーかは、`xmodmap`コマンドをオプションなしで実行すればわかる(何もしていなければAlt/Meta)。初期設定でのキーバインドは以下のとおり。
行 61: 行 65:
||Mod1-t||タイル表示に切り替え||
||Mod1-f||フローティング表示に切り替え||
||Mod1-m||タイル表示のとき、フォーカスのあたっているウィンドウを最大化(Mod1-tでタイルに戻す)||
行 68: 行 75:
||Mod1-j, Mod1-k||ウィンドウのフォーカスを移動||
||Mod1-h, Mod1-l||(タイル配置時)ウィンドウの幅を変更||
||Mod1-Enter||(タイル配置時)スタックのトップウィンドウを切り替え||
行 74: 行 84:
素のdwmは3つのウィンドウ配置モードをサポートしている。<<BR>>
各モードごとの解説はComing soon。

=== タイル ===
=== フローティング ===
=== 最大化 ===
素のdwmは3つのウィンドウ配置モードをサポートしている。
 * タイル
  * 2つめ以降のウィンドウはスクリーンの右半分に積まれていく
 * フローティング
  * いわゆる普通のウィンドウマネージャと同じように表示される
  * ウィンドウをフローティングで表示する方法は3つある
   * あらかじめフローティングに切り替えた上でウィンドウを表示する
   * ウィンドウを移動したり、ウィンドウのサイズを変更する
   * `config.h`で特定のウィンドウに対するルールを書く
 * 最大化
  * タイル配置しているときに有効。フローティング状態のウィンドウに適用しても何も起こらない
行 82: 行 97:
=== 基本 ===
dwmの設定はconfig.hの各項目を編集することで行う。設定が完了したらmakeして、できたdwmをそれまでのものと置き換えるだけ。config.hは設定専用に作られており、かつwell-commentedなので迷うことは少ない。だいたい分かる。
行 86: 行 98:
初期状態では修飾キーがMod1、すなわちAltキーに割り当てられている。"Alt + 何か"のキーバインドを持つアプリケーションを実行すると入力を全部dwmに吸い込まれて非常に残念な気持ちになれるので、修飾キーを変更するのがおすすめ。たいていWindowsキー(や、それに相当するもの)が遊んでいるのでこいつに割り当ててしまう。<<BR>>
具体的な方法はComing soon。

=== フォントや色の設定 ===
やはり見た目にはこだわりたい。<<BR>>
具体的な方法はComing soon。
初期状態では修飾キーが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<n>にMod<n>Maskが対応する。編集後、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`を指定すればバーは下に表示される
行 94: 行 184:
先に述べた通り、タイル型ウィンドウマネージャとの相性が悪いアプリケーションも存在する。ツールボックスウィンドウを大量に表示するものやスキンを使うメディアプレーヤー系統が当てはまる。そういったものは常にフローティングで表示するように設定しておくと幸せになれる。<<BR>>
具体的な方法はComing soon。

=== 今使っている.xsession(のdwmに関わる部分) ===
{{{
# 1分間隔で時刻を表示しつつdwmの生存確認。dwmが居なくなったら終了
while true; do
    xsetroot -name "|$(date +"%m/%d %H:%M")|"
    pgrep -afU $(id -u) dwm
    if [ $? -eq 1 ]; then
        exit 0
    else
        sleep 60
    fi
done & # <- バックグラウンドで走らせる
exec dwm
}}}
参考: 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/

なにこれ

dwm (dynamic window manager) - 最小主義的なウィンドウマネージャ

http://dwm.suckless.org/

特徴

  • タイル型
    • 敷き詰めるようにウィンドウを配置してくれるので、画面を最大限に活用できる
      • 特に「何かを見ながら何かを書く」ときに強い
    • そもそもタイル型が適していない(ほとんど使い物にならない)アプリケーションもある
      • 小さなウィンドウをたくさん出すものは大変なことになる
        • 小さなダイアログや設定ウィンドウがタイル化された結果残念な気持ちになることがある
      • フローティング(いわゆる普通のウィンドウマネージャと同じ)モードにもできる
  • シンプル
    • ソースコードは単一のファイルで2000行ほど、それに設定を記したヘッダファイルが一つ
    • minimalistにはおすすめ
  • 設定がヘッダファイル
    • 使い方が良く分からないGUIのインターフェースとかそんなものはない
    • ちょっと設定を変えたくなったらmakeする作業が待っている。特に色周りに凝り出すと非常に面倒
  • 仮想デスクトップ「のようなもの」が使える
  • 比較的充実したキーボード操作

導入

基本的な方針

設定がヘッダファイル(config.h)に記されているので、これを編集し、makeして自分用の実行ファイルを作ることとなる。各種パッケージ管理システムで検索すれば見つかるかと思われるが、自分の環境に合った設定を施さないと色々と不都合が生じる可能性が高いので、コンパイルして使うことを強く推奨。ただし、パッケージ管理システム上にあるものはOSに合わせた設定が施されている場合もあるようなので、雰囲気を掴むために使ってみる分には良いかもしれない。

ソースコードの入手 - コンパイル - 実行

上記のURLにアクセスして圧縮されたソースコードを持ってくる。下の方の"Download"のところ。展開するとディレクトリが一つできるので、その中に入ってmakeを実行するとdwmという実行ファイルができる。make installすることもできるが、あらかじめ用意しておいた適当な場所(~/binとか)に自分で配置して、そこにパスを通しておくのがおすすめ。あとは、.xinitrc.xsessiondwmを起動すれば良い。

  • 一番最初だけは設定に手を加えず起動してみることをおすすめする。操作はこちらを参照

    • とりあえず、「Alt + Shift + Enterでxtermが起動」し、「Alt + Shift + qでdwmが終了する」これだけを覚えておけば大丈夫だ、問題ない。
  • manはこちら

設定してみる

流れとしては「config.hを編集してmake、実行ファイルを置き換え -> 試す」の繰り返し。設定はconfig.hの各項目を編集することで行う。このファイルは見ればだいたい分かるように作られている。詳しくはこちらで。

予備知識

用語など。

フォーカスについて

dwmでは、twmなどと同じくfocus-follows-mouse(ここの5.2.3節を参照)でウィンドウのフォーカスが切り替わる。

バー

上にあるやつ。

  • 左からタグの一覧(デフォルトでは1から9)、現在のウィンドウ配置モード、現在フォーカスがあるウィンドウのタイトルが表示されている
  • 右端に表示されているのはXのルートウィンドウのタイトル(WM_NAME)。何もしなければdwmのバージョンが設定される
    • ここに時計とか、ノートPCならバッテリ残量とかを表示するといい
      • 設定は xsetroot -name hogehoge で。コマンドを組み合わせてお好みの文字列を作る

  • 実は下に表示することもできる
  • 参考までにスクリーンショットを1枚。ただし、デフォルトの設定から色々いじっている

    スクリーンショット1

タグ

仮想デスクトップ「のようなもの」。何が「のようなもの」なのかというと、このタグは「個々のウィンドウに対して」設定されるもの。「このウィンドウは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する

  • /* key definitions */
    #define MODKEY Mod1Mask
    
    
    これを
    /* key definitions */
    #define MODKEY Mod4Mask /* <- Mod4Maskに変更 */
    
    

    のように書き換える。Mod<n>にMod<n>Maskが対応する。編集後、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の冒頭、以下の部分を編集することで行う。

/* 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の以下の部分に追加する。

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コマンドで調べられる。

レイアウトに関する設定

/* 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

    True

    見づらいが、画面下端と右端にわずかな隙間がある。このような場合、Falseに設定することで隙間を無くすことができる。

    resizehints = False

    False

  • layouts[] - ウィンドウ配置モードの一覧。コメントにある通り、一番初めの要素がデフォルトの配置方法となる

    • これは以下のような構造体の配列である
      typedef struct {
              const char *symbol;
              void (*arrange)(Monitor *);
      } Layout;
      
      • symbol - 配置モードを示す文字列。バーに表示される

      • arrange - 配置を行う関数へのポインタ。NULLの場合フローティングとなる。素のdwmではtile(タイル)とmonocle(最大化)が用意されている

ステータスバー

時計やバッテリ残量等を表示しておくとよい。サンプルはこのへんに置いた

パッチ

多数存在する。

http://dwm.suckless.org/patches/

clear/dwm (最終更新日時 2011-09-18 22:22:49 更新者 clear)