# Desktop 多显示器管理(2026-10-17) 图形系统在 **Settings > Display** 增加屏幕管理,也可按 **Win+P** 进入。参考 Windows 的编号屏幕布局,沿用 XFESystem 的主题和窗口控件;Console 继续保持独立纯控制台入口。 ![原生双屏设置界面](images/MultiDisplay20261017.png) ## 操作 1. 启动前连接显示器。页面列出实际获得的显示输出,点击编号选择屏幕,Identify 在各输出上显示各自编号。 2. 选择 **Duplicate these displays**,每个输出呈现同一桌面;分辨率比例不同时等比缩放并保留黑边。 3. 选择 **Extend these displays**,拖动编号块排列屏幕。边缘自动吸附,鼠标和窗口可以跨屏移动;最大化、贴靠使用窗口所在屏幕的工作区。 4. 选择屏幕并点击 **Make this my main display**,主屏放置任务栏、开始菜单和桌面图标。**Show only the main display** 只保留主屏画面,其他输出显示黑色。 5. 点击 **Apply changes** 后,在 15 秒内选择 **Keep changes**;超时或按 Escape 恢复原布局。确认前不会覆盖已保存设置。 键盘可用 1–8 / 左右方向键 / Tab 选择屏幕,M 切换模式,P 设主屏,I 标识,Enter 应用或确认,K 确认,Escape 回退。确认后的配置保存在 `X:\System\Settings\Displays.json`。启动 USB 工作区不可用时,保存范围为本次 RAM 会话。缺少原显示器、编号/EDID/启动几何不匹配或设置损坏时,使用安全默认布局,不盲目套用旧的扩展桌面。 切换模式会将窗口移回可见区域;当前未实现按显示器长期记忆每个窗口的位置。 ## 实现与范围 内核保留完整 Limine framebuffer 列表,通过版本化的 72 字节值 ABI 提供至多八个有效的独立输出。检查像素格式、尺寸、pitch、内存范围及重叠;同一内存的别名不能冒充两块独立屏幕。输出身份结合固件枚举槽、EDID 与启动几何,不持久化物理地址。 CPU 渲染器管理一个有界虚拟桌面,按输出分发损伤区域,并分别处理各帧缓冲的 pitch 和 RGB 掩码。单屏和同尺寸复制保留直接提交路径;扩展输出按各自源矩形取像素,指针不会停留在屏幕之间的空白区域。切换时重新建立场景缓存和指针边界,文档内容及打开窗口继续保留。未增加外部图形运行时。 当前后端管理的是**固件在启动时交付的独立帧缓冲**,不是完整 NVIDIA/AMD/Intel 显示端口驱动。固件只交付一个输出时,页面只显示一块屏幕;无法凭 GPU 端口数量虚构第二块。Detect 会说明需要重新连接并重启。运行中端口热插拔、硬件分辨率切换、逐屏 DPI、旋转、HDR、GPU 加速和跨屏垂直同步尚未实现;分辨率与全局缩放沿用启动模式。参考 [Limine framebuffer 协议](https://github.com/Limine-Bootloader/limine-protocol/blob/trunk/PROTOCOL.md) 和 [UEFI 控制台协议](https://uefi.org/specs/UEFI/2.11/12_Protocols_Console_Support.html)。 QEMU 启动包可使用: ```powershell .\Start.ps1 -DisplayCount 2 -QemuPath "C:\Program Files\qemu\qemu-system-x86_64.exe" ``` 每个额外显示器使用独立 `secondary-vga` 设备。实体 U 盘仍只包含 Desktop 一个系统,没有新增 Console / Desktop 启动选择菜单;Logo、XFESystem 字样及真实就绪加载动画保留,启动诊断继续仅走串口。 ## 验证与交付 结果汇总见 [MultiDisplay20261017.json](validation-results/MultiDisplay20261017.json)。验证区分宿主像素测试、真实 QEMU 独立输出、实体介质写入和实体显示硬件;虚拟双屏通过不代表实体显卡全部接口已获得驱动支持。`FullReleaseQualified` 保持 false。 - 宿主 17 组、1,680 项;多屏新增 14 项,另有 13 项实际交付验证器的正反检查、11 项单系统策略、5 项交付分派、25 项 Bing 保护以及工作区备份恢复保护通过。 - 同一 Desktop 镜像通过两块独立 VGA 的三次冷启动:复制逐像素一致、编号不同、排列和回退、第二屏窗口拖动及最大化、主屏切换、第二屏独显、真实 15 秒超时恢复、USB 布局恢复和缺屏回退。另通过原生浏览器/Monaco 编辑、文档八阶段、终端及五卷读写的两次 USB 冷启动和独立回读。Console 也重新编译并独立启动回归通过。 - 宿主/两版来宾合并 934 个绑定输入与工作区实际字节一致。原生 USB 集线器键鼠编辑及拔插重输的原样重试通过;首次枚举诊断与工作区诊断交错,测试等待完整串口标记失败,原始记录保留。QEMU 的既有 Hub/TT 模型例外不能算实体硬件支持。 - Desktop ZIP `dist/XFESystem-Desktop-Independent-USB-0.3.0-dev.4-displays.1-1792201600478-f7006c0f.zip`,SHA256 `8ddee7407f0acfeb434ec77a9b7224e82a7afe0bea869eefe0fd20163b280c2b`;完整 ZIP 回读、1,660 文件解压哈希及重定位的 Windows PowerShell 5.1 单屏/双屏启动计划通过,未在计划验收中启动额外来宾。 实体 U 盘更新已按既有授权发起,但 Windows 管理员提升被取消,写盘辅助进程未启动,未打开或改写实体磁盘。专用设备 fresh 身份相符、非系统/启动盘且保持离线;未对本次取消自动重试。记录在 `build/usb-media/XFEstudio-Desktop-MultiDisplay-0.3.0-dev.4-1792201784372/NotWritten.json`,后续更新使用重新核对的身份和新计划/token,并完整备份恢复已有工作区。`ImageDeliveryComplete=true`、`DeliveryComplete=false`、`UsbWritten=false`;U 盘仍保留上次 Bing/CSS/Monaco 版本。 最终 ELF 移除的仅是离线 DWARF 调试节,原文件保留在构建目录的 `Kernel.WithDebug.elf`;每个 ELF program segment 的属性和全部文件字节均经过独立比较。运行时展开表、栈追踪数据与符号保留。镜像仍为 256 MiB,64 MiB USB 工作区没有缩小。 首次构建的 `--no-restore` 遇到旧 NuGet 中间清单,锁定恢复后通过;未压缩调试信息的 ELF 无法与工作区一同放入镜像,因此打包器拒绝,未产生交付镜像。最初的多屏测试使用错误存储标记、将窗口几何列表与 tuple 比较,以及主验收器的同名历史模块导入冲突均已保留并修正;这些失败不计入通过结果。宿主包装命令返回过残留的原生负例退出码 254,实际宿主 Result.json 为 Passed=true、17 组 1,680 项,TRX 和原生契约回执均通过;未将包装命令说成退出码 0。