新页面
设备管理器(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):
- 桌面右侧磁贴(与文件管理器/任务管理器/设置/网络/终端/安装并列,常驻);
- 底部任务栏固定图标(含运行时强调色指示圆点);
- 开始菜单"设备管理器"按钮;
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(正常情况下不应出现)。 - 注册链路:
MakefileAPPS_NAMES→kernel/apps.c应用表 →kernel/session.c白名单 →graphics/nd_demo.c(桌面/任务栏/开始菜单/图标NG_ICON_DEVICES)→apps/src/shell/cmds.rsKNOWN_APPS→apps/Cargo.toml[[bin]]。