0

在 KDE(Xorg)中获得完美的平铺桌面体验

 8 months ago
source link: https://h-cheung.gitlab.io/post/%E5%9C%A8-kdexorg%E4%B8%AD%E8%8E%B7%E5%BE%97%E5%AE%8C%E7%BE%8E%E7%9A%84%E5%B9%B3%E9%93%BA%E6%A1%8C%E9%9D%A2%E4%BD%93%E9%AA%8C/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

平铺窗口管理器是否好用这个问题就不说了,不喜欢它的用户可能永远用不惯,但喜欢它的用户则很容易对它形成依赖。在 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,可以考虑尝试。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK