為了使開發人員盡快著手工作並實現快速開發,我們創建了一個空白應用程序模板和一些腳本,以快速自定義項目並開始工作。
在試用Moblin應用程序模板之前,您需要在系統上安裝所有必要組件(包括Clutter)。
下載Moblin應用程序模板
可以從以下網址獲取最新的項目模板:
http://git.moblin.org/repos/users/jketreno/template.tgz
模板的使用方法非常簡單。首先,下載、解壓並解包template.tgz文檔。
wgethttp://git.moblin.org/repos/users/jketreno/template.tgz
tar xf template.tgz
這個命令將創建template目錄,您可以立即創建並測試輸出:
cd template如果上一步成功,將創建可執行的src/template,使用以下命令運行模板程序:
src/template 模板運行時將顯示一個帶有一個旋轉按鈕Exit的窗口,單擊該按鈕(或在鍵盤上按Escape鍵)將退出程序。
分解模板
模板項目的目的是提供一個最小項目示例,模板目錄中包含以下內容:
ls
文件AUTHORS、ChangeLog、COPYING、INSTALL、NEWS和README都是開源軟件項目中包含的標准文件。檢查它們的具體內容可以看到它們包含的信息類型。
文件autogen.sh是一個小型shell腳本,這個腳本調用autoconf實用工具創建必要的組件,以根據configure.in中的輸入針對您使用的系統配置項目。關於autoconf的詳細介紹超出了本指南的范圍,您可以在autoconf project page找到關於autoconf的詳細信息。
configure.in文件的相關內容如下所示:
...以上內容告知autoconf使用PKG_PROG_PKG_CONFIG宏確保clutter、clutter-cairo和glib軟件包都在平台上處於足夠的層級。根據上述檢查結果,創建帶有相應構建標記的變量TEMPLATE_CFLAGS和TEMPLATE_LIBS來找到那些軟件包。
模板項目的“真實”部分包含在src目錄中:
ls srcMakefile.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;