嵌入式Linux体系中应用的GTK+和X阐发
发布日期:2011-04-23
在嵌入式 Linux 下有很多图形界面体系 GUI,包括 Qt/Embedded,FLTK,Microwindows 和 GTK+ 等。作为一个开辟者,到底利用什么样的 GUI 体系呢?对一个别系,将它改造为切合你的需求,你要做多少修改呢?修改后的体系的尺寸一样通常会有多大呢?这些都是开辟职员会遇到的标题。我们在这里讨论的便是要对这些内容做一个细致过细的阐发,通过我们的讨论,大家会对基于 GTK+ 和 X 的 GUI 在嵌入式Linux 下的应用有一个确切的相识。
在嵌入式体系应用日益生长的即日,越来越多的应用都须要利用到 GUI 来举行开辟,以此来得到更好的交互性。
嵌入式 Linux 下 GUI 的选择,对大多数开辟职员来说是一个须要衡量相比的进程。选择 GTK+ 运行在 X 体系上,然后 X 体系运行在嵌入体系的 framebuffer 上,这会是一个很好的选择。
GTK+ 与 X 的长处
固然,GTK+ 与 X 一样通常都是被大家思量为体积较大的桌面体系的好搭配,但实际上敷衍嵌入体系来说,它也有着诸多的长处:
1、 X-window 体系与 GTK+ 都非常稳固可靠,X-window 体系是经历了长期的开辟及应用实践的,GTK+ 也是一个比较成熟的开放源代码项目。
2、 X-window 体系是一个机动的 client/server 的模型布局,一个应用客户真个瓦解不会影响到图形体系的其他部分,这是一个很告急的特性,它有利于支持第三方应用的扩展开辟,而不影响到主体部分。
3、 GTK+有两个告急的库:GDK和GLIB。GDK抽象了底层的窗口办理,要移植 GTK+ 到另一个差别的窗口体系的话,我们只须要移植 GDK 就可以了。GLIB 是一个东西聚集,它包括了数据典范,种种宏定义,典范转化,字符串处理惩罚处罚,恣意应用步调都可以链接这个 GLIB 库,利用此中的种种数据典范、要领,来克制重复代码,大概说克制开辟职员重新发明轮子,如许有利于淘汰整个别系的尺寸。
4、 对 GTK+/X 的裁剪是很容易的,它们有着很好的可配置的选项,有着明白的代码布局,可以包管沉寂正确地去失大段的不须要的代码。
5、 GTK+ 有着大量的应用,GTK+ 已经被用在了很多告急的应用体系中。
6、 GTK+ 的授权是 LGPL 要领的,X 是 non-copyleft free license 的,第三方开辟的体系都能与它们举行链接。
7、 GTK+/X 二者都是基于 C 代码的,而不是C++。
8、 GTK+ 利用 C 来实现了面向东西的架构。
其他 GUI 体系
其他可以选择的图形体系包括:Qt/Embedded,FLTK 和 Microwindows。
1、 Qt/E 是此中较高级的,它是一个完备的,基于 framebuffer 的 GUI 体系,由 Trolltech 公司开辟。
2、 Qt/E 有着高效的图形渲染结果,还包括 TrueType 字体体系,及 alpha blending 半透明处理惩罚处罚。
3、 但 Qt/E 不是利用 LGPL 授官僚领,而是利用两种授官僚领:开辟利用 GPL,而商用须要授权与版税。
4、 Qt/E 是用 C++ 编写的。
5、 Qt/E 非常大,一个 iPAQ QPE 就包括了 3.3MB 的 Qt/E 库和一个 718KB 的 QPE 库(和 Xlib 雷同的一种库)。
6、 Qt/E 不敷稳固,QPE demo 不错,但出现过瓦解。
7、 FLTK (the Fast Light Toolkit) 是一个小型的 GUI 图形体系,它也是用 C++ 写的,特性太少,应用范畴较少,不敷成熟。
8、 Microwindows 和 X-Window 相比也是一个不错的选择,它占用约莫 100KB-600KB 大小的内存,和文件存储空间,固然已经有了一个其上的 GTK+ 移植,但还是不敷成熟。
X-window:比你想象的要小很多
敷衍X-window体系,宽大的网络开辟者已经做了大量的变乱来减小其的尺寸,最着名的有TinyX。可以通过对不须要的代码的裁剪及去除XLIB中静态数据来淘汰总体的尺寸,如:color办理体系,弧形,粗线条等。
在大多数开辟职员的印象里,X 体系很巨大,但实际上,你听到的,是那些对 X 不敷相识的人的一种误解。在颠末裁剪后的环境下,GTK+/X 要比 GTK+/FB 与 Qt/E 还要来得有效,且 XLIB 对一样通常的应用步调有着更好的支持作用,应用步调的开辟会变得更高效。
怎样裁剪 GTK+
我们可以从标准的 GTK+ 发行版原来裁剪,裁剪失此中的不须要的,修改已经有的代码,并参加新的特性所须要的代码。裁剪的范畴包括小的窜改,也包括一些大的布局性的、内核的变革。
一、 去除 Widgets 窗口
最开始,我们把不须要的 Widgets 去撤除,比如:GtkGamma、GtkHRuler、逾期了的 GtkList(被 GtkCList所调换了)、和我们不须要的 GtkFrame 边框。
二、 Widgets 窗口尺寸与绘制
接着,修改Widgets的大小与绘制要领,GTK+提供了一个主题引擎机制,来控制窗口的外貌与结果。它容许在运行中设置字体,设置行隔绝,设置绘制特性。如许的机制很不错,但不敷机动,代码中很多设置的地方都是利用硬编码的要领;别的,一种主题,便是一堆分外的代码段和参数,如许会增长团体的尺寸。
须要找出影响到窗口体系团体尺寸的内容,再来修改它。比如,一个按钮的大小与绘制,包括如许的参数:边框的宽度,x/y的位置(主题引擎须要的参数),缺省的隔绝(常量),缺省的左上角的位置(常量),得到内核。这些在嵌入体系中并不须要那么完备,我们可以根据实际的需求来简化代码,来克制GTK +的巨大性。
别的,利用面向东西的要领,来承继窗口Widgets的特性,作为子类也是一个有效的要领。
三、GtkWindow
GTK+总是假定一个窗口内里包括了另一个窗口,它们便是嵌套干系。但敷衍我们通常会遇到的有软键盘的应用时,就不完全正确了。软键盘固然是属于一个窗口的,但却会超过跨过那个窗口。以是为了突破这个假定,须要对GtkWindow增长一些特性,将软键盘处理惩罚处罚成一种分外的子窗口。
软键盘地点的窗口,须要处理惩罚处罚软键盘的按键变乱,并将按键转发给软键盘东西条。当软键盘按下,软键盘的回调函数就被注册到原始窗口上,如许软键盘就会相应按键变乱。在GtkWindow上增长接口,可以创建,相应按键。
在小屏幕的嵌入体系中,可以将转动条做得更简化些,去失边框,利用单个转动条。这些都更得当嵌入体系。
字体办理体系
在字体办理方面,要找到一个轻型的机制来在嵌入式体系表现种种字体,并不是那么大抵,困难在于GTK+ 的大型的 Widget 风格派头风格派头与 X 体系的老式的字体办理机制的连合所引起的标题。
前面提到的,主题引擎要领的GTK+ 是用来控制窗口的样式与外貌的。在一个窗口表现之前,它会得到一个样子边幅形状东西,GtkStyle,它可以是一个指向父窗口的样子边幅形状东西指针,大概是一个新的典范,这些样子边幅形状东西将被应用到这个窗口及它的子窗口。这个样子边幅形状由缺省值、rc 文本文件、应用来确定。
要变革一个窗口的字体,你必须克隆窗口的样子边幅形状,并利用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。
X-window:比你想象的要小很多
敷衍X-window体系,宽大的网络开辟者已经做了大量的变乱来减小其的尺寸,最着名的有TinyX。可以通过对不须要的代码的裁剪及去除XLIB中静态数据来淘汰总体的尺寸,如:color办理体系,弧形,粗线条等。
在大多数开辟职员的印象里,X 体系很巨大,但实际上,你听到的,是那些对 X 不敷相识的人的一种误解。在颠末裁剪后的环境下,GTK+/X 要比 GTK+/FB 与 Qt/E 还要来得有效,且 XLIB 对一样通常的应用步调有着更好的支持作用,应用步调的开辟会变得更高效。
怎样裁剪 GTK+
我们可以从标准的 GTK+ 发行版原来裁剪,裁剪失此中的不须要的,修改已经有的代码,并参加新的特性所须要的代码。裁剪的范畴包括小的窜改,也包括一些大的布局性的、内核的变革。
一、 去除 Widgets 窗口
最开始,我们把不须要的 Widgets 去撤除,比如:GtkGamma、GtkHRuler、逾期了的 GtkList(被 GtkCList所调换了)、和我们不须要的 GtkFrame 边框。
二、 Widgets 窗口尺寸与绘制
接着,修改Widgets的大小与绘制要领,GTK+提供了一个主题引擎机制,来控制窗口的外貌与结果。它容许在运行中设置字体,设置行隔绝,设置绘制特性。如许的机制很不错,但不敷机动,代码中很多设置的地方都是利用硬编码的要领;别的,一种主题,便是一堆分外的代码段和参数,如许会增长团体的尺寸。
须要找出影响到窗口体系团体尺寸的内容,再来修改它。比如,一个按钮的大小与绘制,包括如许的参数:边框的宽度,x/y的位置(主题引擎须要的参数),缺省的隔绝(常量),缺省的左上角的位置(常量),得到内核。这些在嵌入体系中并不须要那么完备,我们可以根据实际的需求来简化代码,来克制GTK +的巨大性。
别的,利用面向东西的要领,来承继窗口Widgets的特性,作为子类也是一个有效的要领。
三、GtkWindow
GTK+总是假定一个窗口内里包括了另一个窗口,它们便是嵌套干系。但敷衍我们通常会遇到的有软键盘的应用时,就不完全正确了。软键盘固然是属于一个窗口的,但却会超过跨过那个窗口。以是为了突破这个假定,须要对GtkWindow增长一些特性,将软键盘处理惩罚处罚成一种分外的子窗口。
软键盘地点的窗口,须要处理惩罚处罚软键盘的按键变乱,并将按键转发给软键盘东西条。当软键盘按下,软键盘的回调函数就被注册到原始窗口上,如许软键盘就会相应按键变乱。在GtkWindow上增长接口,可以创建,相应按键。
在小屏幕的嵌入体系中,可以将转动条做得更简化些,去失边框,利用单个转动条。这些都更得当嵌入体系。
字体办理体系
在字体办理方面,要找到一个轻型的机制来在嵌入式体系表现种种字体,并不是那么大抵,困难在于GTK+ 的大型的 Widget 风格派头风格派头与 X 体系的老式的字体办理机制的连合所引起的标题。
前面提到的,主题引擎要领的GTK+ 是用来控制窗口的样式与外貌的。在一个窗口表现之前,它会得到一个样子边幅形状东西,GtkStyle,它可以是一个指向父窗口的样子边幅形状东西指针,大概是一个新的典范,这些样子边幅形状东西将被应用到这个窗口及它的子窗口。这个样子边幅形状由缺省值、rc 文本文件、应用来确定。
要变革一个窗口的字体,你必须克隆窗口的样子边幅形状,并利用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。
优化
在ARM7的体系上,由于没有浮点运算FPU,以是GTK+中的浮点运算部分最好是去失,不然会大大影响性能。GTK+利用到的浮点变量只散布在少数的几个窗口中,并且去失它们会带来3%到12%的性能进步。
高像素的应用会导致速率较慢,这大多是由于GTK+与X中对高像素的屈从低下的处理惩罚处罚有关。如涉及到的XPM,XPM (X pixmap)格局是被筹划来做到较好的兼容性,而不是越发快速。X体系是一个像素一个像素地画到server的pixmap的。GTK+的像素处理惩罚处罚也很低效,它是利用fgetc()来读取XPM文件的,这就会带来大量的上下文切换开销。
X窗口体系的布局也导致了像素的加载变慢。GTK+客户端须要加载,阐发XPM文件,将像素值通过传输协议发送给server,然后server才将像素值放入framebuffer。要是客户端直接将数据写到framebuffer server那将会有效很多。
处理惩罚处罚的GTK+像素的步调便是,写一个临时的中间进程,获取render过的像素,利用这个原始数据来调换XPM数据,这个原始数据就可以直接欺凌写到X server上。从布局上来看,这固然不是一个很好的处理惩罚处罚步调,但在屈从上却要比利用XPM要快上80%。
总结
如今的斲丧电子大多须要一个好看,实用的图形界面体系GUI。在嵌入体系linux下,有很多种GUI可供选择。利用开放代码的GUI的长处便是你可以将其裁剪得餍足你的种种百般的分外需求。GTK+便是一个很好的选择,而X-window体系提供了一个稳固可靠的client/server模型。当你得到一个只有2.9M大小的定制过的GUI时,对大多数的嵌入体系还是很有参考价格的。