dwm

提供: ArchWiki
2022年1月5日 (水) 01:18時点におけるKgx (トーク | 投稿記録)による版 (→‎ステータスバーの設定: 翻訳)
ナビゲーションに移動 検索に移動

関連記事

dwmXorg の動的ウィンドウマネージャです。タイル・スタック・フルスクリーンレイアウトでウィンドウを管理し、さらにパッチを使うことで他のレイアウトも利用できます。レイアウトは動的に適用することができるため、アプリケーションを使用する環境と作業を最適化することが可能です。dwm はきわめて軽量かつ高速であり、C で書かれていてソースコードの行数を2000行以下から増やさないという設計目標を掲げています。xrandr や Xinerama によるマルチディスプレイもサポートしています。

インストール

ノート: ソースから dwm をコンパイルしない場合、dwm のカスタマイズはできません。ソースコードを編集して設定を変更することになっているためです。詳しくは #設定 を見て下さい。

dwmAUR パッケージをインストールしてください。もしくは ABSdwm-gitAUR (開発版) パッケージを使って、必要に応じてソースを変更して dwm をソースからコンパイルしてください。Xorg 用の軽量・高速なダイナミックメニューである dmenu もインストールすると良いでしょう。

dwm の起動

ディスプレイマネージャのメニューから Dwm を選択してください。

もしくは、startxSLiM ログインマネージャで dwm を起動する場合、以下を ~/.xinitrc に追加します:

exec dwm

設定

#インストール でも触れたように、dwm の設定はコンパイル時にソースコード (config.h, config.mk, dwm.c) を編集することで行います。

変更を加えたら、PKGBUILD のチェックサムを更新してください。PKGBUILD#md5sums を参照。もしくは、--skipinteg スイッチを付けて makepkg を実行することで整合性のチェックをスキップできます。

そして、dwm をコンパイル・インストールしてください:

$ makepkg -fi

設定の変更が正しく行われていれば、上記のコマンドで dwm がコンパイルされ、パッケージがビルド・インストールされます。問題が発生した場合は、出力を確認してください。

最後に、dwm を再起動することで変更が適用されます。

ヒント: 簡単に再コンパイルできるように .bashrc ファイルに alias redwm='cd ~/dwm; updpkgsums; makepkg -fi --noconfirm; killall dwm' と記述してエイリアスを作成しても良いでしょう。

パッチ

公式ウェブサイトには dwm に機能を追加する多数の パッチ を記載しています。これらのパッチは主として dwm.c ファイルに変更を加えますが config.h ファイルを変更することもあります。パッチの適用については、ABS でパッチを適用を見て下さい。

ウィンドウタイリングパッチ

デフォルトのタイリングモードでは縦に画面が分割されますが、Bottom Stack パッチは横方向に画面を分割するタイリングモードを追加します。同じく、bstack horizontal はタイルを水平に分割します。gaplessgrid パッチはウィンドウをグリッドのようにタイル化させることができます。

dwm ではデフォルトで、全てのタグに選択したレイアウトが適用されます。タグにあわせて異なるレイアウトを使うようにするには pertag パッチを使って下さい。

config.h のカスタマイズ

config.h ファイルには dwm の基本的な設定が保存されています。ほとんどの設定は特に説明しなくてもわかるはずです。設定に関する詳しい情報は dwm のウェブサイト を見て下さい。

カスタムキーバインド/ショートカットの追加

カスタムキーバインドを作成するには config.h に2つエントリが必要です。1つは /* commands */ セクションの下に記述し、もう1つは static Key keys[] = { セクションの下に記述します。

static const char *keybindname[]   = { "command", "flags", "arguments", NULL };

keybindname は何でもかまいません。command, flags, arguments も何でもかまいませんが "" で囲む必要があります。

例:

{ MODKEY, XK_key, spawn, {.v = keybindname } } would bind Mod+key to the command defined previously.

{ MODKEY|ShiftMask, XK_key, spawn, {.v = keybindname } } would bind Mod+Shift+key Use ControlMask for Ctrl key.

Single keys such as Fn or multimedia keys have to be bound with the hex codes obtainable from the program xev.

{ 0, 0xff00, spawn, {.v = keybindname } } would bind foo key 0xff00 to keybindname.

キーコードに関する情報は特別なキーボードキー#キーコードを見て下さい。

config.mk のカスタマイズ

警告: ソースからコンパイルしたソフトウェアを直接インストールするのは推奨されません。インストールしたファイルを pacman が追跡できなくなるからです。

config.mk ファイルは Makefile によって include されます。GNU make で dwm をコンパイル・実行する方法を設定できます。

パッケージを作成せずに、ソースから直接 dwm をインストールするときは、config.mk を変更して適当なプレフィックスを設定してください:

PREFIX を修正:

PREFIX = /usr

X11 include フォルダ:

X11INC = /usr/include/X11

X11 lib ディレクトリ:

X11LIB = /usr/lib/X11
ヒント: システム全体の dwm に影響を与えずに設定変更をテストしたいだけなら、 ${HOME}/.local のようなローカルディレクトリに PREFIX を変更します。もし、dwmAUR を使ってコンパイルしているのであれば、注意してください。PKGBUILDconfig.mk よりも優先されるので、代わりに PKGBUILD の PREFIX を変更する必要があります。- package() 関数を参照してください - そして、pkgname も変更する必要があります。

ステータスバーの設定

ノート: 以下の設定を使うには xorg-xsetroot パッケージのインストールが必要です。

Dwm はルートウィンドウの名前を読み取ってステータスバーに送信します。ルートウィンドウは他の全てのウィンドウが描画されるウィンドウで、ウィンドウマネージャによって作成されます。他のウィンドウと同じように、ルートウィンドウにもタイトル/名前が存在しますが、ルートウィンドウはバックグラウンドで動作するため基本的に名前は定義されていません。

dwm のステータスバーに表示したい情報は ~/.xinitrc や (ディスプレイマネージャを使っている場合) ~/.xprofilexsetroot -name "" コマンドを使うことで定義します。例:

xsetroot -name "Thanks for all the fish!"

動的に更新された情報は、バックグラウンドへ分岐するループに入れる必要があります。以下の例を参照してください。

# Statusbar loop
while true; do
   xsetroot -name "$( date +"%F %R" )"
   sleep 1m    # Update time every minute
done &

# Autostart section
pcmanfm & 

exec dwm

上記の場合 ISO 8601 形式で日付が表示され、起動時に PCManFM が実行されます。

ノート: 更新間隔をゼロに等しくしたり、"sleep" 行を完全に削除することは、CPU 使用率を大幅に上昇させるので推奨されません (その効果は toppowertop で観察して下さい)

ステータスバーのサンプルは suckless wiki にあります。

Conky ステータスバー

xsetroot -name を使うことでステータスバーに Conky を出力することができます:

(conky | while read LINE; do xsetroot -name "$LINE"; done) &
exec dwm

この場合、コンソールにテキストを出力するように Conky を設定する必要があります。以下はデュアルコア CPU で統計を表示させる conkyrc の例です:

conky.config = {
out_to_console = true,
out_to_x = false,
background = false,
update_interval = 2,
total_run_times = 0,
use_spacer = 'none',
};
conky.text = [[
$mpd_smart :: ${cpu cpu1}% / ${cpu cpu2}%  ${loadavg 1} ${loadavg 2 3} :: ${acpitemp}c :: $memperc% ($mem) :: ${downspeed eth0}K/s ${upspeed eth0}K/s :: ${time %a %b %d %I:%M%P}
]];

アイコンや色のオプションについては、dzen を見て下さい。

基本的な使い方

以下のセクションだけでなく、dwm の基本的な使用方法については dwm チュートリアル も見て下さい。

dmenu を使う

dmenu を起動するには、Mod1 + P を押します (Mod1 はデフォルトでは Alt キーです)。必要であればキーは変えられます。そして、トップバーに表示されるまで、実行したいバイナリの最初の文字列を入力します。左と右の方向キーでバイナリを選択してエンターを押します。

ウィンドウのコントロール

ウィンドウにタグを変更

ウィンドウのタグの変更は簡単です。カーソルをウィンドウに乗せて、ウィンドウをフォーカスされた状態にしてください。そして、Shift + Mod1 + x を押します。x はウィンドウを移動したいタグの番号に置き換えてください。デフォルトでは Mod1Alt キーになっています。

ウィンドウを閉じる

dwm を使ってウィンドウを終了するには、Shift + Mod1 + c を押して下さい。

ウィンドウレイアウト

デフォルトでは、dwm はタイルモードで動作します。これは、同じタグの新しいウィンドウが開くと、どんどん小さくなっていきます。ウィンドウは合わせて、常に画面全体を占めることになります(メニューバーを除く)。ただし、これ以外にも、フローティングと monocole mode の2つのモードがあります。フローティングモードは、タイル型でないウィンドウマネージャのユーザーにはおなじみのもので、ユーザーが好きなようにウィンドウを並べ替えることができます。monocole mode は、常に1つのウィンドウを表示し続けます。

フローティングモードに切り替えるには、単に Mod1 + F です。Mod1 は、デフォルトでは Alt キーです。フローティングモードになっているかどうかを確認するには、画面右上の番号付きタグの横に、次のようなものが表示されているはずです。><>.

monocole mode に切り替えるには、Mod1 + M monocole mode になっているかどうかは、カッコの中に M が表示されているか(そのタグでウィンドウが開かれていない場合)、カッコの中に数字が表示されているか(そのタグで開いているウィンドウの数に対応する)で確認できます。したがって、ウィンドウが1つも開かれていないタグは、[M] と表示され、'n' 個のウィンドウが開いているタグは、このように表示されます。[n].

タイルモードに戻るには、Mod1 + T です。次のようなマークが表示されます。[]= .

他のウィンドウレイアウトを使う方法は、#ウィンドウタイリングパッチを見て下さい。

dwm の終了

dwm を終了するには、Shift + Mod1 + q を押して下さい。

ヒントとテクニック

ログアウトやプログラムを終了しないで dwm を再起動

ログアウトやアプリケーションの終了をせずに dwm を再起動するには、起動スクリプトを while ループで dwm をロードするように変更または追加してください(下記参照)

while true; do
    # Log stderror to a file 
    dwm 2> ~/.dwm.log
    # No error logging
    #dwm >/dev/null 2>&1
done

dwm は通常の Mod-Shift-Q の組み合わせで、 他の X ウィンドウを破壊することなく再起動することができるようになりました。

上記のスタートアップスクリプトを別のファイル、例えば ~/bin/startdwm に置き、 ~/.xinitrc から実行するとよいでしょう。この時点から、Xセッションを終了したいときは、単に killall xinit を実行するか、便利なキーにそれをバインドします。あるいは、バイナリが変更された場合のみ dwm を再起動するように、 dwm セッションスクリプトを設定することもできます。 これは、設定を変更したり、dwm のコードベースを更新したりする場合に便利です。

# relaunch DWM if the binary changes, otherwise bail
csum=$(sha1sum $(which dwm))
new_csum=""
while true
do
    if [ "$csum" != "$new_csum" ]
    then
        csum=$new_csum
        dwm
    else
        exit 0
    fi
    new_csum=$(sha1sum $(which dwm))
    sleep 0.5
done

右 Alt キーを Mod4 (Windows キー) として使う

Mod4(スーパー/ウィンドウズキー)を MODKEY として使用する場合、右 Alt キー (Alt_R) を Mod4 として使用すると、同様に便利な場合があります。これにより、Alt_R+Enter でズームするような、片手で操作しにくいキー操作を行うことができるようになります。

まず、Alt_R に割り当てられているキーコードを確認してください:

xmodmap -pke | grep Alt_R

次に、スタートアップスクリプト (例:~/.xinitrc) に以下を追加します。必要ならキーコード 113 を前の xmodmap コマンドで集めた結果に変更します。

xmodmap -e "keycode 113 = Super_L"  # reassign Alt_R to Super_L
xmodmap -e "remove mod1 = Super_L"  # make sure X keeps it out of the mod1 group

そうすると、Super_L キーが押されたときに起動する関数も Alt_R キーが押されたときに起動するようになります。

ノート: config.h の #define オプションで modkey を切り替えることができます。

dwm のバーのフォントの周りの空白

デフォルトでは、dwm のバーではフォントのサイズが 2px 追加されます。これを変更するには、dwm.c の以下の行を変更してください:

bh = dc.h = dc.font.height + 2;

マウス追随フォーカスの無効化

マウス追随フォーカスを無効化するには、dwm.c の以下の行をコメントアウトします:

[EnterNotify] = enternotify,

非アクティブなウィンドウを最初にクリックすると、そのウィンドウにのみフォーカスが移動します。ウィンドウの内容(ボタン、フィールドなど)を操作するには、もう一度クリックする必要があります。また、複数のモニターを使用している場合、クリックしてもキーボードのフォーカスが他のモニターに切り替わらないことがあります。

特定のウィンドウをフロートさせる

環境設定ダイアログのような一部のウィンドウでは、ウィンドウをタイル状にすることは意味がなく、代わりにフリーフローティングにすべきです。たとえば、Firefox の環境設定ダイアログをフロートさせるには、config.h のルール配列に次のように追加します。:

 { "Firefox",     NULL,       "Firefox Preferences",        1 << 8,         True,     -1 },

トラブルシューティング

Java アプリケーションの挙動がおかしい問題の修正

JRE 6u20 現在、Java から dwm がウィンドウマネージャとして認識されないために、dwm で Java アプリケーションの挙動がおかしくなることがあります。マウスを離したときにメニューが閉じてしまうなどの問題が確認されています。まず、wmname パッケージをインストールしてください。

そして、wmname を使って Java が認識する WM の名前を設定します:

$ wmname LG3D
ノート: この設定を使うと Chromium など特定のプログラムをタイルにしたときに問題が起こることがあります。

上記の設定は永続的ではないため、上のコマンドを .xinitrc.xprofile に追加してください。

もしくは、/etc/profile.d/jre.shexport _JAVA_AWT_WM_NONREPARENTING=1 を有効にする方法もあります。

ターミナルウィンドウ周辺のギャップを修正する

ターミナルウィンドウの外側にデスクトップスペースの空きがある場合は、ターミナルのフォントサイズが原因である可能性があります。ギャップを埋める理想的なスケールが見つかるまでサイズを調整するか、config.hresizehints0 に切り替えます。

これにより、dwm は端末だけでなく、すべてのクライアントウィンドウからのサイズ変更要求を無視します。この回避策の欠点は、一部の端末で再描画の異常 (特にゴーストラインや早まったラインラップなど) が発生する可能性があることです。

または、 st ターミナルエミュレータを使用する場合は、 anysize パッチを適用して st を再コンパイルします。

参照