标题: Linux 焦点模型分析(1)简介 [打印本页] 作者: look_w 时间: 2018-5-23 15:25 标题: Linux 焦点模型分析(1)简介
概述无论是 Windows 应用程序还是 Linux 应用程序的开发人员,焦点( focus )都是一个非常常见的一个概念。那么焦点究竟是什么呢?简单的说,焦点决定了由哪个窗口或者控件接收键盘输入信息,因此,它又被称作输入焦点。对于用户来说,最直观的感觉是,有光标闪动的窗口或者被高亮的控件就有焦点。
很多初级应用程序员或者 Windows 用户有这样一个误解,认为凡是鼠标点击的窗口就是焦点窗口。当出现有的窗口或者控件点击后没有反应的现象时,就认为是焦点出现了问题。事实上,焦点仅仅控制着键盘的输入,而鼠标输入与焦点没有直接关系。用户之所以有这样的误解是由于另一个概念,系统的焦点模式(focus mode )。焦点模式决定了鼠标如何使一个窗口获得焦点。一般来说,焦点模式被分为三种:
不同的系统对焦点模式的支持不同,所使用的焦点模型也有很大的区别。
Linux 与 Windows 焦点系统Linux 使用的焦点模型与 Windows 有着很大的区别。对于大多数用户来说,Windows 的焦点模型较为直观、易于理解,因此,本节中我们将以Windows 上的焦点模型为引子,着重介绍 Windows 与 Linux 上焦点系统的基本概念,并讨论两个平台上焦点系统的区别。
Windows 上的焦点系统
Windows 上的焦点模式
Windows 上默认采用 click-to-focus 的焦点模式。这是因为 Windows 操作系统采用的资源管理器 explorer.exe 只支持这一种焦点模式。这也是造成之前所提到的用户认为鼠标点击的窗口就是焦点窗口的错觉的原因之一。
现在有一些基于 X 的 Windows 窗口管理器,如 blackbox for Windows 等,可以替代explorer。这些窗口管理器就可以支持以上提到的焦点模式。
Windows 上的键盘输入模型
正如前面所介绍的,焦点决定了哪个窗口可以获得键盘输入。那么,介绍系统的焦点模型就不能不提到键盘输入。下图展示的就是 Windows 上的键盘输入模型。
图 1 Windows 上键盘输入模型当键盘中的一个键被按下或者被释放时,键盘驱动会收到键盘中断,获得该按键的扫描码( scan code )。这是一个与硬件相关的数值。驱动会根据键盘布局将这个扫描码转换成设备无关的虚拟键盘码( virtual-key code ),并生成一个键盘消息( WM_KEYDOWN 或者 WM_KEYUP 消息)放在系统输入队列中。在任何给定的时刻,只有一个线程与系统输入队列连接。系统会将这个消息从系统输入队列中取出,发送给这个线程的输入消息队列。该线程的消息循环又会从本线程的消息队里取出这个消息,传递给合适的窗口处理过程。这样的输入模型保证了一个线程的行为不会对其它前程产生影响。例如,如果一个线程挂起了,不会妨碍其他线程接收键盘输入。
那么,哪个线程是“与系统输入队列连接的线程”呢,哪个窗口又是这个“合适的窗口”呢?Windows 有它自己的管理方式。