李先静的专栏

欢迎大家加入Linux Mobile Research,本圈子主要致力于基于linux的嵌入式系统的学习和研究,包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面,欢迎大家加入,无论是高手还是新手,一起学习共同进步。

李先静ID:absurd
980216次访问,排名26好友138人,关注者145
Only those who attempt the absurd can achieve the impossible.
absurd的文章
原创 373 篇
翻译 1 篇
转载 55 篇
评论 1485 篇
李先静的公告
Broncho linux手机平台是构建在linux 2.6 之上,采用GTK+作为GUI的手机平台。欢迎大家到broncho.cn上交流,网站还在建设之中,近期我们会陆续把整理好的文档和代码更新到上去。
最近评论
dig_ge:absurd,你好,冒昧打扰,不知您能不能说明一下,为什么param_gen_call 和 param_gen_call_on 要用两个脚本实现,而不直接放在 gen_framework.sh 中,用函数实现呢?
xiaobaixu:你好 我在编译 splash 时 ttf.c出问题不知道是少什么库
"TTF_FONT" has no member named "current"
unailbobo:谢谢
unailbobo:关于1,我查看源码没有看到gdk_events_init里有关于mainloop的任何代码???
phrsea:恭喜恭喜!小宝宝好可爱啊。
呵呵,为了一句"恭喜",还得专门注册一个帐号啊。
文章分类
收藏
相册
1.个人相册
2.设计备忘录用图
3.设计本质论用图
4.scim架构用图
6.临时文件
7.其它文件
8.研究笔记用图
marvell-linux
1.友情链接
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
我的相册
3.软界高手
Donald E. Knuth (RSS)
孟岩(RSS)
透明(RSS)
4.LinuxMobile
celinuxforum(RSS)
GPE(RSS)
maemo.org(RSS)
opensource.motorola
palowireless
5.XWindow
Jserv's blog(RSS)
Keith Packard(RSS)
6.技术资源
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 DirectFB窗口管理器(unique)研究笔记收藏

新一篇: 《企业应用架构模式》读书笔记(一) | 旧一篇: 由GdkPixmap得到透明的GdkPixbuf

DirectFB窗口管理器(unique)研究笔记

 

DirectFB自带有两个窗口管理器:defaultunique,可以在配置文件中用wm=xxx来选择用哪一个作为当前的窗口管理器。

 

两个窗口管理器的功能都很简单,与桌面环境流行的窗口管理器几乎没有可比性。尤其是前者,提供的功能更是简陋,仅仅是管理一下窗口栈而已。后者虽然简陋,但其架构设计还算不错,很容易在上面扩展自己需要的功能。

 

什么是窗口管理器呢?根据EWMH的要求,窗口管理器的基本功能有以下这些:

模态窗口(Modality)。一般用来实现模态对话框,所谓模态对话框,就是具有这样特性的对话框,除非你把它关掉,否则无法切换回到它的父窗口上。

 

大桌面(Large Desktop)。显示器的大小是有限的,比如显示器的分辨率为1024x768,那么传统的桌面就只能这么大一点。窗口管理器可以实现一个逻辑上的大桌面,较显示器的物理分辨率,拥有更大的显示范围。当然你在某个时刻只能看到桌面的一部分,这部分也称为viewport,通过变换viewport可以看到桌面的其它区域。

 

固定窗口(Sticky windows)。固定窗口要求窗口的位置被固定到显示器的物理位置, viewport的变换对它的位置都没有影响。

 

虚拟桌面(Virtual Desktops)。同时打开的窗口太多时,可以把这些窗口分成不同的组,同一时刻只显示其中一组的窗口,每一组窗口就是一个虚拟桌面。

 

任务条(Taskbars)、分页器(Pagers) 。显示当前所有的打开的窗口,并且可以在这些窗口之间切换。

 

窗口栈序(Z-Order) 。就是窗口之间的上下关系。

 

保留区域(reserve space)。让某个窗口独占某块靠边的区域,比如任务条,一般都独占桌面最下面的一长条区域。

 

窗口状态(Window State) 窗口有最大化、最小化、全屏等的状态,这些由窗口管理器负责管理。当然,上层应用也可以调用窗口管理器提供的函数,来改变窗口的状态。

 

窗口装饰。unix下,GUI的惯例是,窗口的标题和四周的边框,都称为装饰,这些装饰的显示是由窗口管理器负责的。这样的好处时,应用程序无须做任何修改,仅通过配置窗口管理器,就可以得到风格各异的显示效果。

 

窗口协议。这主要用于实现窗口僵死状态检测,窗口之间的同步处理等功能。

 

对于嵌入式系统来说,并不要求实现桌面环境上的一些花梢的功能。unique的实现虽然简单,也可以满足基本需求,更重要的是它提供了较好的扩展机制。

 

DirectFB采用模块化设计,它并不依赖于某种具体的窗口管理器,只要具体的窗口管理器实现接口CoreWMFuncs中定义的函数,就可以挂到DirectFB中运行。

 

ReactorDirectFB中无处不在,要理解DirectFB的架构一定要理解reactor模式才行。不过,这里的reactorPOSA中讲解的reactor类似,但并不完全相同,它更类似于signal机制,如果你理解glib中的signal或者boost中的signal机制,理解reactor并不难。DirectFBreactor最大的优点在于它是跨进程的,通过fusion内核模块中转,在一个进程中触发的事件可以方便的中转到另外一个进程。

 

Unqiue的源代码在wm/unique目录下,下面我们以输入事件流把它们贯穿起来分析一下:

 

DirectFB中,每一种输入设备,都有一个线程挂在上面,只要输入设备有事件上报,该线程就通过reactor把事件转发给相应的reactor处理函数。窗口管理在初始时(unique_wm_module_init),调用dfb_input_add_global_unique_device_listener设置为事件处理函数。

 

_unique_device_listener,并没有对事件直接处理,而又把它转给相应的UniqueDeviceClass对象,实现UniqueDeviceClass接口的有keyboardpointerwheel三种,每一种都有一个实例。

 

在这里,UniqueDeviceClass作为一个中间层,是否是多此一举呢?开始我也这样认为,过好长一段时间后,我才明白这样做是有道理的。原因是从不同设备读到的事件格式并不统一,比如有的绝对坐标,有的是相对坐标,键值映射关系也不一致。这个中间层可以把这些事件转换成统一的格式,上层无需要再关系这些底层细节。

 

把事件转换之后,然后通过reactor分发出去,就到_unique_input_switch_device_listener函数里。_unique_input_switch_device_listener里面通过当前的上下文以及事件的内容,决定谁是该事件的目标。

 

这里有两点比较有趣。

 

第一是StretRegionStretRegion就是一块区域,StretRegion与窗口的关系又是什么样的呢?这种关系很很简单,一般的窗口(带装饰的窗口)有十个StretRegion组成,它们分别是四边、四角、窗口客户区以及这九个StretRegion的父StretRegion(也称为frame)。

 

对于键盘事件,一般是焦点窗口的客户区收到事件,如果是笔点事件,则由笔点的位置决定是哪个StretRegion收到事件。

 

第二是决定了目标StretRegion之后,并不是直接把事件投递给这个StretRegion,而是调用StretRegionGetInput函数,获取一个input_channel的对象。这似乎也是多此一举,实则不然,窗口的四边、四角、窗口客户区九个区域是完全独立的,它不知道也不应该知道其它八的存在,另外这个九个区域的地位也不是等同的,有的要自己处理事件,有的不用,只有每个StretRegion自己才知道,所以由GetInput去决定把事件给谁。

 

事件经过input_channel之后,就轮到_unique_window_input_channel_listener函数处理了。这时,事件才真正被投递到相应的窗口,之后事情与窗口管理器就无关了。

 

Z-Order的管理,实际上比较简单,无非就是调整窗口在栈的位置,所谓栈其实并不是真正的栈,只是一个双向链表,大家都习惯的称为栈罢了。

 

Unique实现了简单的装饰功能,相关代码在foo_update里(并没有用到decoration.c/.h)。它的图片数据在data目录中。Unique的装饰功能最大的缺陷是,没有根据不同类型的窗口实现不同的装饰。

 

 

 

发表于 @ 2006年05月13日 23:06:00|评论(loading...)|编辑

新一篇: 《企业应用架构模式》读书笔记(一) | 旧一篇: 由GdkPixmap得到透明的GdkPixbuf

评论

#cvsuser 发表于2006-06-24 15:44:00  IP: 61.144.50.*
兄台也研究过directfb啊,小弟对directfb非常感兴趣,有时间请教一下,guohongqi1982@hotmail.com
#zwolfox 发表于2006-07-19 22:18:00  IP: 60.12.0.*
directfb能在uclinux上运行吗???
#KevinLeiCN 发表于2006-07-20 11:53:00  IP: 221.223.22.*
能阿,uclinux也有framebuffer的。不过GTK就难说了。
#ahui 发表于2006-11-07 16:57:00  IP: 222.156.254.*
gtk也有on directfb的版本了
#absurd 发表于2006-11-07 21:39:00  IP: 220.231.192.*
to ahui: 是的。
#jj2009 发表于2008-05-15 01:25:52  IP: 10.10.113.*
窗口管理器不是很了解。请问看什么内容的书可以帮助了解?
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 李先静