dwm

出自 Arch Linux 中文维基

dwmX下的一個動態窗口管理器。它用平鋪的、棧式的和全屏的布局方式,藉助一些可選的補丁還可以實現其他的布局。布局可以動態得改變,為程序提供最優的環境和性能。dwm特別輕量快速,用C語言編寫,被設計的目標是控制在2000行以下的代碼。在xrandr和Xinerama支持下可實現multi-head。

安裝[編輯 | 編輯原始碼]

dwm可以通過dwmAURdwm-gitAUR安裝,可在編譯安裝前配置所需的更改,參閱makepkg

注意: 也可遵循上遊說明,但pacman將無法對其進行跟蹤。

配置[編輯 | 編輯原始碼]

dwm通過在編譯時修改它的配置文件的一部分源代碼來進行配置,特別是config.h。有關這些配置的詳細信息,請參閱包含的、注釋良好的 config.def.h以及網站上的自定義部分

官方網站上有一些補丁可以為dwm添加額外功能。這些補丁主要對 dwm.c文件進行更改,但也會在適當的情況下對 config.h文件進行更改。有關應用修補程序的信息,請參閱Patching packages一文。

啟動dwm[編輯 | 編輯原始碼]

從所選display manager的菜單中選擇「Dwm」。或者,用startx exec dwm附加到 ~/.xinitrc並預先編寫其他程序來執行它們,例如:

redshift -O3500; xset r rate 300 50; exec dwm

配置狀態條[編輯 | 編輯原始碼]

dwm使用根窗口名稱來顯示狀態條信息,可以使用xsetroot -name來改變。

基本狀態條[編輯 | 編輯原始碼]

這個例子顯示ISO 8601格式的日期。把下邊的內容添加到~/.xinitrc或者~/.Xclients,或者可以從GDM-3的討論頁中獲得更多細節:

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

這是個筆記本使用的,依賴acpi包來顯示電池信息:

while true ; do
    xsetroot -name "$( acpi -b | awk '{ print $3, $4 }' | tr -d ',' )"
    sleep 1m
done &
exec dwm

這個腳本顯示電池剩餘電量和充電狀態,用awk命令過濾acpi輸出的無用信息,然後用tr去除逗號。

另一個方式是根據電池的狀態選擇性地輸出信息:

while true; do
        batt=$(LC_ALL=C acpi -b)

        case $batt in
        *Discharging*)
                batt="${batt#* * * }"
                batt="${batt%%, *} "
                ;;
        *)
                batt=""
                ;;
        esac

        xsetroot -name "$batt$(date +%R)"

        sleep 60
done &

exec dwm

最後,要確保在~/.xinitrc或者~/.Xclients裡只有一個dwm實例, 所以把整合起來應該像這樣:

~/.setbg
autocutsel &
termirssi &
urxvt &

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

這是另一個顯示alsa音量和電池狀態的例子。它一直顯示到系統退出為止。

#set statusbar
while true
do
   if acpi -a | grep off-line > /dev/null; then
       xsetroot -name "Bat. $( acpi -b | awk '{ print $4 " " $5 }' | tr -d ',' ) | Vol. $(amixer get Master | tail -1 | awk '{ print $5}' | tr -d '[]') | $(date +"%a, %b %d %R")"
   else
       xsetroot -name "Vol. $(amixer get Master | tail -1 | awk '{ print $5}' | tr -d '[]') | $(date +"%a, %b %d %R")"
   fi
   sleep 1s   
done &

Conky狀態條[編輯 | 編輯原始碼]

Conky可以使用xsetroot -name來往狀態條裡輸出信息:

conky | while read -r; do xsetroot -name "$REPLY"; done &
exec dwm

要想這樣做,conky需要只往終端裡輸出文本。這是個應用於dual core CPU的簡單conkyrc,顯示幾個狀態信息:

out_to_console yes
out_to_x no
background no
update_interval 2
total_run_times 0
use_spacer none

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}

狀態條顏色[編輯 | 編輯原始碼]

可以在config.def.h中更改,然後複製到config.h中。

static const char col_gray1[]       = "#000000"; #狀態條底色
static const char col_gray2[]       = "#FFFFFF"; #當static const unsigned int borderpx不為0時,非活動窗口外邊框顏色
static const char col_gray3[]       = "#39C5BB"; #當前非活動的title字體顏色
static const char col_gray4[]       = "#7FFF00"; #當前活動的title字體顏色
static const char col_cyan[]        = "#696969"; #title底色

static const unsigned int borderpx也是config.def.h的選項,不為0時,會在窗口邊緣產生邊框

基本用法[編輯 | 編輯原始碼]

使用dmenu[編輯 | 編輯原始碼]

Dmenu是dwm的一個有用的擴展。它不是一個單獨的列表式菜單,而是生成一個可執行文件的列表並根據輸入進行自動補全。比起許多程序啟動器,它能與dwm更好地整合。

可以按 Mod1 + P 來啟動Dmenu(Mod1 缺省是 Alt )。當然你也可以按自己的喜好改變它。然後只需要在上邊出現的工具條中輸入你想運行的程序的前幾個字母,也可以按左右箭頭在進行選擇,按回車鍵完成。

更詳細的信息請查閱 dmenu.

控制窗口[編輯 | 編輯原始碼]

將窗口移動到另一個tag[編輯 | 編輯原始碼]

將當前的活動窗口移到其他的標籤頁:Shift + Mod1 + x, 其中的x是其他的標籤頁的序號,如果x是5,則表示將當前的活動窗口移到第5號標籤頁上去。Mod1 缺省是 Alt 鍵,這個鍵值可以在config.h中定義。

關閉窗口[編輯 | 編輯原始碼]

關閉當前的活動窗口: Shift + Mod1 + C.

窗口布局[編輯 | 編輯原始碼]

dwm缺省工作在平鋪模式。當新窗口不斷出現在同一個標籤頁時,窗口會越來越小。所有窗口會占滿整個屏幕(除了目錄條)。然而還有其他兩種模式:浮動和單頁模式。浮動模式對非平鋪窗口管理器用戶來說更熟悉,它允許用戶重新按自己需要擺放窗口。單頁模式會讓一個窗口在最上邊。

要切換到浮動模式,只需要按Mod1 + FMod1缺省是 Alt。如果你看到標籤頁右上角有X>這樣的標誌,就進行了浮動模式。

切換到單頁模式,按 Mod1 + M。檢查上否在單頁模式,你會看到[M]標誌(如果當前標籤頁無窗口),或者[n](n是打開窗口的編號)。

回來平鋪模式,按Mod1 + T,你會看到 []= 這樣的標誌。

退出dwm[編輯 | 編輯原始碼]

退出dwm(登出): Shift + Mod1 + Q.

官方關於默認的快捷鍵的說明: dwm tutorial.

再次說明,快捷鍵可以根據自己的喜好自由定義,本維基中的快捷鍵都是指官方默認的快捷鍵。

擴展使用[編輯 | 編輯原始碼]

補丁和增加窗口布局(tiling modes)[編輯 | 編輯原始碼]

DWM官網上有很多可以給DWM添加功能的補丁, 用戶可以通過補丁定製DWM。

bottomstack補丁能夠使DWM由原來的垂直布局變為水平布局,而gapless grid補丁則可使窗口變為網格狀布局.

實現為每個標籤定製布局[編輯 | 編輯原始碼]

dwm的缺省行為是將當前選定的布局應用到所有標籤上。如果想為每個標籤定製布局可以打pertag這個補丁。

解決模擬終端窗口縫隙問題[編輯 | 編輯原始碼]

如果你發現模擬終端(例如xterm,Urxvt)的窗口占不滿屏幕,這是因為其窗口的大小和字體有關。你可以試圖調整字體大小直到恰好合適為止(這也許是很困難的),或者只需要把config.h 文件中的 resizehints 設置為 False:

static Bool resizehints = False; /* False means respect size hints in tiled resizals */

這樣dwm會忽略所有窗口的改變大小的請求,不只是模擬終端的。這樣的缺點是一些模擬終端可能會刷新異常,像顯示一些錯誤的內容。

在不登出和退出程序程序的情況下重啟dwm[編輯 | 編輯原始碼]

如果你要在在線重啟dwm(不關閉它以及其他應用程序),修改啟動腳本,並讓dwm在一個while循環中運行,像這樣:

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

這樣就可以用Mod-Shift-Q快捷鍵來實現重啟。

把上邊的內容寫到一個其他的文件(例如~/bin/startdwm)是一個好主意。然後在 ~/.xinitrc 文件裡添加(exec startdwm)。這樣我們可以使用 killall startdwm 來真正地退出X會話,或者綁定到一個方便的快捷鍵上。

把右Alt鍵作為Mod4(Win鍵)使用[編輯 | 編輯原始碼]

當把Mod4(Win鍵)作為 MODKEY 時,你可能希望右Alt鍵也可以作為Mod4,這樣就兩個手都可以按到了

首先,找到右Alt鍵對應的鍵碼:

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

現在,右Alt鍵就和Mod4鍵一樣了。

防止鼠標下的程序自動獲取焦點[編輯 | 編輯原始碼]

為了防止鼠標下的程序自動獲取焦點,可以注釋掉dwm.c中的如下代碼:

[EnterNotify] = enternotify,

添加自定義的快捷鍵綁定[編輯 | 編輯原始碼]

config.h 文件中的兩個地方涉及到創建修改快捷鍵,一個是"/* */" 注釋中,並一個是"static Key keys[] = {"語句中。

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

<keybindname> 可以是任何東西, <command> <-flags> and <arguments> 也是,但要用雙引號括起來。

{ MODKEY,            XK_<key>,      spawn,          {.v = <keybindname> } },

這會綁定 Mod+<key> 來執行之前定義的命令。

{ MODKEY|ShiftMask,  XK_<key>,      spawn,          {.v = <keybindname> } },

這會綁定 Mod+Shift+<key> ,使用要用Ctrl鍵是 ControlMask 。

單個按鍵像Fn或者多媒體鍵必須要用16進制數來表示,可以用xev程序來獲得。或者查看 /usr/include/X11/XF86keysym.h 中的定義。

{ 0,                 0xff00,    spawn,       {.v = <keybindname> } },

這會把0xff00鍵綁定到<keybindname>。

解決Java程序不正常的問題[編輯 | 編輯原始碼]

對於使用JRE 6u20的Java程序在dwm中可能表現異常,因為dwm不是Java的一個已知的窗口管理器,這會導致一些像鼠標釋放使菜單消失之類的小問題。可以先安裝裡的 [community] 裡的wmname:

# pacman -S wmname

然後你只需要用wmname來設置一個Java能識別的WM名稱:

$ wmname LG3D

這不是永久的,所以你可以把它寫進.xinitrc。

資源[編輯 | 編輯原始碼]