玩linux 有4-5年了,今天来简单梳理一下linux上我用过的一些平铺窗口合成器,也顺便说一下最近先换的一个合成器--niri
和平铺窗口绑定最多的标签就是 -- “效率提升”,“增加屏幕利用率”,我最初可能就是应为这些标签被吸引来的。当然可能还有vim的一部分原因(感觉vimer最终都会转到平铺窗口)。
那些年我用过的非平铺的wm
可能很多人然最开始的linux wm是ubunte的gnome.不过我最开始用的是xfce,没错kali的xfce 。 因为大学学的是信息安全专业,so,kali就是我入门的linux, 当时也是莫名其妙的选了xfce(当时也不懂什么wm)。
总之在用kali这一年左右,中间偶尔体验了一下deepin的dde和 ubuntu的gnome.最后感觉用不习惯(gnome是不习惯,dde则是存在一个休眠后无法点亮显示器的bug)。
后面感觉debian系的系统装包有些不方便,同时也是受到一点arch邪教的影响。最终换到arch的子分支 manjaro上,manjaro应该是我用过最长时间的发行版。用manjaro那时候实际上也不懂wm,只是manjaro默认的好像就是kde环境(我碰巧下载的镜像是kde的)。
用了一段时间的kde后. 在B站上看到平铺wm, 当时我已经是vimer了,可以用hjkl切换窗口,让我大受震撼,然后就开始了我的平铺之旅。
这些年我用过的x11平铺wm
最开始用平铺,我想试试dwm(很疯狂是把,不会c,去玩dwm),很快我就换到i3了,dwm不是人玩的,改个配置还得重新编译再重启(当时还不知道有注销这个东西,很神奇吧),然后用了快一年左右。当时实习在公司用自己的电脑用的就是i3(说实话最开始用i3 我还不知道i3可以把多个窗口合并到一起,用标签切换)。
我从i3转移到dwm是因为在我上班的某一天,我更新了一下我的manjaro系统,i3打不开了,得亏我系统里面有我正在配置的yaocccc大佬改的dwm,然后临时从i3切换到dwm。
当时yaocccc大佬还更新得很频繁,最开始的时候c佬还没开发出overview功能,用的时候就感觉挺好的,再加上overview功能,简直是梦中情wm,再加上后面开发的最大化窗口功能,说实话直到现在我都感觉dwm是最好的wm,还有很多功我现在都很需要,可惜我后面用的wm的作者没有实现。
近些年我用的wayland平铺wm
计划总是赶不上变化,一年后,我毕业了,感觉每次背着我2-3斤的电脑外出太累了,想换个轻薄本。然后我买了个二手的红米本。很遗憾它是一款hidpi的本子,当我装上系统之后我就发现dwm的窗口太小了,而且用xrand调分辨率之后字体会模糊,字体调大的话,我另外一块1080P的显示器字体也会很大。
我被迫从dwm再次换到kde,并且也是用上了wayland.那时差不多是wayland元年(我是这么定的,基本上是从这一年开始wayland达到勉强可用的状态,并且xwayland的bug也没多到不能容忍)。我以为差不多可以止步在kde了,当时kde刚推出plasma6 ,非常大的升级,从qt5升级到qt6 ,我之前用的kde配置基本上都失效了(很神奇,我还保存着几年前kde的配置),然后我整了一套kde plasma6的配置。
起初用plasma6感觉还可以(我也在偶尔折腾dwm的hidpi和其他wm, 大体上的想法是--懒得折腾了),但是后面发现kde有个问题,他的plasma-shell好像有点内存泄漏,我一天不重启plasma-shell的内存就差不到有1G了(好怀念dwm😢)。
然后我毅然决然换到hyprland, 清爽,丝滑,但是很快我发现hyprland没有overview功能,也没有隐藏窗口。当时在github上发现了hycov这款插件可以实现overview功能,刚开始用还好,后面hyprland升级,hycov的作者放弃了支持。
主要还是hyprland此时正处在重大变化的节点(作者非常疯狂的放弃wlroot,并且还有激进的C++版本更新,几乎每个月都会修改核心api)。最开始overview作者弃坑的时候,我尝试接手了一下,修改了少数几个地方,勉强能用,偶尔会有一些小bug。
但是顶不住hyprland激进的更新策略,基本上隔2-3个月我就的在维护一下,差不多摸爬滚打有大半年,在加之hyprland偶尔的不能启动(一般发生在hyprland更新后,有的版本会因为bug启动失败),我决定放弃hyprland了。
我选的替代品是swayfx,sway的优化版, 不过hyprland还是太丝滑了,swayfx和hyprland比还是差很多,所以在最近的几个月,我基本上是在hyprland的sway之间切换着用。
当然sway是wayland上i3的实现,完全兼容i3的配置,hypralnd我也用hy3来模拟一些i3的操作逻辑。
niri
为什么要单独起一个标题来说niri呢?
我感觉niri是一种全新的平铺窗口合成逻辑,无论是x11下的dwm,i3,还是wayland下的hyprland,sway 或者是其他我没有提到的窗口合成器,他们创建窗口的方式都是以屏幕为基础,第一个窗口可能是占满整个屏幕,第二个窗口创建时则会修改第一个窗口的大小,把第一个窗口宽度/高度变小一点,然后在生成一个新的窗口(i3系列的可能还有标签这个逻辑),而niri的逻辑则是,把屏幕想象成无限宽的(高度是固定的),物理屏幕是那个无限宽屏幕的一小段,然后可以通过滚动那个无限宽的屏幕,来切换改变物理屏幕显示的窗口。
由于niri的逻辑屏幕是无限宽的,所以niri的工作区不是左右分布,而是上下分布。对于多显示器来说,niri并不会把两个屏幕连在一起,两个屏幕类似是两个工作区,副屏并不会作为主屏幕的延伸。
同时niri自己也实现了类似overview的功能,不过和上面提到的overview功能不同,niri是看到全局的工作区,在overview里面,你可以看到每个工作区的那个窗口‘卷轴’。
目前来看niri唯一的缺点是还没有实现窗口模糊的功能,对于透明的终端窗口,没有模糊效果。
我用过的窗口合成器排名
dwm > niri > hyprland > sway > i3 > kde > xfce > gnome > dde