dwm

提供: ArchWiki
2023年11月18日 (土) 15:36時点におけるKgx (トーク | 投稿記録)による版 (→‎ステータスバーの設定: 情報を更新)
ナビゲーションに移動 検索に移動

関連記事

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

インストール

dwm は、パッケージ dwmAUR または dwm-gitAUR でインストールできます。ビルドとインストールの 前に、必要な 設定 の変更を行ってください。makepkg を参照してください。

ノート: アップストリームの手順 に従うこともできますが、pacman がファイルを追跡せずにファイルをインストールします。

設定

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] を参照してください。

ノート: 以下の設定を使うには 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 で観察して下さい)

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 を再起動するには、起動スクリプトを変更または追加して、例えば 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(スーパー/ウィンドウズキー)を 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 で Alt キーを両方 Meta として使用する

xmodmap を使って Alt_L を DWM のセカンダリメタキーとして割り当てます (Mod1Mask (Alt_R) を使って既に提供されています)。

~/.xinitrc
/usr/bin/xmodmap -e "clear mod5"
/usr/bin/xmodmap -e "keycode 108 = Alt_L"

link blog

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 },

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

これらの設定を ~/.config/tilda/config_0 で行った後の設定は以下のようになります。

tilda_config_version = "0.9.6"
# image = ""
# command = ""
font = "Clean 9"
key = "F9"
title = "Tilda"
background_color = "white"
# working_dir = ""
web_browser = "firefox"
lines = 2000
max_width = 956
max_height = 384
min_width = 1
min_height = 1
transparency = 15
x_pos = 205
y_pos = 1
tab_pos = 0
backspace_key = 0
delete_key = 1
d_set_title = 3
command_exit = 2
scheme = 1
slide_sleep_usec = 1500
animation_orientation = 0
scrollbar_pos = 0
back_red = 0
back_green = 0
back_blue = 0
text_red = 0
text_green = 65535
text_blue = 0
scroll_background = true
scroll_on_output = false
notebook_border = false
antialias = true
scrollbar = false
use_image = false
grab_focus = true
above = true
notaskbar = true
bold = true
blinks = true
scroll_on_key = true
bell = false
run_command = false
pinned = true
animation = true
hidden = true
centered_horizontally = true
centered_vertically = false
enable_transparency = true
double_buffer = false

プルダウンアニメーションを有効にしないと、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 アプリケーションの挙動がおかしい問題の修正

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 を再コンパイルします。

参照