ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

niri 全屏与最大化完全指南:Maximized Column、Maximize-to-Edges 与 Fullscreen 的差异与配置

niri 全屏与最大化完全指南:Maximized Column、Maximize-to-Edges 与 Fullscreen 的差异与配置 niri 全屏与最大化完全指南Maximized Column、Maximize-to-Edges 与 Fullscreen 的差异与配置【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri导读在 niriscrollable-tiling Wayland compositor中“把窗口变大”有三条不同的路径最大化整列maximize-column、将窗口最大化到屏幕边缘maximize-window-to-edges和全屏fullscreen。它们表面上都是放大窗口但底层对布局、窗口状态感知、边框与间隙的处理截然不同。本文以 niri 官方文档 Fullscreen-and-Maximize.md 为骨架结合仓库源码与配置实现逐一定义三种模式的差异、适用场景、窗口规则配置与常见行为帮助你按需选择正确的放大方式。三种“放大窗口”方式的本质区别niri 官方文档开篇即点明核心问题There are several ways to make a window big on niri。三种模式的核心差异总结如下模式触发行覆盖范围边框/间隙/struts窗口状态感知多窗口最大化整列maximize-column默认ModF整列占满整个屏幕宽度保留 struts、gaps、边框无列内可放多个窗口最大化到边缘maximize-window-to-edges默认ModM25.11 起单个窗口扩展至可用屏幕边缘保留 bar但无 struts、gaps、边框有窗口会感知并响应如圆角变方角仅可放入 tabbed 列全屏fullscreen-window默认ModShiftF覆盖整个屏幕全部覆盖有窗口会隐藏标题栏/UI单窗口一句话总结最大化整列是“布局级”的简单拉伸最大化到边缘与全屏则是“窗口状态级”的特殊状态后者会被窗口本身感知和控制。最大化整列Maximized Columns最简单的放大方式行为与效果maximize-column默认绑定ModF将当前列宽度扩展至覆盖整个屏幕。官方文档明确说明其本质This is the simplest of the sizing modes, and is equivalent toproportion 1.0column width, orset-column-width 100%.也就是说最大化整列在底层等价于把列的proportion设为1.0或执行set-column-width 100%。它仍然为 struts 与 gaps 留出空间窗口也保留其边框。由于是整列操作该列可以同时容纳多个窗口所有窗口一起被放大。让窗口默认以最大化整列打开通过窗口规则 open-maximized 可让指定窗口打开时即进入最大化整列状态// 默认让 Firefox 以最大化整列打开。 window-rule { match app-idfirefox$ open-maximized true }该规则定义在 niri-config/src/window_rule.rs 中字段open_maximized: Optionbool属于在 initial configure 阶段生效的“初始配置”类规则注释为// Rules applied at initial configure.。最大化到边缘Maximize to Edges桌面环境惯用的最大化Since: 25.11行为与效果maximize-window-to-edges默认绑定ModM提供与 GNOME、Windows、macOS 等桌面环境一致的“最大化”体验将单个窗口扩展至可用屏幕区域的边缘。关键行为差异相对最大化整列你仍然能看到自己的 barpanel但struts、gaps、边框全部消失窗口感知到自身的 maximize-to-edges 状态通常会响应性地将圆角变为方角“squaring their corners”窗口可以主动请求最大化/取消最大化点击窗口标题栏上的方形图标或双击标题栏都会触发 niri 将窗口最大化或还原。由于这是单窗口状态而非整列操作多个最大化窗口不能放入普通列只能放进 tabbed column标签列 中。让窗口默认以最大化到边缘打开窗口规则 open-maximized-to-edges同样自 25.11 起可控制窗口打开时是否最大化到边缘// 让窗口默认最大化到边缘。 window-rule { open-maximized-to-edges true }也可以显式设置为false来阻止窗口以最大化到边缘状态打开window-rule { open-maximized-to-edges false }对应源码字段为 open_maximized_to_edges。测试用例 src/layout/tests.rs 中包含大量Op::MaximizeWindowToEdges的操作序列如Op::MaximizeWindowToEdges { id: Some(1) }覆盖了最大化到边缘后布局状态机变化的各类场景。全屏Fullscreen覆盖整个屏幕行为与效果全屏通常由视频播放器、演示文稿和游戏自行发起你也可以通过fullscreen-window默认绑定ModShiftF强制任意窗口全屏。全屏窗口覆盖整个屏幕。与 maximize-to-edges 类似窗口能感知自身的全屏状态并可能据此隐藏标题栏或其他 UI 元素。两个值得注意的实现细节黑色背景衬底niri 会在全屏窗口后方渲染纯黑背景“solid black backdrop”。当窗口本身尺寸过小例如对固定尺寸的对话框强行全屏时黑底可帮助匹配屏幕尺寸——这正是 Wayland 协议中xdg_toplevel:request:set_fullscreen所规定的行为。层级覆盖关系当全屏窗口获得焦点且无动画时它会覆盖浮动窗口和top layer-shell layer。如果你希望 layer-shell 通知或启动器显示在全屏窗口之上需要在相应工具中配置将 surface 放到overlay layer-shell layer。让窗口默认全屏打开窗口规则 open-fullscreen 控制窗口是否以全屏状态打开window-rule { open-fullscreen true }同样可以设置为false来阻止窗口打开时进入全屏。官方文档给出一个很实用的示例——让 Telegram 的媒体查看器以窗口模式打开// 让 Telegram 媒体查看器以窗口模式打开。 window-rule { match app-idr#^org\.telegram\.desktop$# title^Media viewer$ open-fullscreen false }对应源码字段为 open_fullscreen。配置解析层niri-config/src/lib.rs会同时读取open_maximized、open_maximized_to_edges与open_fullscreen三个字段形成规则集。从动作到实现的调用链三种模式的默认键位动作在 src/input/mod.rs 中注册与分发Action::MaximizeColumnsrc/input/mod.rs→ 触发整列最大化Action::MaximizeWindowToEdgessrc/input/mod.rs→ 触发单窗口最大化到边缘Action::FullscreenWindowsrc/input/mod.rs→ 触发全屏Action::ToggleWindowedFullscreensrc/input/mod.rs→ 触发窗口化全屏见下文。这些动作均支持按窗口 ID 定向操作如FullscreenWindowById、MaximizeWindowToEdgesById、ToggleWindowedFullscreenById方便 IPC 场景下精确控制。全屏与最大化的共同行为与浮动布局的交互全屏或最大化到边缘的窗口只能存在于滚动scrolling布局中。如果你尝试对浮动窗口执行全屏或最大化到边缘niri 会把它移入滚动布局取消全屏/最大化后窗口会自动回到浮动布局。这一往返过程由 niri 自动完成无需手动干预。滚动平铺下的独特体验得益于 niri 的 scrollable tiling 设计全屏与最大化窗口仍然是布局中的正常参与者你可以从它们向左/右滚动看到并切换到旁边的其他窗口而不是像传统桌面环境那样被全屏窗口“锁死”。窗口自行请求还原状态的处理时机窗口在打开时有时会自行请求恢复其全屏更常见的是最大化到边缘状态。niri 处理这类请求存在一个时机关键点initial configure 阶段窗口在打开前告知 niri 一切必要信息。如果窗口在这一阶段请求全屏/最大化那么open-maximized-to-edges与open-fullscreen窗口规则就有机会拦截block或调整该请求。initial configure 之后部分客户端倾向于在 initial configure 序列结束后有时甚至在屏幕上显示后才请求最大化导致窗口打开瞬间出现一次快速 resize。此时从 niri 的角度看窗口已经打开open-maximized-to-edges与open-fullscreen规则不会生效。这也解释了为什么某些应用在打开时会出现“先显示普通窗口再瞬间放大”的现象——这是客户端在 initial configure 之后才发起最大化请求导致的。窗口化全屏Windowed Fullscreen欺骗窗口的全屏状态Since: 25.05toggle-windowed-fullscreen动作允许 niri 告诉窗口“你现在处于全屏状态”但实际上并不真正放大窗口。这一特性的典型用途是投屏screencast浏览器演示文稿既想隐藏浏览器 UI又希望窗口保持普通窗口的尺寸。窗口化全屏状态下的行为限制你可以使用 niri 动作来最大化/取消最大化窗口但窗口侧的标题栏最大化按钮与手势可能失效因为窗口始终认为自己处于全屏状态。该特性与 Screencasting.md 中的 windowed/fakedetached fullscreen 说明相关联。测试用例 src/layout/tests/fullscreen.rs 中通过Op::ToggleWindowedFullscreen(0)验证了进入与退出窗口化全屏时is_fullscreen()状态的变化。实战建议与配置速查如何选择你的需求推荐方式想让多个窗口一起撑满屏幕宽度maximize-columnModF想要桌面环境一致的单窗口最大化体验maximize-window-to-edgesModM视频/演示/游戏等需要隐藏一切 UIfullscreen-windowModShiftF投屏演示时隐藏浏览器 UI 但保持窗口尺寸toggle-windowed-fullscreen相关文档与源码索引布局相关概念struts、gapsConfiguration:-Layout.md标签列 Tabs.md浮动窗口 Floating-Windows.md窗口规则全部字段 Configuration:-Window-Rules.md窗口规则结构体定义niri-config/src/window_rule.rs键位动作分发src/input/mod.rs布局状态机测试src/layout/tests.rs、src/layout/tests/fullscreen.rs【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表