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。