开发日志
Hyprland:从 wlroots 独立出来的动态平铺合成器
上一篇写了 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,语法接近”每行
一个指令”:
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, kittybind = SUPER, C, killactive,bind = SUPER, 1, workspace, 1
# 窗口规则:针对特定应用做例外处理windowrule = float, ^(pavucontrol)$这种”重启合成器不需要,改完配置文件自动热重载”的体验,加上 hyprctl 提供的
运行时 IPC(可以在不重启的情况下查询/修改状态,写脚本联动 waybar 之类的状态栏),
是它上手门槛相对低、社区自定义配置(“ricing”)生态特别活跃的原因之一。
跟 Sway 怎么选
如果你更看重协议兼容性和跟 wlroots 生态(很多辅助工具默认假设 wlroots)的 互操作性,Sway 仍然是更保守稳妥的选择;如果你想要的是视觉效果拉满、愿意接受 一个还在快速迭代、偶尔会有兼容性问题的项目,Hyprland 目前是这个方向做得最好的 实现。两者都不是”谁取代谁”的关系,是 Wayland 生态里两种不同优先级排序的产物。
Sources: