配置完全指南:模式、缩放、旋转、定位与 VRR)
niri 输出Output配置完全指南模式、缩放、旋转、定位与 VRR【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri本指南系统讲解 niri 滚动平铺 Wayland 合成器中output配置段的全部用法从按连接器或厂商/型号/序列号匹配显示器到设置分辨率与刷新率含自定义模式与 modeline、缩放、旋转、坐标定位、可变刷新率VRR、启动焦点、背景色、热角以及按输出覆盖布局设置。读完本文你将能依据niri msg outputs的实际输出为多显示器环境编写一份精准、可复现且安全的niri.kdl配置。总览默认行为与output段结构默认情况下niri 会尝试打开所有已连接的显示器并使用它们各自的首选模式preferred mode。通过output段你可以禁用某个输出、调整分辨率与刷新率、缩放、旋转、坐标、可变刷新率、启动焦点等。以下是一个写出所有属性的完整示例output eDP-1 { // off mode 1920x1080120.030 scale 2.0 transform 90 position x1280 y0 variable-refresh-rate // on-demandtrue focus-at-startup backdrop-color #001100 // max-bpc 8 hot-corners { // off top-left // top-right // bottom-left // bottom-right } layout { // ...layout settings for eDP-1... } // Custom modes. Caution: may damage your display. // mode customtrue 1920x1080100 // modeline 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync } output HDMI-A-1 { // ...settings for HDMI-A-1... } output Some Company CoolMonitor 1234 { // ...settings for CoolMonitor... }每个显示器可以拥有一个独立的output段因此多显示器用户可以针对每块屏幕给出互不干扰的设置。输出匹配机制连接器名与厂商/型号/序列号输出通过连接器名connector name如eDP-1、HDMI-A-1或通过厂商manufacturer、型号model、序列号serial以单个空格分隔依次书写来匹配。这些信息都可以通过niri msg outputs查询到。笔记本电脑的内置屏通常叫eDP-1。0.1.6 起输出名匹配不区分大小写例如dp-2也能匹配DP-2。0.1.9 起输出可以按厂商、型号和序列号匹配在此之前只能按连接器名匹配。从源码看匹配逻辑位于 output.rs 的OutputName::matches()先尝试用eq_ignore_ascii_case匹配连接器名若失败且存在厂商/型号/序列号信息则逐段以“厂商 型号 序列号”的格式匹配缺失的字段以字面量Unknown参与比较例如make model unknown可以匹配“型号已知但序列号未知”的显示器。同文件的单元测试test_output_name_match覆盖了这些边界情况。提示使用厂商/型号/序列号匹配时字符串必须与niri msg outputs返回的拼写一致含空格大小写仍不敏感。off完全关闭某个输出off标志会将该输出完全关闭不参与映射与渲染。// Turn off that monitor. output HDMI-A-1 { off }在niri msg outputs中被关闭的输出其current_mode为None见 lib.rs 中Output结构体对“disabled output”的注释logical字段也为None。mode设置分辨率与刷新率格式为宽度x高度或宽度x高度刷新率省略刷新率时niri 会为该分辨率挑选最高的刷新率整个mode都省略或设置的模式无效时niri 会尝试自动挑选模式。在 niri 实例内运行niri msg outputs可列出所有输出及其可用模式。这里填写的刷新率必须与niri msg outputs显示的值精确一致精确到小数点后三位。// Set a high refresh rate for this monitor. // High refresh rate monitors tend to use 60 Hz as their preferred mode, // requiring a manual mode setting. output HDMI-A-1 { mode 2560x1440143.912 } // Use a lower resolution on the built-in laptop monitor // (for example, for testing purposes). output eDP-1 { mode 1280x720 }从解析实现看ConfiguredMode由宽度 x 高度均无符号整数与可选的刷新率f64组成lib.rs。output.rs 的测试parse_mode验证了2560x1600165.004可被正确解析同时1920、1920x、1920x1080、1920x108060Hz等畸形写法都会被拒绝。自定义模式mode customtrue自版本 25.11 起支持。可以配置显示器本身并不提供的自定义模式只需设置customtrue。此时刷新率是必填的。// Use a custom mode for this display. output HDMI-A-1 { mode customtrue 2560x1440143.912 }自定义模式不保证一定生效——这相当于请求显示器运行一个厂商未支持的时序。请自行承担风险。[!CAUTION] 自定义模式可能损坏你的显示器尤其是 CRT。请严格遵守显示器说明书中的最大支持上限。源码中output.rs 的Mode::decode_node对自定义模式做了严格校验必须携带刷新率且刷新率必须大于 0否则直接报解析错误。modeline直接配置显示器时序自版本 25.11 起支持。modeline直接通过一条模型线modeline配置显示器的时序优先级高于任何配置的mode。模型线可以通过cvt、gtf等工具计算得到。模型线同样不保证一定生效请自行承担风险。[!CAUTION] 超出规范的 modeline 可能损坏你的显示器尤其是 CRT。请严格遵守显示器说明书中的最大支持上限。// Use a modeline for this display. output eDP-3 { modeline 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync }modeline 参数的语义在 output.rs 的Modeline结构体中有完整注释clock为像素时钟MHz、hdisplay为水平有效像素、hsync_start/hsync_end为水平同步脉冲起止像素、htotal为水平总像素归零前的总数、vdisplay为垂直有效像素、vsync_start/vsync_end为垂直同步脉冲起止像素、vtotal为垂直总像素以及-hsync/hsync与-vsync/vsync两种极性。解析时还会校验时序的单调性如hdisplay hsync_start hsync_end htotal非法的 modeline 会直接报错。scale设置缩放比例设置显示器的缩放比例。0.1.6 起若未设置niri 会根据显示器的物理尺寸与分辨率自动推测合适的缩放。0.1.7 起支持小数缩放例如scale 1.5即 150% 缩放。0.1.7 起整数缩放不再需要小数点例如可直接写scale 2而非scale 2.0。0.1.7 起小于 0 或大于 10 的缩放值会在配置解析阶段直接报错此前只是被截断到该区间。output eDP-1 { scale 2.0 }从源码看scale字段的类型是FloatOrInt0, 10output.rs即解析阶段就已把取值范围钳制在 [0, 10] 内超范围直接解析失败而非运行时静默截断。transform逆时针旋转输出有效取值为normal、90、180、270、flipped、flipped-90、flipped-180、flipped-270。带flipped的值会额外对输出做镜像翻转。output HDMI-A-1 { transform 90 }Transform枚举定义在 lib.rs旋转方向为逆时针counter-clockwise90等字符串通过serde重命名映射到对应枚举值默认值是Normal。position设置全局坐标中的输出位置设置输出在全局坐标空间中的位置。它影响方向性显示器操作如focus-monitor-left以及光标移动——光标只能在直接相邻的输出之间移动。[!NOTE] 定位时必须考虑输出缩放与旋转输出尺寸以逻辑像素即缩放后的像素计算。例如一个 3840×2160、scale 2.0 的输出其逻辑尺寸为 1920×1080若想在其右侧紧邻放置另一输出应将其 x 设为 1920。若position未设置或导致重叠该输出会被自动放置。output HDMI-A-1 { position x1280 y0 }自动定位算法每次输出配置发生变化包括显示器断开与连接时niri 都会从头重新摆放所有输出算法如下收集所有已连接显示器及其逻辑尺寸按名称排序——这使得自动定位不依赖显示器的连接顺序连接顺序在合成器启动时是非确定性的按顺序尝试放置每个显式配置了position的输出若与已放置的输出重叠则放到所有已放置输出的右侧并打印警告将未显式配置position的输出依次放到所有已放置输出的右侧。该算法在 niri.rs 的reposition_outputs()中有完整实现先通过OutputName::compare()厂商/型号/序列号优先、连接器名兜底排序再让显式配置位置的输出排在未配置的前面最后逐个map_output重叠时打印形如output ... overlaps an existing output ...的警告并回退到右侧自动放置。这也解释了为什么“名称排序”能保证多显示器连接顺序变化时布局保持稳定。variable-refresh-rate可变刷新率VRR自版本 0.1.5 起支持。该标志在输出支持的前提下启用可变刷新率VRR又称自适应同步、FreeSync 或 G-Sync。可在niri msg outputs中查看输出是否支持 VRR对应 IPC 结构体中的vrr_supported字段。output HDMI-A-1 { variable-refresh-rate }[!NOTE] 某些驱动对 VRR 存在各种问题若开启 VRR 后光标帧率很低可尝试设置disable-cursor-plane调试选项 并重新插拔显示器若显示器本应支持 VRR 却未被检测到有时拔掉另一台显示器即可修复某些显示器在启用 VRR 后会持续 modeset黑屏闪烁目前没有可靠的修复办法。variable-refresh-rate on-demandtrue自版本 0.1.9 起支持。on-demandtrue属性表示仅当该输出上显示有匹配variable-refresh-rate窗口规则的窗口时才启用 VRR。这有助于规避 VRR 的各种问题——大部分时间保持关闭只在游戏、视频播放器等特定窗口出现时启用。output HDMI-A-1 { variable-refresh-rate on-demandtrue }源码中Vrr结构体带on_demand属性默认falseoutput.rs并提供了is_vrr_always_on/is_vrr_on_demand/is_vrr_always_off三个判定方法on_demand标志也透传到 IPC 层lib.rs 的OutputState相关结构供运行时状态查询使用。focus-at-startup启动时默认聚焦自版本 25.05 起支持。让 niri 启动时默认聚焦该输出。若多个带focus-at-startup的输出同时连接按它们在配置文件中出现的先后顺序决定优先级当已连接输出中没有任何一个显式声明focus-at-startup时niri 聚焦按名称排序后的第一个输出与其他地方使用的输出排序一致。// Focus HDMI-A-1 by default. output HDMI-A-1 { focus-at-startup } // ...if HDMI-A-1 wasnt connected, focus DP-2 instead. output DP-2 { focus-at-startup }background-color工作区背景色已弃用自版本 0.1.8 起支持自 25.11 起已弃用请改为在输出的layout {}块 中设置background-color。设置 niri 在该输出的工作区上绘制的背景色。仅在未使用 swaybg 等背景工具时可见。直到 25.05 版本该颜色的 alpha 通道都会被忽略。output HDMI-A-1 { background-color #003300 }源码中该字段已被标记为“Deprecated; use layout.background_color”output.rs从侧面印证了官方弃用路线顶层layout {}中的background_color默认值定义于 layout.rs才是新方案。backdrop-color幕布backdrop颜色自版本 25.05 起支持。设置 niri 为该输出绘制的幕布颜色。幕布在工作区之间切换或进入概览overview时可见。该颜色的 alpha 通道会被忽略。output HDMI-A-1 { backdrop-color #001100 }max-bpc最大每通道位数BPC自“下一个版本”next release起支持。设置该输出的最大每通道位数bits per channel。正常情况下你不需要设置它它影响的是显示器信号在传输链路上的编码方式与颜色位深或帧缓冲格式没有直接关系。如果遇到带宽问题在其他合成器上能用的配置在本机却无法设置调低max-bpc可能有所帮助否则建议保持不设置保留通常较高的默认值让 GPU 驱动自行决定。有效取值为6、8、10、12、14、16。// Set 8 max-bpc on HDMI-A-1 to lower the bandwidth. output HDMI-A-1 { max-bpc 8 }从源码看MaxBpc通过u8::try_from将配置值转为niri_ipc::MaxBpc非法取值会在解析时报错output.rsIPC 层Output结构体中的max_bpc: Optionu8则用于查询当前生效值lib.rs。hot-corners按输出定制热角自版本 25.11 起支持。定制该输出的热角行为。默认情况下所有输出都使用手势设置中定义的热角。热角的作用是把鼠标放到显示器最角落时切换概览overview。off会关闭该输出上的热角显式写出某个角落则只在该输出上启用这些热角。// Enable the bottom-left and bottom-right hot corners on HDMI-A-1. output HDMI-A-1 { hot-corners { bottom-left bottom-right } } // Disable the hot corners on DP-2. output DP-2 { hot-corners { off } }HotCorners结构体包含off、top_left、top_right、bottom_left、bottom_right五个布尔子项定义于 gestures.rs与顶层手势配置复用同一类型天然支持“按输出覆盖”。Layout 配置覆盖layout {}块自版本 25.11 起支持。可以借助layout {}块按输出定制布局设置例如给竖屏显示器或超宽屏做专门调优output SomeCompany VerticalMonitor 1234 { transform 90 // Layout config overrides just for this output. layout { default-column-width { proportion 1.0; } // ...any other setting. } } output SomeCompany UltrawideMonitor 1234 { // Narrower proportions and more presets for an ultrawide. layout { default-column-width { proportion 0.25; } preset-column-widths { proportion 0.2 proportion 0.25 proportion 0.5 proportion 0.75 proportion 0.8 } } }它接受与顶层layout {}块完全相同的全部选项包括focus-ring、border、shadow、tab-indicator、insert-hint、preset-column-widths、default-column-width、preset-window-heights、center-focused-column、always-center-single-column、empty-workspace-above-first、default-column-display、gaps、struts、background-color等。若要在某个输出上取消全局开启的标志把它写成false即可layout { // Enabled globally. always-center-single-column } output eDP-1 { layout { // Unset on this output. always-center-single-column false } }实现上输出级的layout通过LayoutPart与全局Layout做合并MergeWithLayoutPartlayout.rs将全局设置作为基底再逐项用输出级覆盖布尔标志如always-center-single-column使用Flag类型区分“未设置 / 开启 / 关闭”三种状态因此false才能真正“取消”全局值而不是保持全局值不变。配置排查建议用niri msg outputs核对连接器名、厂商/型号/序列号、可用模式、刷新率精确到三位小数、VRR 支持情况与实际生效的max_bpc——所有输出配置都应以此命令的输出为事实基准笔记本内置屏默认匹配eDP-1若使用厂商/型号/序列号匹配注意与命令输出逐字一致大小写可忽略刷新率必须与niri msg outputs完全一致精确到小数点后三位否则模式不会生效自定义模式与 modeline 属于高风险操作务必先查阅显示器说明书的最大支持上限再谨慎使用若出现输出重叠niri 会打印警告并自动将重叠输出放置到右侧可通过日志确认实际摆放结果。【免费下载链接】niriA scrollable-tiling Wayland compositor.项目地址: https://gitcode.com/GitHub_Trending/ni/niri创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考