从零写 OS 内核-第二十八篇:窗口管理器(Window Manager) —— 通过键盘实现窗口控制
“没有鼠标?没关系!真正的极客用键盘掌控一切。 今天,我们实现窗口管理器(Window Manager),通过键盘快捷键移动、缩放窗口!”
在前几篇中,我们构建了用户态 Display Server、Launcher 和多个应用, 但窗口仍是 静态的 :
位置固定
大小不可变
无标题栏、边框等装饰
虽然我们尚未实现鼠标驱动,但 键盘足以控制窗口 ! Unix 哲学告诉我们: 键盘是终极交互设备 。
今天,我们就来: ✅ 设计窗口管理协议 ✅ 实现用户态窗口管理器 ✅ 通过键盘快捷键控制窗口 ✅ 绘制窗口装饰(标题栏、边框)
让你的 OS 拥有 键盘驱动的窗口管理能力 !
🖥️ 一、窗口管理器架构(无鼠标版)
核心思想:
Display Server
:只负责
合成与上屏
Window Manager
:作为
特殊 Client
,管理所有窗口的装饰与键盘交互
普通 Client
:只绘制
内容区域
交互方式:
| 操作 | 快捷键 |
|---|---|
| 切换焦点窗口 | Alt+Tab |
| 移动窗口 | Alt+方向键 |
| 缩放窗口 | Alt+Shift+方向键 |
| 关闭窗口 | Alt+F4 |
| 最大化 | Alt+F10 |
💡 i3、xmonad 等平铺式窗口管理器正是以键盘为中心 !
📐 二、窗口管理协议扩展
- 新命令类型
-
窗口状态
⌨️ 三、键盘事件处理
-
Display Server 添加键盘事件通道
TTY 驱动将特殊按键(如
Alt
)发送给
Window Manager
普通字符仍发送给
焦点窗口 -
WM 键盘状态机
-
处理按键事件
🖼️ 四、用户态窗口管理器实现
-
WM 主循环
-
处理新窗口
-
绘制窗口装饰
-
窗口操作函数
📡 五、Client 端适配
-
处理 WM 命令
-
绘图区域自动适配
Client 始终绘制到
内容区域缓冲区
WM 负责将内容区域合成到正确位置
🧪 六、测试:键盘控制窗口
操作流程:
- 启动 Terminal 和 Painter
- Alt+Tab
→ 切换焦点窗口(标题栏颜色变化)
-
Alt+→
→ 焦点窗口向右移动 10 像素
-
Alt+Shift+→
→ 焦点窗口宽度增加 10 像素
-
Alt+F4
→ 关闭焦点窗口
运行效果:
焦点窗口标题栏:蓝色
非焦点窗口标题栏:灰色
窗口移动/缩放实时生效
关闭窗口后自动切换到下一个窗口
✅ 键盘驱动的窗口管理器工作正常 !
⚙️ 七、优势与扩展
优势:
高效
:键盘操作比鼠标更快(对程序员友好)
可靠
:无需复杂鼠标驱动
可脚本化
:快捷键可绑定到脚本
扩展方向:
- 窗口布局管理
平铺布局(i3 风格)
标签式布局(一个窗口区域,多个标签页) -
工作区(Workspace)
Ctrl+Alt+1/2/3
切换工作区
每个工作区独立窗口集合 -
窗口规则
根据应用名称自动放置窗口
自动最大化特定应用
💡 键盘为中心的设计,正是高效工作流的核心 !
💬 写在最后
窗口管理器不需要鼠标, 键盘足以掌控整个桌面。 在命令行与快捷键的世界里, 效率与优雅并存。
今天你实现的第一个键盘窗口管理器, 正是 i3、xmonad 等现代 WM 的简化版。
🌟 真正的掌控感,来自指尖而非鼠标。
📬 动手挑战 : 添加 Alt+F11 全屏快捷键,并实现工作区切换(Alt+1/2/3)。 欢迎在评论区分享你的键盘快捷键配置!
👇 下一篇你想看: 任务栏(Taskbar)实现 ,还是 终端多标签支持 ?
#操作系统 #内核开发 #窗口管理器 #KeyboardDriven #WM #图形界面 #从零开始
📢 彩蛋 :关注后回复关键词 “wm-keyboard” ,获取:
完整键盘窗口管理器源码
窗口装饰绘制模板
快捷键配置表
评论