dwl - Arch Linux 中文维基

跳至內容

# dwl

出自 Arch Linux 中文维基

相關文章

- 窗口管理器
- Wayland
- MangoWM

翻譯狀態：

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

dwl 是一個基於 wlroots 的 Wayland 合成器，在設計理念上與 dwm 相似。它精簡、快速，並且可以通過社區製作的 補丁 進行擴展。默認配置下僅提供最基本的窗口管理功能，足以日常使用；若需更多特性，可按需選用社區補丁。

## 安裝

dwl 可以通過 dwlAUR 或 dwl-gitAUR 軟體包安裝。請在構建和安裝之前完成所需的配置修改，參見 makepkg。

提示：上游構建說明 也可參考，但這種方式安裝的文件不會被 pacman 跟蹤。

## 配置

dwl 通過編輯部分原始碼文件（主要是 `config.h`）在編譯時進行配置。有關這些設置的詳細信息，請參閱附帶詳細注釋的 `config.def.h`。

官方網站提供了許多 補丁，可以為 dwl 添加額外功能。這些補丁主要修改 `dwl.c` 文件，並在適當的地方修改 `config.h` 文件。有關應用補丁的信息，參見文章 給軟體包打補丁。

### 啟用 XWayland

要啟用 Xwayland 支持構建 dwl，請安裝 xorg-xwayland包 並將構建文件中的以下行取消注釋：

    /path/to/config.mk

    # 取消注釋以構建 XWayland 支持
    XWAYLAND = -DXWAYLAND
    XLIBS = xcb xcb-icccm

## 用法

dwl 可以從選擇的顯示管理器中啟動，在其提供的菜單中選擇對應的桌面項。

要從 getty 啟動 dwl，執行如下命令：

    $ dwl

使用 `-s` 啟動的命令，其標準輸入（stdin）會被 dwl 持續寫入當前的布局、窗口標題、app-id 和標籤等信息。如果您的命令不需要讀取這些標準輸入數據，為避免管道阻塞或產生意外錯誤，請在該命令後追加 `<&-` 以關閉其標準輸入，例如：

    $ dwl -s 'sh /path/to/autostart.sh <&-'

如果使用顯示管理器，可以將此附加到桌面項的 `Exec` 行中。

注意：有關 dwl 使用的更詳細信息，請參閱上游 指南。

## 技巧和竅門

### 讓某些窗口使用浮動布局

對於某些窗口，例如首選項對話框，平鋪並不合適——它們應該自由浮動。例如，要讓 Firefox 的首選項對話框浮動，請將以下內容添加到你的 rules 數組中：

    /path/to/config.def.h

    static const Rule rules[] = {
    ...
    { NULL, "Firefox Preferences", 1 << 8, 1, -1 },
    ...
    };

### 屏幕捕獲

下面的腳本會首先創建一個目錄 `/path/to/pics`，如果成功，它會使用屏幕捕獲工具截屏並保存為以當前日期為文件名、擴展名為 `.png` 的文件，存放在該新建的目錄中：

    /path/to/scripts/screenshot.sh

    #!/bin/sh
    mkdir -p /path/to/pics && grim "/path/to/pics/$(date +'%m-%d-%Y-%H%M%S').png"

此外，如果你還想使用選擇框截屏而不是截取所有顯示器，請創建以下腳本：

    /path/to/scripts/screenshotsel.sh

    #!/bin/sh
    mkdir -p /path/to/pics && grim -g "$(slurp)" "/path/to/pics/$(date +'%m-%d-%Y-%H%M%S').png"

如果要截屏並保存到剪貼板而不是文件系統，請創建以下腳本：

    /path/to/scripts/screenshotselcopy.sh

    #!/bin/sh
    grim -g "$(slurp)" - | wl-copy

最後添加以下內容：

    /path/to/config.def.h

    static const Key keys[] = {
    ...
    { 0, XKB_KEY_Print, spawn, SHCMD("path/to/scripts/screenshot.sh") },
    { WLR_MODIFIER_SHIFT, XKB_KEY_Print, spawn, SHCMD("path/to/scripts/screenshotsel.sh") },
    { WLR_MODIFIER_CTRL, XKB_KEY_Print, spawn, SHCMD("path/to/scripts/screenshotselcopy.sh") },
    ...
    };

這將屏幕捕獲映射到 `Print` 鍵，選擇框截屏映射到 `Shift+Print`，而截屏並複製到剪貼板映射到 `Ctrl+Print`。

注意：

- 如果在 dwl 構建中打了層動畫補丁，可能需要為 slurp 禁用這些動畫，因為 grim 最終會同時捕獲選擇器邊框。
- 以上所有腳本都需要可執行權限，請確保已設置。此外，它們有一些依賴，請安裝 grim包、slurp包 和 wl-clipboard包 才能正常工作。

### 調整音量

安裝 pipewire-pulse包 或 pulseaudio包，然後添加以下音量管理選項：

    /path/to/config.def.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, XKB_KEY_XF86AudioRaiseVolume, spawn, {.v = up_vol } },
    { 0, XKB_KEY_XF86AudioLowerVolume, spawn, {.v = down_vol } },
    { 0, XKB_KEY_XF86AudioMute, spawn, {.v = mute_vol } },
    ...
    };

### 自啟動

有一個 補丁 可用，它允許你自啟動指定的應用程式。示例如下：

    /path/to/config.def.h

    /* 自啟動 */
    static const char *const autostart[] = {
        "wbg", "/path/to/your/image", NULL,
        NULL /* 終止 */
    };

你可以通過向列表中添加更多條目來指定更多應用程式，每個條目用逗號（,）分隔，後跟 `NULL`。例如，你可以啟動狀態欄、通知守護進程或任何後台服務。只需確保每個命令及其參數正確引用即可。

### 更好的滑鼠大小調整

默認情況下，調整大小時 dwl 會將光標移到右下角，通過一個 補丁 可以改變這一行為。

該補丁允許你配置窗口調整大小行為，使其更靈活，替代默認的跳轉到右下角，它提供了多種模式：

- 將光標移動到選定的角落。
- 在調整大小時鎖定光標位置。
- 完全禁用光標跳轉。
- 相對角落調整大小，此時光標距離哪個角最近，就使用哪個角進行調整。

該補丁的一個工作配置示例如下：

    path/to/config.def.h

    /* resize_corner:
     * 0: 左上
     * 1: 右上
     * 2: 左下
     * 3: 右下
     * 4: 距離光標最近的角
     */
    static const int resize_corner = 4;
    static const int warp_cursor = 0;	/* 1: 跳轉到角落, 0: 不跳轉 */
    static const int lock_cursor = 0;	/* 1: 鎖定光標, 0: 不鎖定 */

這樣，調整大小時將選擇距離光標最近的角落，光標不會跳轉，並且光標不會鎖定自身位置。

## 故障排除

### 修復 Java 應用程式行為異常

參見 Java#灰色窗口/應用不隨窗口管理器調整大小/菜單自動關閉。

### 修復終端窗口周圍的間隙

如果終端窗口外存在桌面空白間隙，很可能是因為終端的字體大小所致。可以調整字體大小直到找到能消除間隙的理想尺寸，或者將 `config.h` 中的 `resizehints` 切換為 0。

這會導致 dwl 忽略所有客戶端窗口的調整大小請求，而不僅僅是終端。此變通方法的缺點是某些終端可能會出現重繪異常，例如顯示殘影（殘留線條）和提前換行等問題。

另外，如果你使用 st 終端模擬器，可以應用 anysize 補丁並重新編譯 st。

## 參見

- bemenu - 一個 Wayland 原生的 dmenu 替代品。
- 一個 dwl 的 介紹視頻。
- dwl 的 git 倉庫。

分類：​

- Wayland 合成器

dwl
新增話題