跳转到内容

dwl

来自 Arch Linux 中文维基

dwl 是一个基于 wlroots 的 Wayland 合成器,在设计理念上与 dwm 相似。它精简、快速,并且可以通过社区制作的 补丁 进行扩展。默认配置下仅提供最基本的窗口管理功能,足以日常使用;若需更多特性,可按需选用社区补丁。

安装

dwl 可以通过 dwlAURdwl-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 最终会同时捕获选择器边框。
  • 以上所有脚本都需要可执行权限,请确保已设置。此外,它们有一些依赖,请安装 grimslurpwl-clipboard 才能正常工作。

调整音量

安装 pipewire-pulsepulseaudio,然后添加以下音量管理选项:

/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。

参见