Board logo

标题: Linux 焦点模型分析(4)GTK+ 应用的焦点管理模型 [打印本页]

作者: look_w    时间: 2018-5-23 15:30     标题: Linux 焦点模型分析(4)GTK+ 应用的焦点管理模型

GTK+ 是 GNOME 桌面系统主要采用的高级图形开发库。它为开发人员提供了一系列封装好的控件,极大的简化了开发人员的工作。本节将简要介绍一下 GTK+ 的焦点管理模型。
作为一个高级图形开发库,GTK+ 考虑到用户体验以及窗口嵌入的需要,采用了输入代理技术,相应地,它使用的局部主动输入的模型。其使用体验与 Windows 上的应用非常类似。GTK+ 内部维护了自己的逻辑焦点,可通过 gtk_window_get_focus 和 gtk_window_set_focus 等方法设置其逻辑焦点控件。
GTK+ 沿用了 XEmbed 提出的窗口激活的概念。在 Windows 上,焦点窗口以线程为单位进行维护。而在 GTK+ 系统中,焦点窗口以顶层窗口为单位维护。只有被激活的顶层窗口的逻辑焦点控件才是应用程序的焦点。也就是说,用户可以调用 gtk_window_set_focus 为某 GtkWindow 设置焦点控件。但是,如果这个 GtkWindow 当前没有被激活,也就是说 X 焦点没有设在该窗口的焦点代理上,那么此时调用 GTK_WIDGET_HAS_FOCUS( widget )将返回 FALSE ,但是 gtk_window_get_focus 仍然返回此控件。
在 GTK+ 系统中,所有的消息都是以信号( signal )的形式发给相应控件。如果应用程序需要处理这些 signal,可以通过 g_signal_connect 和 g_signal_connect_after 将相应的回调处理函数与相应的信号关联起来,这些处理函数被称为 signal hander。GTK+ 的标准控件一般会为这些信号提供处理函数。当然,应用程序也可以添加自己的 signal hander。
对于 GTK+ 的焦点系统,当控件得到或者失去焦点时,会收到 focus_in_event 和focus_out_event。GtkWidget 对这两个信号原型的定义如下:
清单7 focus-in-event、focus-out-event signal prototype
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
“focus-in-event” signal
                 gboolean    user_function      (GtkWidget *widget,
                             GdkEventFocus *event,
                             gpointer user_data);
widget : the object which received the signal.  
event :  
user_data : user data set when the signal handler was connected.
Returns : TRUE to stop other handlers from being invoked for the event.
     FALSE to propagate the event further.  


“focus-out-event” signal
gboolean    user_function      (GtkWidget *widget,
                             GdkEventFocus *event,
                             gpointer user_data);

widget : the object which received the signal.  
event :  
user_data : user data set when the signal handler was connected.
Returns : TRUE to stop other handlers from being invoked for the event.
     FALSE to propagate the event further.




比如 gtkEntry 控件,它类似于 Windows 上的单行的 Edit 控件。当 focus_in_event 发送给 GtkEntry 时,GtkEntry 默认会设置它的输入法状态,并显示插入光标。应用程序还设置自己的 signal handler。这样的编程接口给程序员带来了很大的方便。下面的代码显示了如何为一个 GtkEntry 设置与 focus_in_event 的 signal handler。
清单8 处理 focus_in_event signal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static gboolean entry_focus_in_handler (GtkWidget *widget,
GdkEventFocus *event,
gpointer user_data)
{
    //当该GtkEntry收到focus_in_event时,选中其所有内容
gtk_editable_select_region(GTK_EDITABLE(widget), 0, -1);
    return FALSE;
}

static void initEntry()
{
GtkWidget* entry = gtk_entry_new();

g_signal_connect(G_OBJECT(entry),
“focus_in_event”,
G_CALLBACK (entry_focus_in_handler),
0);
    ………
}




总结本文主要介绍了焦点的基本概念,对比 Windows 焦点模型介绍了 Linux 系统上的焦点模型的特殊性,并着重介绍了 X 系统的一些焦点管理规范。可以看出,X 窗口系统的焦点模型比 Windows 上的焦点模型复杂很多。实际上,X 系统上的焦点系统,尤其在与窗口管理器的配合方面,还有着很多细节问题。尽管类似 GTK+ 这样的高级图形库屏蔽了 X 的复杂特性,但是,Linux 应用程序员只有了解了这些细节和规范才能编出更符合 X 风格的界面程序,也才能应对各种出乎意料的焦点问题。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0