要改变一个窗口的字体,你必须克隆窗口的式样,并使用X字体加载一个新的字体,类似adobe-helvetica-bold-r-normal--12-*-*-*-p-*-iso8859-1。
但实际中会有些问题,GtkStyle是一个大的对象。如果一个屏幕上有很多种不同字体大小的多个窗口,每个都有一个唯一的GtkStyle对象,我们就会浪费大量的内存。到最后,X系统就不能支持类似字体的各种变化了。你甚至不能使X完成让某个字体变粗的操作,因为X系统是将不同外型的字体作为不同的字体的。X系统是假定你会硬编码一个希望的字体或者分析出一个字体名,改变字体及验证结果都将在字体服务器上。
还可以使用一个更好的方法来完善字体管理系统,即包装GtkStyle,这样开发者就可以通过属性来获得一个窗口的字体,这比直接使用 X 系统字体的名字要更灵活。比如要显示一个比基本字体要大一号,并且是黑体字就可以调用:
gtk_widget_set_font_bold (widget, TRUE); gtk_widget_set_font_enlarge (widget, 1);
这是通过在 GtkWidget 结构中加入一个 GdkFont * font 来实现的,GtkWidget 是所有窗口类的父类。如果设置widget->font 那么就使用它,否则就使用widget->style->font。
窗口管理
在嵌入系统GUI中,还需要建立一个窗口管理器。我们可以选择一个开放代码的,轻量级的X管理器,Aewm。在嵌入系统中,我们会将最上层的窗口设置为获得焦点,并且只有对话框能移动,能显示其标题栏。
窗口管理器是一个交互端,它可以管理内部与外部的应用程序的窗口。每一个应用程序的窗口,都会建立一个 socket 连接,并取一个名字。一个应用可以把请求将自己放在窗口堆栈的最下面,或者将一个命名的应用往上移。如果一个对话框要在最上层的窗口上打开,那么窗口管理器就将告诉这个最上层的窗口它将不再获得焦点,而新对话框将获得焦点。
整体尺寸大小
经过一系列的改进后,我们就得到了一个稳定的,功能和性能都能满足嵌入系统要求的GUI了。在ARM系统下,得到的尺寸大小为:
其中 GTK+ 里面仍然还有不需要的代码,可以将其再去除。如果再简化一下的话,GTK+ 可以做到850KB,总体大小可以到 2.8M。
运行性能
将修改过的 GUI 运行在一个 ARM7 的系统上,CPU 为 100MHZ,运行时的效果还不错,窗口响应用户操作的速度很迅速,新的画面创建与显示的速度都能接受。
|