# 设备管理器（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]]`。