开发日志

Hyprland:从 wlroots 独立出来的动态平铺合成器

· luo980 · linux · 约 5 分钟阅读

#linux#hyprland#wayland#显示服务器

上一篇写了 Wayland 协议本身,这篇写建在它上面、最近几年讨论度很高的一个合成器: Hyprland。放一起看正好能理解”协议”和”实现”是两码事——同一个 Wayland 协议之上, 可以长出完全不同哲学的合成器。

定位:动态平铺 + 不放弃视觉效果

Hyprland 是一个动态平铺(dynamic tiling)Wayland 合成器,用 C++ 写的项目主页。“动态平铺”这个类别本身不 新鲜(i3、Sway 都是),Hyprland 的差异化在于平铺的同时不放弃动画和视觉效果—— 窗口打开/关闭/移动都有可配置的过渡动画、模糊、圆角、阴影,这在早期的平铺合成器 里通常是缺失的(i3/Sway 的哲学更偏向”简洁优先,效果不是重点”)。

架构变迁:从 wlroots 到自研的 Aquamarine

这是 Hyprland 历史上最值得写的一件事。早期 Hyprland 跟 Sway 一样建立在 wlroots ——一个提供了 Wayland 合成器大部分底层能力(后端接入、协议实现、渲染基础设施)的 共享库——之上。但是从 Hyprland 0.42 版本开始,项目彻底放弃了对 wlroots 的 依赖,变成”100% 独立”的实现 Phoronix 报道

替代 wlroots 的是 Hyprland 团队自己维护的 Aquamarine 后端,2024 年从 wlroots fork 出来独立发展。这次架构调整的动机很直接:wlroots 是给”通用合成器” 用的抽象层,通用意味着某些定制化的渲染管线很难塞进去;自己掌控渲染这一层之后, Hyprland 才能做出比同类 Wayland 平铺合成器更流畅的动画效果——这也是社区里经常 提到”Hyprland 的动画感觉比其他同类顺滑”的技术原因所在。

到 2026 年,Hyprland 的稳定版本线已经到了 0.48+,这次架构独立带来的能力也在 持续兑现(比如更完整的 explicit sync 支持,这是 0.42 那次更新里同时落地的另一个 重要特性,跟 GPU 驱动之间的显式同步直接相关,减少画面撕裂/卡顿)。

配置文件:声明式、纯文本

Hyprland 的配置是一个纯文本文件 ~/.config/hypr/hyprland.conf,语法接近”每行 一个指令”:

hyprland.conf
monitor=,preferred,auto,1
# 常规窗口间距、边框
general {
gaps_in = 5
gaps_out = 10
border_size = 2
}
# 打开动画:曲线 + 时长,可以精细调
animations {
enabled = true
bezier = myBezier, 0.05, 0.9, 0.1, 1.05
animation = windows, 1, 5, myBezier
}
# 按键绑定
bind = SUPER, Q, exec, kitty
bind = SUPER, C, killactive,
bind = SUPER, 1, workspace, 1
# 窗口规则:针对特定应用做例外处理
windowrule = float, ^(pavucontrol)$

这种”重启合成器不需要,改完配置文件自动热重载”的体验,加上 hyprctl 提供的 运行时 IPC(可以在不重启的情况下查询/修改状态,写脚本联动 waybar 之类的状态栏), 是它上手门槛相对低、社区自定义配置(“ricing”)生态特别活跃的原因之一。

跟 Sway 怎么选

如果你更看重协议兼容性和跟 wlroots 生态(很多辅助工具默认假设 wlroots)的 互操作性,Sway 仍然是更保守稳妥的选择;如果你想要的是视觉效果拉满、愿意接受 一个还在快速迭代、偶尔会有兼容性问题的项目,Hyprland 目前是这个方向做得最好的 实现。两者都不是”谁取代谁”的关系,是 Wayland 生态里两种不同优先级排序的产物。

Sources: