首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 焦点模型分析(2)Linux 上的焦点系统

Linux 焦点模型分析(2)Linux 上的焦点系统

Linux 上的焦点系统
  • Linux 上的焦点模式
几乎所有 Linux 系统都支持前面介绍的三种焦点模式。以 SUSE 10的 GNOME 桌面系统为例。SUSE 10上焦点模式的默认焦点模式也是采用 click-focus 模式。同时,用户也可以通过 Control Center->Windows 来修改系统所使用的焦点模式(见图2)。
“Window Selection”下的复选框如果没有被选中,如图中所示,则使用的是 click-focus 模式,也就是默认的焦点模式。如果用户将此复选框选中,那么系统将采用 sloppy focus 模式。
图 2 SUSE 10上设置焦点模式用户所设置的焦点模式由 GConf 管理保存,它所对应的键值为“/apps/metacity/general/focus_mode”。用户也可以通过 gconf-editor 修改此键对应的值达到修改焦点模式的目的(见图3)。
图 3 GConf 中对焦点模式的设置从 GConf 中对这个键的描述我们可以看出,该键支持的值有“click”、“sloppy”和“mouse”,分别对应了焦点模式中的 click-focus, sloppy focus 和 focus-follow-mouse。
  • X 系统中的焦点
Linux 上的界面系统使用的是 X 窗口系统。X 是一个面向网络的窗口系统,它采用了 Client-Server 的模型。Client 可以看做是X系统下运行的应用程序。X Server 为各个 Client 提供了界面方面的服务。Client 和 Server 可以不在同一台机器上运行,它们通过网络发送请求和消息。
Windows 上的焦点是一个局部的概念,每个线程都拥有自己的焦点窗口。但是在 X 系统中,焦点是一个全局的概念。整个系统中只有一个 X 窗口拥有 X 焦点。应用程序可以通过 XSetInputFocus 来设置焦点窗口。与 Windows 不同的是,在 Linux 上不可见的窗口是不能被设置为焦点窗口的。
在 X 系统中, X Server 会在窗口获得或者失去焦点时发送 FocusIn 和 FocusOut 事件通知Client。但是和 Windows 不同的是,并不是所有窗口都能在焦点切换时收到通知,只有创建时选择了 FocusChangeMask 的窗口才能接收到焦点变化事件。以下代码就是创建一个这样的窗口。
清单1 创建接收焦点变化事件的窗口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    Window window;
XSetWindowAttributes attr;
attr.event_mask = FocusChangeMask;
//如果窗口还希望接收其它事件还可以设置其它掩码
//例如:attr.event_mask |= StructureNotifyMask;

window = XCreateWindow(display,
       XDefaultRootWindow(display),
       200, 200,
       300, 300,
       0,
       XDefaultDepth(display, 0),
       InputOutput,
       CopyFromParent,
       CWBackPixel,
       &attr);
}




  • X 系统上的键盘输入模型
X 系统有着非常特殊的键盘输入模型。在一般情况下(没有应用调用了 XGrabKey 或者XGrabKeyboard 的情况下),X 系统下键盘输入不仅与焦点有关,还与鼠标位置相关。如果当前鼠标位于焦点窗口之外,那么,和 Windows 一样,X Server 会将键盘事件发送给焦点窗口。但是,如果鼠标位于焦点窗口的子窗口上,那么,键盘事件会直接发送给这个子窗口。这样的输入模型往往使 Linux 的初级用户尤其是习惯了 Windows 焦点模型的用户相当困惑。
图 4 X 系统键盘模型实例以图4为例,当前窗口 A 拥有 X 焦点,窗口 B 是窗口 A 的子窗口。
当鼠标在 P1 位置时,它位于窗口 A 范围之外,那么键盘的 KeyPress/KeyRelease 事件会发给 A 窗口;
当鼠标在 P2 位置时,虽然该位置处于窗口 A 范围内,但是不属于任何 A 窗口的子窗口上,因此,键盘事件也会发给 A 窗口;
当鼠标位于 P3 位置时,由于 P3 位于窗口 A 的子窗口 B 上,因此,键盘事件将直接发给窗口 B。
由于 X 系统上输入模型的特殊性,基于 X 系统开发的较为高级的图形库一般会将 X焦点设置在顶层窗口上,而系统内部维护着自己的逻辑焦点。这些图形库会统一处理发送到本应用的键盘事件,将键盘事件再分发给拥有逻辑焦点的控件。
关于 X 系统上焦点管理的具体规范将在下一章中进行详细的讨论。
返回列表