dwm

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Dwm and the translation is 100% complete.
Other languages:

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

設定

開始

The information in this section is probably outdated. You can help the Gentoo community by verifying and updating this section.

dwm を開始するには、ディスプレイマネージャまたは startx コマンドを使用してください。

startx を選択した場合は、次のファイルを作成する必要があります:

ファイル ~/.xinitrc
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

dmenu は X のための動的メニューで、当初は dwm のために設計されました。

インストール

Emerge

dmenu をインストールしてください:

root #emerge --ask x11-misc/dmenu
設定

dmenu のオプションは dwm.h ファイルを使用してカスタマイズできます。例えばメニューをディスプレイの下部に表示するには:

ファイル /etc/portage/savedconfig/x11-misc/dmenu-4.9.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.configconky.text です。conky.config セクションは Conky に関連するオプションを含む一方で、conky.text セクションは何の情報をどのように表示するかを定義します。使用中のシステム上で Conky を使用するには、システムによって異なることがあるネットワークインターフェースまたはハードドライブへのパスなど、conky.text セクション内の設定をいくつか修正する必要があるかもしれません。

ファイル ~/.config/conky/conky.conf
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 コマンドの実行の前に、行を追加してください。

ファイル ~/.xinitrc
conky | while read -r; do xsetroot -name "$REPLY"; done &
exec ck-launch-session dbus-launch --sh-syntax --exit-with-session dwm

カスタムスクリプト

サイドプログラムを emerge する代わりに、日付、時刻、天気、その他のシステム情報を表示する単純なループを作成することもできます。

例えば天気と日付と時刻をを表示するには、~/.scripts/ にシェルスクリプトファイルを作成してください:

ファイル ~/.scripts/xsetloop.sh
#!/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 に設定するだけでよいです。

ファイル ~/.xinitrc
. ~/.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 してください:

ファイル /etc/portage/savedconfig/x11-wm/dwm-6.0
#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 内のパッチ

まず以下のディレクトリを作成してください:

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 変数配列にパッチを列挙してください:

ファイル /var/db/repos/dwm_patches/x11-wm/dwm-6.1.ebuild
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 が気づく必要があるウィンドウの名前が分かりました。

メモ
場合によっては、アプリケーションがそれ自身のウィンドウを複数持ち、大文字を含むウィンドウと大文字を含まないウィンドウを報告することがあるでしょう。ウィンドウ名の中ではワイルドカード文字を使用することができます。
ファイル /etc/portage/savedconfig/x11-wm/dwm-6.0.h
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 キーを再定義することができます。

ファイル /etc/portage/savedconfig/x11-wm/dwm-6.0.h
#define MODKEY Mod4Mask         /* Use Super Key */

キーボードの両側に Mod キーを持つことができるように、2 個目の Mod キーを割り当てるためには、このキーのアクティビティをキーボード上の他のキーに模倣させてください。Microsoft キーボード上の Microsoft メニューキー (あるいはコンテキストメニューキー) は、Super (Windows) の丁度反対側にあります。このためには、x11-apps/xmodmap パッケージが必要です。(参考までに、MS NEK4000 キーボード上ではこれら 2 個のキーの値はそれぞれ showkey 125/127xev 133/135 です。)

ファイル $HOME/.xinitrc
# $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