7.2.3 激活任务
任务条的另外一个主要任务就是将最小化的,或者将非活动的窗口激活为当前活动窗口。
EWMH规范规定,如果一个X应用希望激活另外一个窗口,可以通过向根窗口发送消息_NET_ACTIVE_WINDOW来实现。因此,在我们的任务条中,当用户点击任务按钮时,在回调函数中将向根窗口发送ClientMessage事件,其中的消息类型为_NET_ACTIVE_WINDOW,代码如下:
事实上,任务条发给根窗口ClientMessage事件也被窗口管理器拦截了。读者可能有个疑问:窗口管理器会收到应用发给根窗口的类型为ClientMessage的事件吗?答案是肯定的。因为EWMH规定,ClientMessage对应的事件掩码是SubstructureNotifyMask和SubstructureRedirectMask,而窗口管理器恰恰选择了接收SubstructureNotify和SubstructureRedirect。
winman中处理事件ClientMessage的代码如下:
函数wm_handle_client_message检查消息的类型,如果是_NET_ACTIVE_WINDOW,则调用窗口对象中函数指针activate指向的函数,将事件XClientMessageEvent中指定的窗口切换为当前活动窗口。具体的过程我们在7.1.11一节已经详细讨论了。
在调用activate前,函数wm_handle_client_message还调用了函数show。目的是什么呢?原因是窗口可能上次被最小化了,因此首先需要请求X服务器显示这个窗口。