在介绍初始化之前,先看下DirectFB源码的目录结构:
1.gfxdrivers:显卡硬件抽象层
2.inputdrivers:输入设备,比如摇杆,鼠标,键盘等
3.interfaces:接口层,用来调用其他的库,包含了字体,图片,视频
4.lib:基本函数库
5.proxy:代理,事件的请求与分发
6.systems:使用directfb的当前的窗口系统,如果是在x11下使用,那么system=x11
7.tools:用到的工具
8.wm:要使用的窗口管理系统,可使用default,或unique管理窗口
9.src:包含了主要的处理代码
现在对DirectFB源码结构有了一个初步的了解.
任何dfb的程序在开始前都要调用两个函数:DirectFBInit,DirectFBCreate,本文第一个.
DirectFBInit:主要用来初始化整个系统的配置参数.
软件一般都有一些全局的参数需要设置,要么由系统来默认配置,要么采用读取用户配置文件的方法.很类似c++里面的单例模式.
DirectFB把所有的配置选项都放入到了比较大的结构体DFBConfig里面,并声明了一个指向它的全局的指针变量dfb_config.
1.默认配置:config_allocate
为dfb_config分配内存,并进行初始化.
2. dfb_config_read( SYSCONFDIR"/directfbrc" );读取一个文件进行初始化
先搞明白SYSCONFDIR到底是什么值:如果在编译的时候不指定sysconfidr那么这里SYSCONFDIR应该是/etc
下面再看configure中的一段代码:
- EXP_VAR=SYSCONFDIR
- FROM_VAR=$sysconfdir#FROM_VAR的初始化,在开始的时候prefix为空,sysconfdir='${prefix}/etc',所以值就是/etc了
- prefix_save=$prefix
- exec_prefix_save=$exec_prefix
- if test "x$prefix" = "xNONE"; then
- prefix="$ac_default_prefix"#如果编译时没指定prefix那么prefix将被初始化为ac_default_prefix
- fi
- full_var="$FROM_VAR"#full_var的初始化
- while true; do
- new_full_var="`eval echo $full_var`"
- if test "x$new_full_var" = "x$full_var"; then break; fi
- full_var=$new_full_var
- done
- full_var=$new_full_var
- SYSCONFDIR="$full_var" #对SYSCONFDIR时行初始化
EXP_VAR=SYSCONFDIR
FROM_VAR=$sysconfdir#FROM_VAR的初始化,在开始的时候prefix为空,sysconfdir='${prefix}/etc',所以值就是/etc了
prefix_save=$prefix
exec_prefix_save=$exec_prefix
if test "x$prefix" = "xNONE"; then
prefix="$ac_default_prefix"#如果编译时没指定prefix那么prefix将被初始化为ac_default_prefix
fi
full_var="$FROM_VAR"#full_var的初始化
while true; do
new_full_var="`eval echo $full_var`"
if test "x$new_full_var" = "x$full_var"; then break; fi
full_var=$new_full_var
done
full_var=$new_full_var
SYSCONFDIR="$full_var" #对SYSCONFDIR时行初始化
主要代码:
- DFBResult dfb_config_read( const char *filename )
- {
- dfb_config->config_layer = &dfb_config->layers[0];//共计16个层,这里初始化第0个
- f = fopen( filename, "r" ); //打开文件
- while (fgets( line, 400, f )) {
- value = strchr( line, '=' );
- if (value) { //得到value
- *value++ = 0;
- direct_trim( &value );
- }
- direct_trim( &name );//得到name
- ret = dfb_config_set( name, value );//更新配置选项里面的值
- }
- }
DFBResult dfb_config_read( const char *filename )
{
dfb_config->config_layer = &dfb_config->layers[0];//共计16个层,这里初始化第0个
f = fopen( filename, "r" ); //打开文件
while (fgets( line, 400, f )) {
value = strchr( line, '=' );
if (value) { //得到value
*value++ = 0;
direct_trim( &value );
}
direct_trim( &name );//得到name
ret = dfb_config_set( name, value );//更新配置选项里面的值
}
}
3.读取home目录下的.directfbrc文件,作一次和上面一样的更新,看来如果这个文件有的话,还是这个文件的权限高些,把前面初始化的都给覆盖掉了.
4.获取执行程序的名字
5.读取/etc下directfbrc.%s(执行程序名字)的文件,更新配置选项
6.读取home目录下.directfbrc.%s(执行程序名字),更新配置选项
7.处理用户执行应用程序时输入的参数,最后可更新配置选项的地方.
到这里初始化的第一部分就做完了.