dwl
dwl 是一个基于 wlroots 的 Wayland 合成器,在设计理念上与 dwm 相似。它精简、快速,并且可以通过社区制作的 补丁 进行扩展。默认配置下仅提供最基本的窗口管理功能,足以日常使用;若需更多特性,可按需选用社区补丁。
安装
dwl 可以通过 dwlAUR 或 dwl-gitAUR 软件包安装。请在构建和安装之前完成所需的配置修改,参见 makepkg。
配置
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 行中。
技巧和窍门
让某些窗口使用浮动布局
对于某些窗口,例如首选项对话框,平铺并不合适——它们应该自由浮动。例如,要让 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。
调整音量
安装 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。