摘 要:摘要:Enlightenment从单纯的窗口管理器发展了到目前的桌面环境,其应用领域也涵盖了移动设备和PC桌面。EFL从Enlightenment中独立了出来,成为一个嵌入式GUI系统,被应用到多个大型项目中。EFL系统中的核心模块包括Evas, Edje, Ecore和Elementary。其中,Evas是画布层,Ecore是GUI系统中的事件处理的底层模块。Edje采用文本格式的EDC文件来设计GUI界面,并在程序运行时动态加载二进制的Eet文件。这样,把界面设计和程序代码分离开来,这是EFL区别于其他流行GUI系统的显著特征之一。
关键词:关键词:EFL;GUI;窗口系统;系统架构;扩展性
中图分类号:TB51 文献标识码:A 文章编号:
0 引言
GUI系统是嵌入式Linux平台的重要组成部分之一,其性能和效率直接影响平台中所有应用程序的运行速度。平台中应用程序的外观和各种图形特效的实现都依赖于GUI系统。GTK+, Qt都是嵌入式Linux平台中广泛应用的开源GUI系统。EFL是继Gtk+, Qt之后的又一个新兴的开源GUI系统【1】。
EFL起源于开源的窗口管理器项目Englightenment。Englightenment有两个重要的版本E16和E17。早在1997年Englightenment就发布了E16,在当时E16窗口管理器是一个非常强大并且高度可配置的桌面环境。它能提供多种图形效果,包括窗口滑动,着色动画,波纹等。 E17的开发是从2000年开始的, 对E16进行了重新设计并添加了许多新的功能。从E16到E17,Englightenment从一个窗口管理器发展到了类似GNOME,KDE的桌面环境。 E17的一个重要变化就是把系统中的所有图形界面相关的模块组合成一个独立的GUI系统Enlightenment Foundation Libraries(简称EFL)。Enlightenment与EFL的依赖关系,正如GNOME依赖于GTK,KDE依赖于 Qt一样【2】。EFL作为一个GUI系统,就从Englightenment桌面环境中独立出来了,并发展成为一个可移植的、性能优化的图形系统。
1. EFL系统架构
EFL系统的框架如图1所示,其主要组成模块包括Elementary, Ecore, Edje, Evas以及Eina。
1.1 Evas图形库
Evas模块为整个EFL系统提供最基本的画布API。Evas画布所支持的图形基元包括常见的矩形、图像、单行文本、多行文本、线段、多边形以及渐变形状,包括直线渐变,辐射渐变和矩形渐变等。与GTK/GDK所采用的立即绘图模式相比,Evas采用的是保留模式,如图2所示。应用程序创建所需要的Evas图形对象,并可以在运行期间修改对象。Evas引擎负责应用程序中所有图形对象的绘制。在发生重绘现象时,应用程序不需要去处理具体的Evas对象的重绘,而是由Evas图形引擎负责。Evas支持的后端除了X11,还有OpenGL, Xrender,Framebuffer等。Evas图形库经过高度优化,内存消耗低,为EFL在嵌入式系统上的提供了性能保证。
1.2 Edje布局引擎
Edje布局引擎是EFL区别与其他嵌入式GUI系统的一个重要特性。Edje是基于Evas的一个复杂的图形设计和布局模块。通过在界面和程序代码之间提供一个抽象层,来实现灵活复杂的动态布局和动画。Edje把应用程序的图形界面设计与功能逻辑代码实现分离开来,实现真正的MVC设计模型。Edje的GUI界面用一种类C语法的文本EDC文件来描述。因此,基于Edje的应用程序由两部分构成,一部分是描述应用程序图形界面的EDC文件,另一部分是实现应用程序逻辑功能的C代码。这两部分相互独立,使得界面设计和代码实现都变得更加简单。需要更新应用程序的界面风格时,只需要修改EDC文件,而不需要改动C代码。
1.3 Ecore
与Evas和Edje不同的是,Ecore是一个非GUI模块。Ecore是EFL系统专门为嵌入式系统设计的一个底层库,实现了EFL系统中的任务处理,消息队列,基本数据结构,IPC机制,以及网络通讯和时钟等功能。同时,Ecore对常用的UNIX系统函数和窗口系统Xlib的API进行了封装。Ecore是完全模块化的,根据其功能,Ecore提供的抽象模块包括Ecore X, Ecore EVAS, Ecore Job, Ecore IPC, Ecore Config等。Ecore在EFL中充当的角色,就像GLib之于GTK+一样。
1.4 Elementary控件库
Elementary是EFL针对移动设备小屏幕触摸屏的特性所提供的一套基本控件库,包括窗口,文本标签,按钮,图标,文本输入框等。
2. 基于Edje的应用程序界面设计
2.1 EDC界面设计文件简介
EDC文件包含两个重要部分:images部分和collections部分。Images部分列出了图形界面中用到的所有图片资源。Collections部分包含一个或多个group。每个group都定义了一个完整的用户界面。Group又由parts和programs组成。part是界面设计中的最小单元。Edje支持Part的类型有文本, 矩形和图像。每个Part可以拥有多个状态描述。
Edje使用相对坐标来定义界面布局。描述一个界面元素的位置和尺寸只需要定义该元素的左上角和右下角的相对坐标。绝对坐标将由应用程序根据窗口大小计算得到。屏幕窗口的左上角的相对左边是(0.0, 0.0),右下角的相对坐标是(1.0, 1.0).
2.2 用户界面的动态加载
EFL提供编译工具edje_cc把文本文件my_UI.edc编译成二进制文件my_UI.edj。应用程序在运行期间动态加载my_UI.edj文件,把图形界面绘制到屏幕上,如图3所示。
3. EFL在嵌入式Linux平台中应用
3.1 EFL与输入法系统SCIM的集成
EFL的子系统Ecore是基于模块设计的,其中的Ecore_IMF模块提供了对输入法框架IMF(Input Method Framework)的支持。Ecore_IMF基于插件的方式在运行期间动态加载文件系统目录“/usr/lib/ecore/immodules”下的输入法模块。智能输入法平台SCIM(Smart Common Input Method)是嵌入式Linux中常用的开源输入法系统,SCIM只是一个框架,具体的特定语言的输入法的实现由输入法引擎IME(Input Method Engine)负责。基于SCIM来实现一个Ecore_IMF输入法插件,就完成了EFL与输入法系统的集成,如图4所示。
3.2 EFL与OpenGL ES/EGL的集成
EFL的图形模块Evas中的渲染引擎提供了多种实现方式,包括基于DirectFB的Evas渲染引擎,基于X11的渲染引擎,以及基于OpenGL ES的渲染引擎evas_gl_x11。evas_gl_x11使得EFL应用程序能够支持3D的图形效果,对EFL作了有力的扩展。
4. 结语
本文论述了嵌入式GU系统EFL的系统组成模块,以及如何使用Edje来设计EFL应用程序的图形界面,最后提到了EFL在嵌入式Linux平台中与其他模块的集成问题。EFL作为一个嵌入式GUI系统,有着广阔的应用前景,目前已经应用到了很多移动Liux平台中,包括Nokia的Maemo, OpenMoko手机平台,以及机顶盒设备中。