Skip to content
Go back
Table of Contents

平鋪視窗管理器初體驗--Niri折騰記錄

約莫是在 8 月左右, 我打算嘗試平鋪視窗管理器, 看看是否能帶來 KDE 以外的效率提升, 嘗試在大部分工作流中告別鼠標(主要是窗口調度). 傳統的平鋪視窗管理器, 如 i3, hyprland 等都是在一塊顯示器上無限細分, 一屏一個工作區. 這對小型筆記本不是很友好, 二分屏幕在 14 寸顯示器上看已經有些擁擠, 再四分屏幕就幾乎沒法看了, 因此我看上了 niri.

這是一款平鋪式視窗管理器, 每個工作區內, 窗口組成列(column)在橫向無限延展, 工作區之間是上下翻動的, 窗口組織成二維網格狀, 利用效率 較傳統的平鋪視窗管理器高一些, 也更適合小的顯示器, 列的寬度可以調節, 我默認調節成屏幕的 80% 寬, 能夠看到旁邊窗口的 20%, 可以依靠 鍵盤來進行切換.

工作區預覽

單工作區窗口

Niri 配置

Niri 使用 KDL 作為配置文件 DSL, 很長一段時間內都不允許分文件編寫, 開始時我的配置文件有 1000 多行, 可讀性 堪憂. 後來的 25.11 版本之後允許 include 其他配置文件, 進行了重構.

.
├── config.kdl
├── modules
│   ├── animation.kdl
│   ├── env.kdl
│   ├── exec.kdl
│   ├── input.kdl
│   ├── keymap.kdl
│   ├── layer-rule.kdl
│   ├── layout.kdl
│   ├── output.kdl
│   └── window-rule.kdl
├── scripts
├── wallpaper.conf
└── wallpapers

具體各部分配置見 dotfiles

代理

失去了 KDE 基礎設施之後, 系統代理也不復存在. 我們需要手動給一些程序使用代理. 我使用一般的端口代理, 因此命令行上並沒有什麼影響, 和之前 KDE 一樣, 需要 export 一些環境變量.

alias proxy-on="export ALL_PROXY=\"socks5://127.0.0.1:2080\""
alias proxy-off="unset ALL_PROXY"
proxy-status() {
    [[ -n ${ALL_PROXY} ]] && echo "ALL_PROXY: $ALL_PROXY" || echo "No proxy is on"
}

對於一般的應用, 需要在應用內部進行設置, 例如 Telegram. 部分 electron 框架的應用程序需要在 Desktop Entry 中加參數來添加代理. 例如 Vesktop.

[Desktop Entry]
Name=Vesktop-Proxy
Exec=vesktop --proxy-server=socks5://127.0.0.1:2080 %U
Terminal=false

瀏覽器也會因為失去系統代理導致無法使用代理, 嘗試一番之後還是使用瀏覽器擴展解決, 免得每個瀏覽器都自己尋找設置, 基本都在犄角旮旯, 偷懶了 我主要使用 Switchy Omega.

Switchy Omega

Note

我不使用透明代理, 因為透明代理會強制所有的流量走分流裝置, 實際上就算分流寫的再好, 也免不了有的流量會被錯誤的分走. 另外, 有些情況下不得不完全關閉代理, 這時候如果使用透明代理就需要考慮關掉代理程序, 並重新啟動網絡服務. 傳統的端口 代理只需要考慮何時開啟, 並在應用內部設置或者給予環境變量, 而透明代理考慮的就多了.

基礎設施

離開 KDE 後大部分基礎設施也必須自己安裝配置.

Waybar

Waybar 是 status bar 的解決方案, 我並沒有做過於複雜的功能, 只是把它當成了大號的 Tmux 狀態欄, 放置了一些 tray, 還有最基本的日期, 音量, 工作區, 亮度等狀態的顯示. 也以文字為主, 沒有花哨的圖案. 配置源碼在此

通知中心

使用 swaync 實現, 默認的 catppuccin 主題.

網絡, 藍牙

網絡部分使用 NetworkManager Applet, 藍牙面板是 BlueBerry

壁紙

壁紙使用 niri 的層規則配合 swww 以及 shell 腳本實現.

layer-rule {
    match namespace="wp-back$"
    place-within-backdrop true
}

layer-rule {
    match namespace="wp-front$"
}

如上面的工作區縮略圖展示畫面所示, 桌面背景和虛化的背景其實是通過高斯模糊計算出來的, 腳本如下面所示, 腳本會緩存模糊的圖片, 不用每次都進行計算.

#! /usr/bin/bash

CONFIG_FILE=$HOME/.config/niri/wallpaper.conf
WP="$HOME/.config/niri/wallpapers/yuki.jpg"
BLUR_STREGTH=20
TRANSITION=simple
TRANSITION_DURATION=1
CACHE_DIR="$HOME/.cache/wallpaper"

[ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE"

CACHE_IMG="$CACHE_DIR/wallpaper-blur.png"
CACHE_META="$CACHE_DIR/meta"

mkdir -p "$CACHE_DIR"

[[ -z "$WP" || ! -f "$WP" ]] && { echo "WARNING: No wallpapper selected: no such file" && exit 1; }

HASH=$(sha256sum "$WP")
HASH="$BLUR_STREGTH##$HASH"

if [ -f "$CACHE_META" ] && grep -q "$HASH" "$CACHE_META"; then
    echo "Using cached blurred wallpaper"
else
    echo "Generating blurred wallpaper..."
    ffmpeg -i "$WP" -vf "gblur=sigma=$BLUR_STREGTH" -y "$CACHE_IMG"
    echo "$HASH" > "$CACHE_META"
fi

pgrep -x awww-daemon >/dev/null || {
    echo "Starting daemon"
    awww-daemon -n wp-front &
    awww-daemon -n wp-back &
    sleep 1
}

awww img "$CACHE_IMG" -n wp-back --transition-type "$TRANSITION" --transition-duration "$TRANSITION_DURATION"
awww img "$WP" -n wp-front --transition-type "$TRANSITION" --transition-duration "$TRANSITION_DURATION"

其他基礎設施

文件管理器, 系統設置等我都複用了 gnome 的基礎設施. 因為 niri 依賴 gtk 和 gnome 的 desktop portal.

錄屏/截屏

截屏使用的是 niri 內置的截圖功能, 錄屏使用 obs-studio 或者 wf-recorder 進行錄製. 總體來說是「能用」的級別

鎖屏

使用 hyprlock 進行鎖屏, 配置文件見此處

GTK 程序主題

主要使用 gsettingsnwg-look 進行設置, 並沒有遇到多少困難.

QT 程序主題

QT 程序的主題是很棘手的問題之一. 我先後採用過 qt6ct, kvantum, 以及兩者的配合等多種解決方案. 最後效果都一般, 經常會 有地方顏色不一致, 或者開啟的應用根本沒有使用設置的 qt 主題, 總之相比起 kde 下, qt 程序的主題是欠缺的. 後來我切換成 qt6ct-kde 進行設置, 現在大部分情況下都能做到完全按著設置的來, 偶爾環境變量沒有上去的時候會失去主題, 其他時候已經和 kde 中的主題別無二致.

QQ

QQ 為首的 Electron 程序的輸入法在離開 KDE 基礎設施之後總是出問題. 目前已知的問題有 QQ 光標主題缺失, 輸入法面板大小不正確, 輸入法失效, 剪切板失效. 我安裝的是 linuxqq-nt-bwrap 包

對於 QQ 光標主題缺失, 在 bwrap flags 中添加 --bind $HOME/.local/share/icons $HOME/.local/share/icons 選項可以解決, 本質是 bwrap 沙盒不允許訪問光標主題所在的目錄, 現在將自己定製的主題的安裝目錄加進去就可以了.

對於輸入法失效, 可以給 electron 傳遞 flags:

--enable-wayland-ime
--wayland-text-input-version=3

對於輸入法面板大小不正確, 這和屏幕的縮放倍率等有關, 由於顯示器分辨率高, 我整體使用 1.75 倍放大. 因此 XWayland 也需要適應. 在 ~/.Xresources 裡添加 Xft.dpi: 192 即可.

對於剪切板失效, 目前沒有好的解決方案. 只有切換成 x11 後端啟動 qq 才能解決. 可給 electron 傳遞 flag --ozone-platform-hint=x11

騰訊會議

這個確實是棘手的問題, 在 kde 下是所有功能都能夠正常工作的, 但是在 niri 下屏幕共享與會者是看不到的. 由於我並沒有很大的在 niri 下 使用騰訊會議的需求, 就沒有解決.

Note

實在是想不出還有什麼可以寫了, 歡迎在評論區提出…?