在 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,可以考虑尝试。