7.2 任务条和桌面

从最初出现在桌面环境中发展到现在,任务条的风格也在不断地发生改变,但依然是桌面环境的重要组件之一,只不过表现形式并不一定是千篇一律。

典型的任务条从左至右包括“开始按钮”、“快速启动栏”、“任务项”以及“通知区域”。用户通过“开始按钮”可以启动应用程序;“快速启动栏”中放置用户常用的一些程序;每个启动的任务都有一个“任务项”;“通知区域”主要用来显示一些系统状态,比如显示当前的输入法、网络状态等。

除了任务条外,一般的桌面环境都有一个背景,并且在这个背景上面可以显示一些快捷方式,可以显示一些很有个性的小插件。

本章中,我们实现了一个简单的任务条和一个桌面。不同的桌面环境,实现这些组件的逻辑不尽相同,有的是放在一个完整的程序中,有的是每个组件是一个单独的程序,我们采用后者。我们通过这两个程序向读者展示使用图形库(GTK)编程。相比于Xlib,GTK的编程理解起来要容易得多,而且GTK的官方文档写得也非常详尽,所以我们就不浪费篇幅讨论有关GTK的编程了,这里仅讨论其中与窗口管理器相关的部分。

7.2.1 标识任务条的身份

虽然任务条也是一个普通X应用,但是作为桌面环境中重要的一个组件,还是有一些特殊的地方。比如,在我们构建的桌面环境中,窗口管理器将其停靠在屏幕的最下方。但是任务条如何向winman亮明自己的任务身份呢?读者一定已经猜到了:属性。任务条自定义了属性_CUSTOM_WM_WINDOW_TYPE_TASKBAR,在启动时,其将窗口的属性_NET_WM_WINDOW_TYPE设置为属性_CUSTOM_WM_WINDOW_TYPE_TASKBAR,如下代码所示:

7.2 任务条和桌面 - 图1

winman一旦发现窗口的类型为_CUSTOM_WM_WINDOW_TYPE_TASKBAR,则将其作为任务条管理,让我们回顾一下winman中给“窗口”落户的相关代码:

7.2 任务条和桌面 - 图2

如果winman发现窗口的类型是_CUSTOM_WM_WINDOW_TYPE_TASKBAR,winman将不再创建标准窗口的对象,而是创建一个任务条窗口对象,代码如下:

7.2 任务条和桌面 - 图3

其中比较有趣的两个地方,我们需要特别关注:

1)winman将任务条布局在特定的位置。其左起屏幕最左边,宽度为整个屏幕。高度为TASKBAR_HEIGHT,这个宏在winman中定义,值为30像素。位于屏幕的底部。

2)任务条的构建窗口装饰的函数taskbar_client_reparent,其实现如下:

7.2 任务条和桌面 - 图4

函数体怎么是空的?没错,任务条不需要任何装饰。读者可能会问,那为什么定义这么一个空函数体?这个主要是出于面向对象实现上的考虑,当然,条条大路通罗马,聪明的读者也可以不需要定义这么个空函数,而是采用调用前判断函数指针是否为空,等等。