#1426·glazewm

[功能请求] 通过稳定标识符(设备路径/硬件 ID)将工作区绑定到显示器

作者: lecram89创建于 2026年8月28日更新于 2026年8月28日

功能请求: 通过稳定标识符将工作区绑定到显示器(设备路径/硬件 ID)## 问题bind_to_monitor接受一个数字索引,用于表示 GlazeWM 的几何排序的显示器列表(最左边的索引为 0,请参阅wm-platform/src/dispatcher.rs:470)。该索引完全取决于显示器的布局,因此会随着桌面的变化而改变,并且没有办法表达"此工作区属于此物理屏幕"。具体案例(办公室有三个显示器,家里有两个):|布局|最左边(索引 0)|索引 1|索引 2|---|---|---|---||办公室桌面|笔记本电脑面板|主 1920x1080|次 1920x1080||家庭桌面|主超宽|笔记本电脑面板|---|当 keep_alive: true 并将工作区绑定到索引 0 时,每次桌面更改都会将工作区放到错误的屏幕上,或者(更糟的是)会导致没有匹配的绑定的显示器和没有处于非活动状态的工作区,在这种情况下,GlazeWM 会在启动时中止:|"没有可用的工作区配置来激活工作区"|这种中止发生在有九个绑定的工作区服务于两个显示器,并且连接了第三个显示器时。当前的唯一解决方案是按桌面进行配置编辑或类似"在 Windows 中总是将主屏幕放在最左侧"的惯例 — 后者是我目前所做的,并且它是脆弱的。## 证据表明身份数据已经存在MonitorDto(wm-common/src/dtos/monitor_dto.rs)已经包含了device_name,device_pathhardware_id,这些数据来自EnumDisplayDeviceswm-platform/src/platform_impl/windows/display.rs:205-232。更重要的是, 此功能所需的匹配逻辑已经存在find_matching_monitorwm/src/events/handle_display_settings_changed.rs中通过以下方式将显示器与现有显示器进行匹配:1. 其句柄2. 其设备路径3. 其硬件 ID(受唯一性检查保护,因为硬件 ID 标识的是一个型号,而不是一个单元)该函数的注释文档记录了权衡:句柄和设备路径是唯一的,但可能会发生变化;硬件 ID 稳定,但不保证唯一。## 建议添加一个新的可选字段到WorkspaceConfig,例如:|yaml|workspaces:|- name: '1'|bind_to_monitor_id:|type: hardware_id # 或: device_path | device_name|value: 'DELA1B9'|后向兼容: bind_to_monitor继续保持与当前相同的工作方式;一个工作区可以使用任一绑定,并且两者都设置时,基于 ID 的绑定将获胜。find_matching_monitor的匹配逻辑重用了优先级语义 - device_path首先匹配(唯一,如果线缆移动则会发生变化),hardware_id其次(稳定,如果连接了两个相同的显示器,则会出现歧义)。device_name(\\.\DISPLAY1)也可用,并且具有与数字索引相同的弊端,但至少在重新排序时仍然存在。|为什么这也解决了报告的崩溃问题|使用基于 ID 的绑定后,"我属于哪个显示器"的问题不再依赖于排序了 - move_bounded_workspaces_to_new_monitor可以通过身份来匹配显示器。find_matching_monitor的匹配逻辑重用了优先级语义 - device_path首先匹配(唯一,如果线缆移动则会发生变化),hardware_id其次(稳定,如果连接了两个相同的显示器,则会出现歧义)。device_name(\\.\DISPLAY1)也可用,并且具有与数字索引相同的弊端,但至少在重新排序时仍然存在。|为什么这也解决了报告的崩溃问题|使用基于 ID 的绑定后,"我属于哪个显示器"的问题不再依赖于排序了 - move_bounded_workspaces_to_new_monitor可以通过身份来匹配显示器。

内容来源: glzr-io/glazewm