Niri 作为一款基于 Rust 编写的现代 Wayland 合成器,在窗口管理模式上实现了革命性突破。其独特的 "滚动平铺"(scrollable tiling) 架构不仅解决了传统平铺窗口管理器的核心痛点,更为多窗口工作流带来了全新的交互范式。
传统平铺管理器的根本困境
在传统的平铺窗口管理器中,窗口排列通常采用固定网格或树状结构。当用户在有限屏幕空间内打开多个窗口时,系统会不可避免地压缩所有窗口的尺寸以适应可见区域,导致小窗口难以有效操作和阅读。传统 i3、Sway 等平铺管理器都存在这一根本性限制:屏幕空间成为用户并行工作能力的硬性约束。
Niri 的设计哲学正是对这一困境的深度反思。项目开发者 Ivan Molodetskikh 在受 PaperWM 启发下发现,真正的空间效率不应通过压缩窗口来妥协用户体验,而应通过重新定义 "虚拟屏幕空间" 的概念来突破物理限制。这种思路催生了 Niri 的核心创新:无限横向滚动空间。
滚动平铺:重新定义虚拟空间架构
Niri 的滚动平铺架构在技术实现上具有三个关键特征:
首先,无限横向条带设计。窗口在水平方向上以列 (column) 的形式无限延伸,类似于一个永远向右展开的 "窗口带"。当用户打开新窗口时,系统不会重新调整已有窗口的尺寸和位置,而是将新窗口追加到当前视图之外,这从根本上避免了空间竞争问题。
其次,显示器隔离机制。每个物理显示器都拥有完全独立的窗口条带,窗口绝不可能 "溢出" 到相邻显示器上。这种设计确保了多显示器用户的布局管理变得直观和可预测,解决了 PaperWM 在多显示器环境中的核心限制。
第三,动态工作区扩展。Niri 的工作区是垂直排列且动态生成的,始终保持一个空白工作区供用户随时创建新任务。重要的是,工作区布局会在显示器断开和重连时智能地恢复到原始状态,维持用户工作流程的连续性。
窗口布局算法的核心技术
Niri 的窗口布局算法摒弃了传统平铺管理的比例分配模型,而是采用基于列的固定比例 + 滚动策略。每个列具有预设的宽度比例(如 1/3、1/2、2/3 屏幕宽度),窗口在列内以垂直方式排列。当列内的窗口数量超过可视高度时,用户通过滚动查看完整内容。
这种设计的算法优势在于:
- O (1) 窗口插入复杂度:新窗口无需重新计算现有窗口的几何参数
- 内存局部性优化:同一列的窗口具有相似的空间特性,便于渲染优化
- 交互连续性保证:窗口操作不会引发其他窗口的意外重排
交互模式的创新突破
Niri 的交互模式结合了现代手势操作和传统键盘效率。在手势层面,系统支持触摸板和鼠标滚动手势来实现工作区和窗口的快速导航。在键盘操作层面,Niri 保持了类似 i3 的高效按键设计,同时引入了专为滚动平铺优化的操作模式。
特别值得注意的是 Niri 的Overview 功能和标签组系统。Overview 通过缩放视图展示所有工作区和窗口的全貌,为用户提供了空间感知的导航体验。标签组功能则允许用户在单列内管理相关窗口,进一步强化了滚动平铺的空间利用优势。
与现有方案的技术对比
与传统的 i3/Sway 平铺管理相比,Niri 在架构上实现了从 "压缩适应"到"扩展容纳" 的模式转换。传统方案追求在有限空间内最大化窗口数量,而 Niri 则通过虚拟空间的扩展来保持用户的工作流效率。
与 PaperWM 相比,Niri 的最大技术优势在于其原生合成器架构的完整性。作为独立的 Wayland 合成器,Niri 无需像 PaperWM 那样 "对抗"GNOME Shell 的全局窗口坐标系统,而是从底层重新设计空间管理逻辑,实现了更自然和可预测的用户体验。
Niri 的成功不仅在于技术实现的优雅,更在于其对用户工作流的深刻理解。滚动平铺不仅是窗口管理算法的创新,更是对现代工作空间中 "信息密度与操作便利性" 矛盾的智慧解决。在多显示器成为主流、并行工作成为常态的今天,Niri 为 Wayland 生态系统提供了新的可能性。
参考资料:GitHub - YaLTeR/niri 项目文档