前言

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

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

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

原版 i3 或 i3-gaps

存在問題

說起平鋪窗口管理器,最著名的無疑是 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 可以)。

bspwm

優缺點

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

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

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

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

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

如何使用 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

patched i3

介紹

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

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。

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

如何使用 patched i3

基本配置

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

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

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

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

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

# 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,可以考慮嘗試。