窗口管理器

Window Manager 是一种特殊的 Xclient。

使用窗口管理器时,Xserver 并不直接与其它 Xclient 通信,而是通过 WM 中转,当一些消息被定义为 WM 指令时,它们会被拦截。例如 Alt+F4 关闭窗口、拖动标题栏……

消息“打开链接 linuxtoy.org”,具体内容如下:

  1. 输入焦点在地址栏的范围内,“linuxtoy.org”,回车

Xserver 并不能直接判断焦点,而是这样:

  1. Xserver 向 WM 发送位置和点击的信息,WM 根据当前的“焦点策略”确定激活(最上层)的窗口为 Firefox
  2. Xserver 将 Firefox 显示在最上层,高亮显示它的标题栏
  3. 在窗口 Firefox 内点击地址栏,或者 Ctrl+L,Xserver 将位置信息发送给 WM,WM 再发送给 Firefox
  4. Firefox 判断当前焦点后,显示一个闪动的文字输入光标
  5. Firefox 将输入光标通过 WM 发送给 Xserver,Xserver 在屏幕相应位置进行显示

那么,“窗口管理器”到底能作些什么呢?其实它所作的只有一件事──管理窗口。例如:

  • 最上层的窗口会把其它窗口挡住

  • 它通常是一个“已激活窗口”,根据不同的“焦点策略”,窗口管理器确定被激活的窗口。

    激活窗口标题栏高亮显示,接收大部分的键盘消息和窗口内的鼠标点击消息。

  • 为了美观和容易分辨,大多数窗口都要有标题栏和边框。

    为了方便,标题栏上还要有一些按钮,比如:最小化,最大化,关闭(这些按钮是窗口管理器请求的小窗口)

  • 一个窗口可以在另一个窗口旁边显示,而不一定完全被遮挡。为了实现这一点,就要控制窗口显示的位置

  • 为了控制窗口的显示位置,需要将整个屏幕用座标描述,最好的办法是绘制一个填充整个屏幕的窗口,也就是根窗口。

  • 因为根窗口是最大的,所以它可以严严实实的遮挡任何窗口,为了避免这一点,根窗口永远在最底层。这很形象的说明了为什么它叫作“根窗口” ……root

  • 根窗口不一定只有一个,大多数的窗口管理器可以使用 “工作区” ,来切换显示多个根窗口

  • 根窗口固定位置上通常放置一些其它 Xclient 的窗口,例如底部面板,顶部面板,侧面板,程序启动图标

  • 面板上又可以放一些其它的 Xclient 窗口,如任务条,启动栏,菜单……

    任务条可以以图标显示正在运行的任务,还可以作其它的杂活,像自动挂载 USB设备……