dwm
dwm (dynamic window manager の略) はsuckless.org による X11 向けの動的ウィンドウマネージャです。dwm は単一のバイナリであり、そのソースコードは決して 2000 SLOC を超えないように意図されています。
dwm は C 言語のソースコードを編集して、再コンパイルすることで設定されます。suckless web サイトでは、プロジェクトは経験豊かな上級者のコンピュータユーザに焦点を当てており、またおそらく冗談半分ですが、ソースコードを編集することによるカスタマイズは「そのユーザベースを小さく、エリート主義者に限定された状態を保っている」としています。
ウィンドウモデル
dwm は動的ウィンドウマネージャであり、ウィンドウをタイル型、モノクル型、およびフローティングレイアイトで管理します。すべてのレイアウトは、行うタスクと使用中のアプリケーションに応じて環境を最適化できるように、動的に適用することができます。
Shift+Alt+Enter でいくつか端末を起動してください。そうすると、dwm はウィンドウをマスタ (master) とスタック (stack) に分けてタイル表示するでしょう。新しい端末はマスタウィンドウに現れます。既存のウィンドウは画面右側のスタックへと押いやられます。Alt+Enter はマスタとスタックの間でウィンドウを切り換えます。
+------+----------------------------------+--------+ | tags | title | status + +------+---------------------+------------+--------+ | | | | | | | | | | | | | master | stack | | | | | | | | | | | | | +----------------------------+---------------------+
インストール
USE フラグ
USE flags for x11-wm/dwm a dynamic window manager for X11
savedconfig
|
Use this to restore your config from /etc/portage/savedconfig ${CATEGORY}/${PN}. Make sure your USE flags allow for appropriate dependencies |
xinerama
|
Add support for querying multi-monitor screen geometry through the Xinerama API |
後で編集するために、カスタマイズされた設定ファイルを /etc/portage/savedconfig/x11-wm/dwm-6.0.h に保存するには、savedconfig
USE フラグの有効化を検討すべきです。
root #
euse --enable savedconfig
複数のモニタで使用する場合は、Xinerama を使用するかしないかにかかわらず、xinerama
USE フラグを有効化すべきです。
root #
euse --enable xinerama
Emerge
x11-wm/dwm をインストールしてください:
root #
emerge --ask x11-wm/dwm
設定
開始
dwm を開始するには、ディスプレイマネージャまたは startx コマンドを使用してください。
startx を選択した場合は、次のファイルを作成する必要があります:
exec dbus-launch --sh-syntax --exit-with-session dwm
メインの dwm 設定ファイル (dwm.h ファイル)
先述したように、メインの dwm 設定ファイルは /etc/portage/savedconfig/x11-wm/dwm-6.0 ファイルであり、このファイルへの変更を反映させるには、変更のたびに dwm を再コンパイルする必要があります。
エディタが適切に C コードのためのシンタックスハイライトを表示できるようにするには、C ヘッダファイル名拡張子を使用するシンボリックリンクを作成してください。
root #
ln -s /etc/portage/savedconfig/x11-wm/dwm-6.0 /etc/portage/savedconfig/x11-wm/dwm-6.0.h
または、拡張子とは関係なくファイルに対して使用するシンタックスハイライトを変更する方法についての、選択したエディタのドキュメンテーションを参照してください。
再コンパイル後に新しい設定を使用するためには、すでに dwm セッションの中にいる場合は、dwm を終了 (Mod+Shift+Q) してリロードすることで、メモリ内の現在実行中のバイナリを置き換えてください。
設定ファイル (dwmrc)
Gentoo Ebuild によって提供されるデフォルトの xsession ファイル (/etc/X11/Sessions/dwm) は、システム負荷および日時か、~/.dwm/dwmrc にユーザが置いたシェルコードの結果を表示する、デフォルトのステータスボックスを提供します。ウィンドウマネージャのバー内のステータスボックスにテキストを送信するための (dwm-6.0 時点での) 現在のメカニズムは、上述のデフォルト xsession によって示される通り、'xsetroot' を使用するものです。数行のシェルコードを使用することで、このメカニズムを使用してステータスバーに任意のテキストを送信することができます (例えば CPU 温度、音楽プレイヤーの現在のトラック、未読 e メール件数、など)。
追加の機能
dmenu は X のための動的メニューで、当初は dwm のために設計されました。
インストール
Emerge
dmenu をインストールしてください:
root #
emerge --ask x11-misc/dmenu
設定
dmenu のオプションは dwm.h ファイルを使用してカスタマイズできます。例えばメニューをディスプレイの下部に表示するには:
static const char *dmenucmd[] = { "dmenu_run", "-b", "-fn", font, "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL };
使い方
デフォルトでは Alt + P キーでメニューを有効化します。
追加のステータス情報
dwm のメニューバーに追加のステータス情報を表示するには x11-apps/xsetroot を使用すべきです。これは右上隅のテキスト情報を設定します。
まず、まだインストールしていない場合は x11-apps/xsetroot をインストールしてください。
そして、dwm ステータスに現在の情報を繰り返し表示するために、スクリプトまたはサイドプログラムを使用してください。
root #
emerge --ask x11-apps/xsetroot
Conky
例えば、システムについての現在の情報を表示するために Conky を試してみてください。テキスト情報のみが dwm インスタンスへとパイプされるように、 -X
USE フラグ付きでインストールするのがよいでしょう。(考慮すべき USE フラグは "-X hddtemp iostats wifi" です。)
root #
emerge --ask app-admin/conky
~/.config/conky/conky.conf ファイルの例。設定ファイルは 2 つのセクションに分けられます: conky.config
と conky.text
です。conky.config
セクションは Conky に関連するオプションを含む一方で、conky.text
セクションは何の情報をどのように表示するかを定義します。使用中のシステム上で Conky を使用するには、システムによって異なることがあるネットワークインターフェースまたはハードドライブへのパスなど、conky.text
セクション内の設定をいくつか修正する必要があるかもしれません。
conky.config = {
background = no,
format_human_readable = yes,
out_to_console = yes,
temperature_unit = celsius,
total_run_times = 0,
update_interval = 1,
#use_spacer = left,
use_spacer = none,
};
conky.text = [[
M ${memperc}%/${swapperc}% | \
/sda ${diskio sda} /sdb ${diskio sdb} \
/sdc ${diskio sdc} | \
${if_existing /proc/net/route ppp0}P0 U ${upspeed ppp0} D ${downspeed ppp0} |${endif}\
${if_existing /proc/net/route eth0}E0 U ${upspeed eth0} D ${downspeed eth0} |${endif}\
${if_existing /proc/net/route wlan0}W0 U ${upspeed eth0} D ${downspeed eth0}\
${wireless_ap wlan0} ${wireless_link_qual_perc wlan0} ${endif}\
CPU ${hwmon 1 temp 1}F \
/sda ${hddtemp /dev/sda}F \
/sdb ${hddtemp /dev/sdb}F \
${time %a, %b %d %Y %H:%M (%z)}
]]
以前に Conky を使用したことがある場合、波括弧と等号を使った新しい構文に注意してください。
先述した ~/.xinitrc ファイル内の dwm コマンドの実行の前に、行を追加してください。
conky | while read -r; do xsetroot -name "$REPLY"; done &
exec ck-launch-session dbus-launch --sh-syntax --exit-with-session dwm
カスタムスクリプト
サイドプログラムを emerge する代わりに、日付、時刻、天気、その他のシステム情報を表示する単純なループを作成することもできます。
例えば天気と日付と時刻をを表示するには、~/.scripts/ にシェルスクリプトファイルを作成してください:
#!/bin/sh
let loop=0
while true; do
if [[ $loop%300 -eq 0 ]]; then
weather="$(curl 'https://wttr.in?format=1')"
let loop=0
fi
xsetroot -name " $weather | $(date '+%b %d %a') | $(date '+%H:%M') "
let loop=$loop+1
sleep 1
done
このスクリプトは単体でループ実行されるので、~/.xinitrc ファイル内で xroot に設定するだけでよいです。
. ~/.scripts/xsetloop.sh &
exec ck-launch-session dbus-launch --sh-syntax --exit-with-session dwm
使い方
キーと機能
すべての (デフォルトの) dwm キーバインディングは、dwm.h で定義される特定の MODKEY
とともに動作します。MODKEY
のデフォルト値は Mod1Mask
で、これは PC キーボードでは Alt のことです。この記事の以降の部分では、MODKEY
を表すために Mod を使用します。
ウィンドウを手動で移動する
ウィンドウを他のウィンドウタグに手動で移動するには、Mod キーを押しながらウィンドウ上のどこかを左クリックしてください。そして、Mod を押したまま、ウィンドウを移動させたい先のウィンドウタグをクリックしてください。
デフォルトショートカット
これらのショートカットは x11-wm/dwm のデフォルトとして使用されています。
ウィンドウ管理
- Mod+2 - ウィンドウタグ番号 2 を表示します。
- Mod+Shift+1-9 - ウィンドウにマウスをホバーさせてこのキーを押すと、ウィンドウを指定されたタグ番号に配置します。
- Mod+Shift+0 - ウィンドウにマウスをホバーさせてこのキーを押すと、ウィンドウをすべてのタグ番号に配置します。
ユーティリティ
- Mod+Shift+Enter - 端末を起動する
- Mod+Shift+C - ウィンドウを閉じる
- Mod+P - dmenu
- Mod+J または Mod+K - 別の端末に移動する。
- Mod+Enter - ウィンドウをスタックとマスタの間で入れ替える。
- Mod+Shift+Q - dwm を終了する
レイアウト変更
- Mod+F - レイアウトをフロート型に変更する。
- Mod+T - レイアウトをタイル型に変更する。
音量キー
"..." は x11-wm/dwm にファイル終端以外に含めることを意味します。
以下の行をコンフィグファイルに追加して、dwm を再 emerge してください:
#include <X11/XF86keysym.h>
...
/* commands */
static const char *upvol[] = { "amixer", "set", "Master", "2+", NULL };
static const char *downvol[] = { "amixer", "set", "Master", "2-", NULL };
// for muting/unmuting //
static const char *mute[] = { "amixer", "-q", "set", "Master", "toggle", NULL };
// for pulse compatible //
static const char *upvol[] = { "amixer", "-q", "sset", "Master", "1%+", NULL };
static const char *downvol[] = { "amixer", "-q", "sset", "Master", "1%-", NULL };
static const char *mute[] = { "amixer", "-q", "-D", "pulse", "sset", "Master", "toggle", NULL };
...
static Key keys[] = {
/* modifier key function argument */
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = upvol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = downvol } },
{ 0, XF86XK_AudioMute, spawn, {.v = mute } },
カスタマイズ
dwm はそのソースコードを編集することでカスタマイズされます
(ユーザのヒントと小技をここに書いてください。)
パッチ
Gentoo には dwm にパッチを当てるための固有の方法があります。パッチがすでに dwm ソースとマージできる状態であれば、emerge プロセス中に呼び出すことができる eapply_user
という特別な関数があります。この関数によって、ユーザパッチをソースに適用することができるようになります。必要なパッチを以下の 2 つの場所のうちいずれかに移動してください:
- /etc/portage/patches/category/application
- ebuild リポジトリ
/etc/portage/patches/category/application 内のパッチ
まず以下のディレクトリを作成してください:
root #
mkdir -p /etc/portage/patches/x11-wm/dwm
dwm パッチを /etc/portage/patches/x11-wm/dwm/ にコピーして、各パッチの先頭に数値を付けてください (01-name_of_patch.patch のように)。また、ファイル名は .patch
または .diff
で終わる必要があります。さもないと Portage はそれを適用しないでしょう。以下の例では、larry という名前のユーザのホームディレクトリ (/home/larry) にパッチが置かれていると仮定しています。
root #
cp /home/larry/01-dwm.6.0-xft.patch /etc/portage/patches/x11-wm/dwm/
それでは dwm をインストールしてください。パッチの適用は emerge が面倒を見てくれます
root #
emerge --ask x11-wm/dwm
Portage で使用するように構成された ebuild リポジトリ内にパッチを置く
dwm パッチのための ebuild リポジトリを作成することで、それらを別のマシンと共有したり、公開したいときに、役立てることができます。
x11-wm/dwm を /var/db/repos/gentoo/ から新しい ebuild リポジトリに、あるいは適切なリポジトリがあればそちらに、コピーしてください。
files ディレクトリ内にパッチを配置してください (この例では、これらのファイルを保持するために作成されたリポジトリは "dwm_patches" と名付けられています):
root #
cp /home/larry/01-dwm-6.0-xft.diff /var/db/repos/dwm_patches/x11-wm/dwm/files/
ebuild ファイル /var/db/repos/dwm_patches/x11-wm/dwm/dwm-6.1.ebuild をテキストエディタで開き、自動適用させるために PATCHES 変数配列にパッチを列挙してください:
PATCHES=( "${FILESDIR}/01-dwm-6.0-xft.diff"
"${FILESDIR}/02-dwm-6.1-x11.diff"
)
emerge を実行して楽しんでください
root #
emerge --ask x11-wm/dwm
アプリケーションをウィンドウタグに割り当てる
ユーザは、例えば MPlayer ウィンドウタグ 5 番で開始するなどのように、お気に入りのアプリケーションをそれぞれ異なるウィンドウタグで開始させることができます。
まず、dwm がこのウィンドウの開始時に気づくことができるように、Xorg によって記録されるアプリケーションの名前を調べてください。これを調べるには、対象アプリケーション (この例では MPlayer) を開始して、xprop コマンド (x11-apps/xprop) を実行してください。MPlayer ウィンドウをクリックすると、xprop はその MPlayer ウィンドウについての Xorg のデータを報告するでしょう。WM_CLASS(STRING)
行で識別される 2 番目のウィンドウ名を使用してください。これで dwm が気づく必要があるウィンドウの名前が分かりました。
場合によっては、アプリケーションがそれ自身のウィンドウを複数持ち、大文字を含むウィンドウと大文字を含まないウィンドウを報告することがあるでしょう。ウィンドウ名の中ではワイルドカード文字を使用することができます。
static const Rule rules[] ={
{ "MPlayer", NULL, NULL, 1 << 4, True, 0 },
};
トラブルシューティング
dwm-6.0 にアップグレードする
dwm-5.9 から dwm-6.0 へのアップグレードは多数の変更を取り込んでいるため、dwm-6.0 をコンパイルするために以前の config.h を使用することはおそらく問題となるでしょう。表示されると思われる問題は、コンパイラのエラーメッセージ "'nmaster' undeclared" かもしれません。解決するためには、カスタム config.h ファイルを使用せずに dwm-6.0 をコンパイルおよびインストールした後、デフォルトの dwm-6.0 config.h ファイルを見つけて古い config.h ファイルとの差分を確認してください。(デフォルトの dwm-6.0 config.h ファイルを取得するためには dwm-6.0 の tarball を展開することもできます。)
"Permission Denied" エラーを修正する
非特権ユーザとして X セッションを開始するためには、systemd または elogind のような logind プロバイダが実行中でなくてはなりません。logind プロバイダが実行中でない状態で startx を実行すると、dwm は起動に失敗し、次のようなメッセージが現れます:
(EE) parse_vt_settings: Cannot open /dev/tty0 (Permission denied)
そのような場合、かつシステムが OpenRC ベースである場合は、elogind を boot に追加してサービスを開始してください:
root #
rc-update add elogind boot
root #
/etc/init.d/elogind start
さらなる情報については、Non root Xorg wiki ページを参照してください。
mod キーを再マップする
dwm デフォルトの Alt が他のコンソールインターフェースアプリケーションと競合している場合は、コンソールアプリケーション内では Esc を使用してください。Esc はいつでも使用できるフォールバックのエスケープキーです。もう一つの選択肢としては、Super (Windows) キーなどの、Space の近くにある他の追加のキーを使用するように、Mod キーを再定義することができます。
#define MODKEY Mod4Mask /* Use Super Key */
キーボードの両側に Mod キーを持つことができるように、2 個目の Mod キーを割り当てるためには、このキーのアクティビティをキーボード上の他のキーに模倣させてください。Microsoft キーボード上の Microsoft メニューキー (あるいはコンテキストメニューキー) は、Super (Windows) の丁度反対側にあります。このためには、x11-apps/xmodmap パッケージが必要です。(参考までに、MS NEK4000 キーボード上ではこれら 2 個のキーの値はそれぞれ showkey 125/127
と xev 133/135
です。)
# $HOME/.xinitrc ファイルの先頭がこの設定を書くのに良い場所です。
# 以下は、MS NEK4000 右メニューキーも DWM Mod4Key をシミュレートするように再割り当てします。
xmodmap -e "keycode 135 = Super_L" # MS メニューキー押下を Super_L に再割り当て
xmodmap -e "remove mod1 = Super_L" # X が Super_L を mod1 グループから除外していることを保証する
これで、競合もせず容易にアクセスできる Mod キーがキーボードの両側に得られるはずです!
Java アプリケーションの誤動作を修正する
Java は使用されている WM を知らないことから、Java ベースのアプリケーションは誤動作することが知られています。これは特定の Java アプリケーションの GUI が正常に機能しない結果につながります。これを解決するためには、ウィンドウマネージャの名前をルートウィンドウに適切に設定する必要があります。これは wmname ツールを使用して、LG3D
に設定することで行えます。
ツールをインストールしてください:
root #
emerge --ask x11-misc/wmname
そして適切な名前を設定してください:
user $
wmname LG3D
この設定を永続的なものにするには、このコマンドを ~/.xinitrc に追加してください。
AWT を使用する Java アプリケーションがある場合は、下で示す通り、AWT_TOOLKIT を export するのも有用です。
Java アプリケーションの空の (灰色の) ウィンドウ
Apache NetBeans などの Java ベースのアプリケーションは、適切に描画されません。この問題を回避するためには、AWT_TOOLKIT 変数を次のように設定してください:
user $
AWT_TOOLKIT=MToolkit; export AWT_TOOLKIT
この操作を永続的なものにするためには、~/.xinitrc などのスタートアップスクリプトにコマンドを追加する必要があります。
背景が再描画されない
現在のビューを切り換えたときに、背景が正しく再描画されないことがあります。例えば st などの一部の端末エミュレータは、自身に割り当てられたウィンドウ領域全体を再描画しません。このような場合は、X ルートウィンドウが適切に定義済みの色を持っていなくてはなりません。これは xsetroot コマンドで行うことができます。例えば:
user $
xsetroot -solid black