dwm
関連記事
dwm は Xorg の動的ウィンドウマネージャです。タイル・スタック・フルスクリーンレイアウトでウィンドウを管理し、さらにパッチを使うことで他のレイアウトも利用できます。レイアウトは動的に適用することができるため、アプリケーションを使用する環境と作業を最適化することが可能です。dwm はきわめて軽量かつ高速であり、C で書かれていてソースコードの行数を2000行以下から増やさないという設計目標を掲げています。xrandr や Xinerama による マルチディスプレイ もサポートしています。
インストール
dwm は、パッケージ dwmAUR または dwm-gitAUR でインストールできます。ビルドとインストールの 前に、必要な 設定 の変更を行ってください。makepkg を参照してください。
設定
dwm はコンパイル時にいくつかのソースファイル、特に config.h を編集することで設定します。これらの設定に関する詳細な情報は、同梱され、コメントが付いています。config.def.h と、dwm のウェブサイトの customisation section を参照してください。
公式サイトには、dwm に機能を追加するための パッチ が多数あります。これらのパッチは主に dwm.c ファイルを変更するものですが、必要に応じて config.h ファイルも変更されます。パッチの適用に関する情報は、パッケージにパッチを適用 の記事を参照してください。
起動
任意のディスプレイマネージャのメニューから Dwm を選択します。あるいは、startx で dwm を起動するには、exec dwm を ~/.xinitrc に追加し、他のプログラムも同様に実行するように前置きします、例えば、以下のようにします。
redshift -O3500; xset r rate 300 50; exec dwm
使い方
dwm の基本的な使い方については、dwm チュートリアル を参照してください。
ヒントとテクニック
ステータスバーの設定
ステータスバーのその他の例については、[1] を参照してください。
Dwm はルートウィンドウの名前を読み取ってステータスバーに送信します。ルートウィンドウは他の全てのウィンドウが描画されるウィンドウで、ウィンドウマネージャによって作成されます。他のウィンドウと同じように、ルートウィンドウにもタイトル/名前が存在しますが、ルートウィンドウはバックグラウンドで動作するため基本的に名前は定義されていません。
dwm のステータスバーに表示したい情報は ~/.xinitrc や (ディスプレイマネージャ を使っている場合) ~/.xprofile で xsetroot -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
上記の場合 RFC:3339 形式で日付が表示され、起動時に PCManFM が実行されます。
Conky ステータスバー
xsetroot -name を使うことでステータスバーに Conky を出力することができます:
(conky | while read LINE; do xsetroot -name "$LINE"; done) & exec dwm
'xsetroot' コマンドによって多くの PID を生成したくない場合は、次の C プログラムをコンパイルします:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <X11/Xlib.h>
int main(int argc, char * argv[])
{
Display * dpy = NULL;
Window win = 0;
size_t length = 0;
ssize_t bytes_read = 0;
char * input = NULL;
dpy = XOpenDisplay(getenv("DISPLAY"));
if (dpy == NULL)
{
fprintf(stderr, "Can't open display, exiting.\n");
exit(1);
}
win = DefaultRootWindow(dpy);
while ((bytes_read = getline(&input, &length, stdin)) != EOF)
{
input[strlen(input) - 1] = '\0';
XStoreName(dpy, win, input);
XFlush(dpy);
fprintf(stderr, "Input: %s", input);
fprintf(stderr, "\nbytes read: %ld\n", bytes_read);
}
free(input);
return 0;
}
このコードをファイル dwm-setstatus.c に保存し、コンパイルします:
$ gcc dwm-setstatus.c -lX11 -o dwm-setstatus
$PATH 内で 'dwm-setstatus' を移動します (/usr/local/bin など)
# mv dwm-setstatus /usr/local/bin
実行します:
$ conky | dwm-setstatus
これを行うには、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 を再起動するには、起動スクリプトを変更または追加して、例えば 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 サーバーが終了した後もログインしたままだとセキュリティに影響が出るので、exec でスクリプトを実行することを検討して下さい。詳しくは ログイン時に X を自動起動 を参照して下さい。これ以降、Xセッションを終了したいときは、単に killall xinit を実行するか、便利なキーバインドにそれをバインドしてください。また、バイナリが変更された場合のみ、dwm セッションスクリプトを再立ち上げするように設定することもできます。これは、設定を変更したり、dwm のコードベースを更新したりする場合に便利です。
# relaunch DWM if the binary changes, otherwise bail
csum=""
new_csum=$(sha1sum $(which dwm))
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 にバインドする
Mod4 (スーパー/Windows キー)を MODKEY として使用する場合、右 Alt キー (Alt_R) を Mod4 として使用すると、Alt_R+Enter でズームするような、不便なキーストロークを片手で実行できるようになります。
まず、Alt_R に割り当てられているキーコードを確認してください:
xmodmap -pke | grep Alt_R
次に、スタートアップスクリプト (例:~/.xinitrc) に以下を追加します。必要ならキーコード 113 を前の xmodmap コマンドで集めた結果に変更します。
Alt_R を Super_L に再割り当てします:
xmodmap -e "keycode 113 = Super_L"
X が "mod1" グループから除外されていることを確認します。
xmodmap -e "remove mod1 = Super_L"
これを実行すると、Super_L キーの押下によってトリガーされる機能はすべて、Alt_R キーの押下によってもトリガーされます。
DWM で Alt キーを両方 Meta として使用する
xmodmap を使って Alt_L を DWM のセカンダリメタキーとして割り当てます (Mod1Mask (Alt_R) を使って既に提供されています)
~/.xinitrc
/usr/bin/xmodmap -e "clear mod5" /usr/bin/xmodmap -e "keycode 108 = Alt_L"
dwm のバーのフォントの周りの空白
デフォルトでは、dwm のバーではフォントのサイズが 2px 追加されます。これを変更するには、dwm.c の以下の行を変更してください:
dwm.c
bh = dc.h = dc.font.height + 2;
マウス追随フォーカスの無効化
マウスの動作に従うフォーカスを無効にするには、構造体ハンドラーの定義内の次の行をコメントアウトします:
dwm.c
[EnterNotify] = enternotify,
非アクティブなウィンドウを最初にクリックすると、そのウィンドウにのみフォーカスが移動します。ウィンドウの内容(ボタン、フィールドなど)を操作するには、もう一度クリックする必要があります。また、複数のモニターを使用している場合、クリックしてもキーボードのフォーカスが他のモニターに切り替わらないことがあります。
特定のウィンドウをフロートさせる
環境設定ダイアログのような一部のウィンドウでは、ウィンドウをタイル状にすることは意味がなく、代わりにフリーフローティングにすべきです。たとえば、Firefox の環境設定ダイアログをフロートさせるには、config.h のルール配列に次のように追加します。:
{ "Firefox", NULL, "Firefox Preferences", 1 << 8, True, -1 },
dwm での Tilda の使用
Tilda はすべてのタグに追加され、フローティングに設定された場合に最もよく機能します。そのためには、config.h の中のルール配列に以下を追加してください。
{ "Tilda", NULL, NULL, 0, True, -1 },
-C オプションを指定して tilda を起動します:
$ tilda -C
これで、Tilda を設定できるようになりました。次のオプションが推奨事項として提供されます:
Font: Clean 9 Appearance: Height: 50%, Width: 70%, Centered Horizontally Extras: Enable Transparency Level 15 Animated Pulldown: 1500 usec, Orientation: Top Colors: Built-in Scheme "Green on Black" Scrolling: Scrollbar is on the left, 2000 lines scrollback Key Binding: F9
プルダウンアニメーションを有効にしないと、Tilda は非表示にするたびに下にジャンプしてしまいます。
スクリーンショットを撮る
scrot パッケージをインストールします。次に 2 つのスクリプトを作成します
/path/to/scripts/screenshot.sh
#!/bin/sh mkdir -p /path/to/pics && scrot /path/to/pics/%m-%d-%Y-%H%M%S.png
スクリーンショットの作成と
/path/to/scripts/screenshotsel.sh
#!/bin/sh mkdir -p /path/to/pics && scrot /path/to/pics/%m-%d-%Y-%H%M%S.png --select --line mode=edge
選択ボックスでスクリーンショットを作成するため。
実行権限を付与します。config.h に以下を追加します
static const Key keys[] = {
...
{ 0, XK_Print, spawn, SHCMD("/path/to/scripts/screenshot.sh") },
{ ShiftMask, XK_Print, spawn, SHCMD("/path/to/scripts/screenshotsel.sh") },
...
};
これは、スクリーンショットの撮影をプリントキーにマップし、選択ボックスでスクリーンショット撮影を shift + プリントキーにマップします。
マルチメディアキーのマッピング
config.h の先頭に追加し、
#include <X11/XF86keysym.h>
マルチメディアキーを使用する これで、一般的なタスクをこれらのキーにマップできます。
音量を調整する
pipewire パッケージをインストールします。config.h に、ミュートと音量の増減のコマンドを追加します。
static const char *up_vol[] = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "+10%", NULL };
static const char *down_vol[] = { "pactl", "set-sink-volume", "@DEFAULT_SINK@", "-10%", NULL };
static const char *mute_vol[] = { "pactl", "set-sink-mute", "@DEFAULT_SINK@", "toggle", NULL };
...
static const Key keys[] = {
...
{ 0, XF86XK_AudioMute, spawn, {.v = mute_vol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = down_vol } },
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = up_vol } },
...
};
明るさの調整
brightnessctl パッケージをインストールします。config.h に、画面を暗くしたり明るくしたりするためのコマンドを追加します。
static const char *brighter[] = { "brightnessctl", "set", "10%+", NULL };
static const char *dimmer[] = { "brightnessctl", "set", "10%-", NULL };
...
static const Key keys[] = {
...
{ 0, XF86XK_MonBrightnessDown, spawn, {.v = dimmer } },
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brighter } },
...
};
自動起動
パッチ が利用可能です。ハンドラーループに入る前に、~/.dwm/autostart_blocking.sh と ~/.dwm/autostart.sh & を実行します。これらのファイルの一方または両方を省略できます。
トラブルシューティング
Java アプリケーションの挙動がおかしい問題の修正
export _JAVA_AWT_WM_NONREPARENTING=1 を設定してみてください。wmname を使用して wmname "LG3D" を設定することも役立つかもしれません。
こちらも参照 Java#灰色のウィンドウ、ウィンドウマネージャでアプリがリサイズされない、メニューがすぐに閉じる
ターミナルウィンドウ周辺のギャップを修正する
ターミナルウィンドウの外側にデスクトップスペースの空きがある場合は、ターミナルのフォントサイズが原因である可能性があります。ギャップを埋める理想的なスケールが見つかるまでサイズを調整するか、config.h で resizehints を 0 に切り替えます。
これにより、dwm は端末だけでなく、すべてのクライアントウィンドウからのサイズ変更要求を無視します。この回避策の欠点は、一部の端末で再描画の異常 (特にゴーストラインや早まったラインラップなど) が発生する可能性があることです。
または、st ターミナルエミュレータを使用する場合は、anysize パッチを適用して st を再コンパイルします。
参照
- dwm の公式ウェブサイト
- dwm ビデオの紹介
- dmenu - dwm の開発者が作ったシンプルなアプリケーションランチャー
- dwm スレッド フォーラム
- dwm ハッキング スレッド
- dwm の壁紙は、フォーラムの wallpaper スレッド をご覧ください。
- dwm 設定を公開するフォーラムスレッド
- dwm: Tags are not workspaces