i3 窗口管理器

运行X不一定需要窗口管理器,但它通常与X结合使用,以便于执行某些操作。窗口管理器的工作是负责窗口的放置,为用户提供一些机制来更改窗口的位置/大小,并在一定程度上与客户端通信(例如,处理MPlayer等客户端的全屏请求)。

X11客户端在不同的上下文中运行,所以窗口管理器只是另一个客户端,就像所有其他X11应用程序一样。但是,它处理一些普通客户端通常不处理的事件。

在i3的情况下,任务(及其顺序)如下:

  • grab 按键绑定(按键按下/释放时候发送指定信号)

  • 遍历所有现有窗口并管理它们(如果窗口管理器不是作为X的第一个客户端启动时候)

  • 创建并管理新窗口

  • 处理客户端的 _WM_STATE 属性,i3 仅处理 _WM_STATE_STATE_FULLSCREEN_NET_WM_STATE_MANDS_ATTETION

  • 处理客户端的 WM_NAME 属性

  • 处理客户端的大小提示,以按此比例显示

  • 处理客户端的紧急提示

  • 处理输入通知(焦点跟随鼠标)

  • 处理按钮(比如鼠标按钮)按下后获得焦点或显示窗口事件

  • 处理 expose 事件,以便重新绘制自己的窗口(比如装饰)

  • 响应用户的命令:更改焦点、移动窗口、切换工作区、更改容器的布局模式(默认/堆叠/选项卡)、启动新应用程序、重新启动窗口管理器

main 函数

  1. 建立 xcb 连接

  2. 加载 i3 配置

  3. 检查 XKB 扩展,加载 Xcursor

  4. 设置 EWMH 信息

  5. 获取按键绑定

  6. 检查 XRandr 屏幕

  7. 管理所有现有窗口

  8. 执行配置的启动进程

  9. 启动 i3 bar

  10. 进入事件循环

i3配置解析

  1. 解析每行中带有set字样的配置项,获取到set 配置项中的 keyvalue,并把所有配置项中涉及set配置的key替换为value