为了使开发人员尽快着手工作并实现快速开发,我们创建了一个空白应用程序模板和一些脚本,以快速自定义项目并开始工作。
在试用Moblin应用程序模板之前,您需要在系统上安装所有必要组件(包括Clutter)。
下载Moblin应用程序模板
可以从以下网址获取最新的项目模板:
http://git.moblin.org/repos/users/jketreno/template.tgz
模板的使用方法非常简单。首先,下载、解压并解包template.tgz文档。
% wget http://git.moblin.org/repos/users/jketreno/template.tgz
% tar xf template.tgz
这个命令将创建template目录,您可以立即创建并测试输出:
% cd template
% export PREFIX=$(pkg-config --variable=prefix glib-2.0)
% ./autogen.sh --prefix=$PREFIX
% make
如果上一步成功,将创建可执行的src/template,使用以下命令运行模板程序:
% src/template
模板运行时将显示一个带有一个旋转按钮Exit的窗口,单击该按钮(或在键盘上按Escape键)将退出程序。
分解模板
模板项目的目的是提供一个最小项目示例,模板目录中包含以下内容:
% ls
-rw-r--r-- AUTHORS
-rwxr-xr-x autogen.sh
-rw-r--r-- ChangeLog
-rw-r--r-- configure.in
-rw-r--r-- COPYING
-rw-r--r-- INSTALL
-rw-r--r-- Makefile.am
-rw-r--r-- NEWS
-rw-r--r-- README
drwxr-xr-x src
文件AUTHORS、ChangeLog、COPYING、INSTALL、NEWS和README都是开源软件项目中包含的标准文件。检查它们的具体内容可以看到它们包含的信息类型。
文件autogen.sh是一个小型shell脚本,这个脚本调用autoconf实用工具创建必要的组件,以根据configure.in中的输入针对您使用的系统配置项目。关于autoconf的详细介绍超出了本指南的范围,您可以在autoconf project page找到关于autoconf的详细信息。
configure.in文件的相关内容如下所示:
...
PKG_PROG_PKG_CONFIG
PKG_CHECK_MODULES(TEMPLATE, clutter-0.8 >= 0.8.1
clutter-cairo-0.8 >= 0.8.1
glib-2.0)
AC_SUBST(TEMPLATE_CFLAGS)
AC_SUBST(TEMPLATE_LIBS)
...
以上内容告知autoconf使用PKG_PROG_PKG_CONFIG宏确保clutter、clutter-cairo和glib软件包都在平台上处于足够的层级。根据上述检查结果,创建带有相应构建标记的变量TEMPLATE_CFLAGS和TEMPLATE_LIBS来找到那些软件包。
模板项目的“真实”部分包含在src目录中:
% ls src
-rw-r--r-- main.c
-rw-r--r-- Makefile.am
Makefile.am包含输入到autoconf实用工具中的内容,该文件告知autoconf创建一个二进制文件,使用包含在src目录中的源文件和头文件,以及从configure.ac创建(通过上述TEMPLATE_CFLAGS和TEMPLATE_LIBS)的变量CFLAGS和LDFLAGS创建一个二进制文件template。
% cat Makefile.am
INCLUDES = @TEMPLATE_CFLAGS@
bin_PROGRAMS = template
template_SOURCES = *.c *.h
template_LDADD = @TEMPLATE_LIBS@
分解main.c
这个程序在高层级创建一个clutter舞台,单个clutter因子(Exit标记)和一个基于cairo的纹理(这样就可以使用cairo API来渲染Exit标记),一个动画该标记的时间轴,两个输入处理程序以监测用户终止该程序的时间。
接下来,让我们深入模板源代码本身(在单个文件main.c中实现)的细节。下面介绍main.c的功能(跳过文件起始处的软件许可证)。
以下命令装载所有定义代码使用的函数和数据类型所需的头文件。对于基于Clutter的应用程序来说非常标准:
#include
#include
#include
#include
#ifdef HAVE_CONFIG_H
#include
#endif
接下来声明数据的数据结构,这些数据作为实例数据发送到各种信号处理器。这可能已经作为一个完全Gobject实现,但由于我们不向任何外部实体显示这些数据,我们选择使用标准的C结构。注意我们使用了gtk-doc注释。如果您使用--eneable-gtkdoc创建该项目,这些注释将用于自动生成项目文档。
这个数据结构的具体用途是提供因子、时间轴和执行时间轴绝对时间之间的镜像。
/**
* SignTimelineData: Instance data passed to signal handlers
*
* @started Millisecond timestamp when timeline was started
* @actor Reference to actor to animate
* @timeline Timeline executing (which needs to be terminated before exiting)
*/
typedef struct {
gulong started;
ClutterActor *actor;
ClutterTimeline *timeline;
} SignTimelineData;
有关Moblin的更多内容,请访问:Moblin中文站