7.2.2 更新任务条上的任务项

前面我们看到,在winman中,每当为一个窗口“落户”时,winman都将更新根窗口的属性_NET_CLIENT_LIST_STACKING。因此,任务条利用的就是这个机制,监测根窗口属性的变化,从而跟踪系统中任务的变化,相关代码如下:

7.2.2 更新任务条上的任务项 - 图1

7.2.2 更新任务条上的任务项 - 图2

在任务条初始化时,其将选择根窗口事件掩码PropertyChangeMask,并设置根窗口的属性变化事件的回调函数为root_window_event_filter。如此,一旦根窗口的属性发生变化时,任务条都将洞悉。

每当根窗口的属性_NET_CLIENT_LIST_STACKING发生变化时,函数taskbar_setup_items就读取根窗口的该属性的值,获取目前系统中全部的窗口列表。然后遍历这个列表,更新任务栏。为了简单,该函数做了很多简化,比如只要窗口类型是_NET_WM_WINDOW_TYPE_NORMAL,并且也没有判断窗口是否是其他窗口的临时窗口,任务条就为其在任务条上创建一个任务项。

作为桌面环境的核心组件之一,在桌面环境启动时,任务条是首先启动的核心组件之一。理论上,这个时候还没有应用启动,但是不排除系统运行过程中,任务条重新启动,谁也不能保证程序完全没有bug。因此,无论如何,任务条还是有必要在启动时获取系统中正在运行的任务,并为它们在任务条上建立相应的任务项。这个过程请读者参考随书光盘中附带的源代码。