dwm - Arch Linux 中文维基

跳至內容

# dwm

出自 Arch Linux 中文维基

翻譯狀態：

- 本文（或部分內容）譯自 Dwm，最近一次同步於 2022-06-03，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- dmenu

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

## 安裝

dwm可以通過dwmAUR或dwm-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` + `F`。`Mod1`預設是 `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。

## 資源

- dwm's official website
- dmenu - Simple application launcher from the developers of dwm
- The dwm thread on the forums
- Hacking dwm thread
- Check out the forums' wallpaper thread for a selection of dwm wallpapers
- HowTo by Snake
- Moved to dwm

分類：​

- 動態窗口管理器

dwm
新增話題