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
添加话题