在 KDE(Xorg)中獲得完美的平鋪桌面體驗

平鋪窗口管理器是否好用這個問題就不說了,不喜歡它的用戶可能永遠用不慣,但喜歡它的用戶則很容易對它形成依賴。在 Linux 的各個桌面環境中,KDE 可以說是最受歡迎的一款,無論是外觀、功能還是易用性都很出色,全局菜單等功能也做得很好。

但是,KDE 的窗口管理器沒有原生的平鋪模式。雖然它提供腳本擴展的能力,也有不少實現平鋪的腳本可以使用,但效果遠遠不如一個原生的平鋪窗口管理器。經常會有一些情況沒有被腳本控制到的情況,且它們的可定製性也遠不如其他的 Tiling WM。

本文將介紹我嘗試過一些縫合 KDE 和 Tiling WM 的方案,並在最後給出目前使用的 patched i3。

說起平鋪窗口管理器,最著名的無疑是 i3,在關於 KDE 搭配平鋪窗口管理器這個討論量並不大的話題中,i3 佔了大部分。我也曾經使用 KDE + i3 近一年的時間,但存在大量的問題。

KDE 的大量組件在 i3 上不會自動被設置爲 floating,需要自己寫規則。而部分組建即使 floating 也不行,比如桌面,只能 kill 掉然後用獨立的壁紙設置工具(如 feh)代替,再比如往 panel 添加部件的側邊窗口會全屏(除 panel 區域)顯示,並有一定幾率崩掉,需要 kill plasmashell 再重新運行,等等。

通知窗口的問題最讓人頭疼,KDE 的通知窗口會被直接顯示在屏幕的正中心。通常推薦的方法是設置規則向右上方移動固定的像素,這樣做效果可想而知,不同尺寸的通知窗口移動後間距顯然不同,特別長的還會超出屏幕,再加上多個窗口有時會疊在一起的問題。而自己寫一個腳本處理這些問題的話,對於多個通知窗口的處理也很麻煩。

如果更換通知 daemon,首先目前沒有太多獨立的通知 daemon,很多都是要麼太簡陋,要麼和桌面環境耦合。好看一點的界面 + 桌面托盤圖標 + 少量的自定義都很難滿足。一般 i3 常用的是 dunst,它的通知按鈕、歷史通知等功能都只能通過快捷鍵。linux_notification_center 看起來不錯,但如果嘗試在 KDE 上使用的話,由於 KDE 的通知 daemon 無法關閉,只能讓其他的通知 daemon 搶佔 dbus。而這個工具我試過很多種方法都不能搶佔到(dunst 用 systemd user unit 可以)。

最近我也考慮其他窗口管理器,由於不想去搞我不熟悉的 lua、haskell 等,嘗試了配置簡單的 bspwm,發現它有以下幾個優點:

  • 會自動 floating 部分窗口,且對 KDE 的各種窗口有很好的兼容性,無需額外規則,即可正常顯示所有窗口,上面提到的幾個兼容問題都沒有出現
  • 有獨立的鍵綁定工具,而且所有操作通過命令實現,你甚至完全可以用別的快捷鍵工具代替

不過它還是有一些美中不足的地方:

  • 全屏後,其他窗口會出現在該窗口之下,桌面之上,影響透明效果。由於我比較喜歡全局透明的效果,所以這個問題對我影響很大
  • 調度器中會顯示所有虛擬桌面,即使其中沒有窗口,導致 panel 中的虛擬桌面控件過長

另外,bspwm 本身很多地方個人覺得是不如 i3 順手的。不過,如果你不常使用透明,bspwm 也是一個比較可用的方案。下面是具體的使用方法

更換窗口管理器的方法同 i3,把環境變量中 i3 改爲 bspwm 即可

bspwm 本身並不需要太多的配置,唯一必要的一條就是根據你的 KDE panel 設置邊距。比如用了 28px 的 top panel,那麼就需要加入規則 bspc config top_padding 28。值得注意的是,bspwm 的配置全部是命令,它的配置文件就是一個 bash 腳本,因此你可以動態地添加各種規則,經測試之後再加入 bspwmrc。

bspwm 的快捷鍵程序是一個獨立的二進制程序 sxhkd。bspwm 的各種功能調用基於命令,你可以不用 sxhkd,改用 KDE 自帶的快捷鍵工具。不過,把這些快捷鍵一條一跳加到 KDE 的快捷鍵中工作量很大(不知道有沒有方便的方法),所以還是建議 sxhkd,注意把衝突排除掉,否則 sxhkd 可能不生效。

sxhkdrc 的格式非常簡潔,基本上看一眼就會知道怎麼寫。

推薦使用 picom,具體介紹看 patched i3 部分。

搭配 bspwm 使用時如果出現設置透明後,部分窗口失去焦點就不透明的情況,可設置 mark-ovredir-focused = false

這是我目前使用的方案,本部分也是本文的最主要部分。

KDE + i3 的主要問題 i3 是不能很好地 handle KDE 的一些窗口,針對這個問題,存在一些 fork,不過沒有進入主線(連 gaps 都進不了主線你還想進?),熱度也不高。

目前還處於活躍維護狀態的分支是 PJK136/i3,它和它之前的 fork 的 kde-master 分支是基於原版 i3 的,PJK136 自己搞了一個合併了 i3-windows-icons 分支(標題欄顯示圖標等)的分支。

我喜歡無窗口邊框的設計,因此間距肯定是必要的。我嘗試了合併它和 i3-gaps,目前使用沒有發現大問題,使用效果非常好。後面我會盡量維護更新這個分支(絕對不咕.jpg)。

項目地址 h0cheung/i3-gaps-kde,AUR 已打包:i3-gaps-kde-git。當然你也可以使用 PJK136 的版本,他的 kde-wm-icons-master 分支 repo 中提供了 PKGBUILD。

下面是一個簡單的使用方法

首先安裝 KDE 和 i3,i3 的 patched 版本上面已介紹。

KDE 提供了一個環境變量 KDEWM 來指定窗口管理器,當然默認是 kwin。我們只需在 KDE 桌面啓動前設置它爲 i3 即可。最簡單的方法(per user),寫一個設置環境變量的腳本,比如用 sh 就像這樣:

1
2
#!/bin/sh
export KDEWM=/usr/bin/i3

給予執行權限,然後在 KDE 的設置 → 開機與關機 → 自動啓動中加入該腳本,並設置爲在會話啓動之前即可。 從 5.20 版本開始,該功能似乎已經被移除,可以根據使用 pam、dm、xinit 等方法設置該環境變量,詳見各發行版或相關工具的文檔。當然你也可以寫一個 session,這樣可以在 dm 裏面選擇是否用 i3。

經過 patch 的 i3 可以直接用於 KDE,不再需要各種 wiki、論壇上推薦的那堆配置,KDE 的桌面壁紙也可正常使用。對於通知等窗口偷焦點等小問題,簡單地加入少量配置即可,比如:

1
2
3
4
5
6
7
8
# disable focus
no_focus [class="plasmashell"]
no_focus [window_role="pop-up"]
no_focus [window_type="notification"]

focus_on_window_activation none
focus_follows_mouse no
mouse_warping none

i3 的快捷鍵是直接由 i3 主程序控制的,建議用 i3 設置快捷鍵,不在 KDE 中設置。

i3 默認的快捷鍵基本都是比較好用的,像我就只改了 dmenu 爲 krunner,方向鍵設置爲 hjkl,再把衝突的 h 處理了一下。

具體可見我的 dotfiles

首先,KDE 自帶的混成器是集成在 kwin 中的,不用 kwin 就別考慮了。i3 和 bspwm,以及絕大多數 Xorg 下的窗口管理器也都沒有自帶混成器。(Wayland 下 WM 必須帶混成功能)

Linux 下獨立的混成器其實並不多,主流的就一個多次被 fork 改名的,它最新最主流的版本叫 picom,這個混成器主要的優勢就是自定義較爲強大。

個人的設置主要是關閉 shadow,backend 用 glx,設置了一些透明效果的規則(除了一小部分單獨設置,其餘窗口都 15% 透明),等等。

當然這部分配置個人喜好不同,可以自行找相關資料(關於 compton 的資料也能參考,大部分兼容)並編寫自己的配置。

雖然我做了很多折騰,本文中也提到了多種方法,但是最希望出現的情況還是 kwin 可以支持 Tiling 模式。

另外,StumpWM 等窗口管理器據說也可以較好地配合 KDE,可以考慮嘗試。