Skip to main content

新页面

设备管理器(M12,devmgmt)

Novus OS 的 Windows 11 设备管理器复刻:主窗口是菜单栏 + 工具栏 + 左侧可折叠 设备树 + 状态栏;双击/右键"属性"打开一个独立的模态属性子窗口(常规 / 驱动程序 / 详细信息 / 事件 / 资源),版式完全对齐 Win11。所有信息来自内核在启动期归一化的 设备表,应用本身不扫硬件。

状态:随 M12 生效 适用范围:内核 kernel/devtab.{h,c}、kernel/sysinfo.{h,c}、kernel/usb.{h,c} 窗口管理器 wm/novus-wm/nwm.c 与 apps/src/wm.rs 应用 apps/src/devmgr/{mod,tree,props,fields}.rs、apps/src/bin/devmgmt.rs

1. 入口

设备管理器可从四个入口启动,全部走 apps_launch() 按名字解析(devmgmt):

  1. 桌面右侧磁贴(与文件管理器/任务管理器/设置/网络/终端/安装并列,常驻);
  2. 底部任务栏固定图标(含运行时强调色指示圆点);
  3. 开始菜单"设备管理器"按钮;
  4. nsh 终端直接输入 devmgmt。

kernel/session.c 的 desktop_app() 白名单与 apps.c 应用表都已登记,未登录时 apps_launch() 同样拒绝普通桌面应用。设置面板的"应用"页也把它列入"可启动" (固定顺序:文件管理器/任务管理器/设置/设备管理器)。

2. 架构

kernel/devtab.c  ── 启动期建表(PCI 缓存 + blkdev/net/display/CPU/ACPI/USB/IOAPIC/PS2)
        │  devtab_count / devtab_at / devtab_field_count / devtab_field_at
kernel/sysinfo.c ── REQ_DEVLIST(0x031B) / REQ_DEVFIELD(0x031D),128 B 分页
        │  IPC
apps/src/sinfo.rs ── devices() / dev_fields()
apps/src/devmgr/*  ── 主窗 + 设备树 + 模态属性窗
        │  wm::Win::create_ex(..., NWM_F_CREATE_MODAL) / next_event_any()
wm/novus-wm/nwm.c ── 120/160 显示列表预算、10 窗口、模态输入隔离

设计要点:

  • 设备表固化:devtab_init() 放在 ide_init() 之后、net_init() 之前 (此时存储已就绪但无 DMA 在途);网卡在 net_init() 之后用 devtab_refresh() 追加。devtab 规模 DEV_MAX 48、PCI_MAX_DEVICES 32,约 2.3 KB + 4 KB,零运行期 BAR 探测副作用。
  • 字段分页:设备详情(实例路径、硬件 ID、资源范围)长度远超 128 B,改为 (dev, tab, index) 逐条取字段,客户端缓存当前页(2 条/包,值 56 字节,长文本截断)。
  • 模态子窗口:属性窗是独立窗口 + NWM_F_CREATE_MODAL;WM 在模态窗存在时把指针 与键盘只路由给它,其它应用零改动。

3. 协议契约

设备树节点(sysinfo_dev_t,40 B,3 条/包 = 4 + 120):

字段 类型 说明
parent u16 父类别节点下标,0xFFFF 表示根
class_id u8 DEV_CAT_*(计算机/处理器/固件/显示/磁盘/存储控制器/网络/USB/输入/系统设备/未知)
status u8 DEV_STATUS_OK / DEV_STATUS_WARN(无驱动或未知设备)
kind u8 DEV_KIND_*(CPU/PCI/显卡/监视器/磁盘/网卡/USB 控制器/USB 设备/输入/系统/固件…)
idx u8 在所属子系统表中的下标(取 BAR/事件/扇区用)
flags u8 DEV_FLAG_REMOVABLE / DEV_FLAG_NODRV 等
name char[32] UTF-8 名称

属性字段(sysinfo_devfield_t,60 B,2 条/包 = 4 + 120):

字段 类型 说明
key u8 DEV_F_*(制造商/位置/容量/MAC/链路/硬件 ID/状态/问题代码/内存范围/I/O 范围/IRQ/…)
group u8 事件行号或 BAR 序号(同一键多值时区分)
value char[56] UTF-8 值,过长截断

分页范式沿用 sysinfo_list_t:total 是整表/整 tab 数量,index 是起始项, n 是本次实际返回;客户端 index += n 直到到顶。

4. 主窗口

客户区 820×540,标题"设备管理器",10 px 圆角 + 柔影,浅色主体。

  • 菜单栏(22 px):文件(F) / 操作(A) / 查看(V) / 帮助(H),点击展开浅色浮层。
  • 工具栏(36 px):图标按钮组(刷新 / 属性 / 展开全部 / 折叠全部 / 显示隐藏的 设备等),悬停圆角底色、禁用态浅灰线条。
  • 设备树(20 px 行高,缩进 14 px/层):可折叠类别 + 设备行;展开箭头 v/> 字形; 类别/设备前 12×12 圆角色块(显示蓝、网络青、磁盘灰、USB 紫、未知黄);异常设备行尾 黄色 ! 徽标;选中行为浅蓝底 + 3 px 强调色竖条;悬停高亮。
  • 状态栏(24 px):左侧提示"选择设备后按 Enter 查看属性",右侧设备计数;超出时 以 scroll 平滑翻页,选中项 ensure_visible 始终可见。

键盘:↑/↓ 移动选中、Enter 打开属性、F5 刷新(重建设备表并关闭已开属性窗)、 Esc 取消菜单/浮层。

5. 模态属性窗口

客户区 520×600,标题"设备属性",比主窗更高层级,打开时主窗不收输入。

  • 选项卡条(44 px):常规 / 驱动程序 / 详细信息 / 事件 / 资源,选中项下划线强调色。
  • 常规:24×24 类别图标 + 设备全名;三行键值对(设备类型/制造商/位置);下方 "设备状态"边框圆角文本框(多行状态文字,如"该设备的驱动程序未被安装。(代码 28)")。
  • 驱动程序:四行键值对(提供商/日期/版本/数字签名);五个 220×30 竖排操作按钮 (更新/回退/禁用/卸载/属性),禁用项降灰;右侧说明文字。
  • 详细信息:属性(P) 下拉框(展开为白色高亮列表,键盘/滚轮可选)+ 值框。
  • 事件:时间戳/描述表头 + 3 行表格 + 等宽信息块 + "查看所有事件(V)…"次要按钮。
  • 资源:资源类型/设置表格(内存范围 ×2、I/O 范围、IRQ)+ "使用自动设置"勾选 + "更改设置(C)…"禁用按钮 + "冲突设备列表:没有冲突。"。
  • 底部:右对齐"确定 / 取消",确定为主按钮(强调色)。

只读边界:更新/回退/禁用/卸载等破坏性操作不做真实驱动变更,点击后仅在对话框内 显示说明行,界面完整、系统不损坏。

6. 窗口管理器支撑

  • nwm_proto.h:每窗显示列表 NWM_MAX_SHAPES 120、NWM_MAX_TEXTS 160 (主窗 ≈35/30、属性窗 ≈60/70 图元,只在交互时重绘);NWM_MAX_WINDOWS 10。
  • NWM_F_CREATE_MODAL:模态窗存在时命中测试/键盘只服务该窗、raise 不能盖过它、 标题栏只画关闭按钮。
  • apps/src/wm.rs:create_ex(..., flags) 与 next_event_any() -> (win, Ev) 把事件 按窗口 id 路由到主窗或属性窗;其它应用的事件循环不变。

7. 主题与双语

全部界面由 WM 图元(圆角填充/描边/文本)绘制,图标为程序化色块字形,不使用位图。 颜色随系统浅/深色与强调色联动(ui::init / ui::poll 监听主题版本);标签中英双语 (ui::l(zh, en) 内联,未走 lang 字典)。

8. 构建与验证

  • make 一并产出 out/NOVUS.EFI 与 out/apps/devmgmt.bin。
  • 启动日志 [DEVTAB] n nodes, m pci devices 确认设备表建立;WM 运行期若单帧图元超预算 会打印 [APP] display list over shape/text budget(正常情况下不应出现)。
  • 注册链路:Makefile APPS_NAMES → kernel/apps.c 应用表 → kernel/session.c 白名单 → graphics/nd_demo.c(桌面/任务栏/开始菜单/图标 NG_ICON_DEVICES)→ apps/src/shell/cmds.rs KNOWN_APPS → apps/Cargo.toml [[bin]]。