前几天搞了minigui和lgui,看了源代码,对窗口机制算是有了比较好的了解了,当然过程当中发现了一些大家现在讨论的很少的东西,这些我将在本文中谈到,包括GUI窗体机制,framebuffer机制及应用。
前面一段时间搞了驱动方面的,突然感觉得搞下图形界面的,以前一直对window窗口平台及linux x系统窗体机制很感兴趣,于是上网搜了下,发现当前流行minigui,这个好像是嵌入式系统比较流行的,在网上看了些资料,下了源码,及例子程序,例子在qvsb上跑起来了,但在framebuffer下运行失败,所以觉得是该将窗口机制深入研究了,于是看了源代码,后来发现看minigui有点累,因为这款GUI尽管源码量不大,由于其为了保持高度兼容及抽象,代码已经变得复杂了,再加上网上对此源码级机制分析的基本没有,只有如何使用的,所以我看了半天,只懂了一些,这时正好在网上搜到一条有关窗体机制分析的文章,是《精通嵌入式Linux编程——构建自己的GUI 环境》李玉东著,并且其就是针对LGUI这一版本的,且有源代码,这正好合我口味,于是我就开始看LGUI的源码了,越看越有劲,于是看了将近一天,差不了,于是开始实践了。
后来才发觉这只是半步,在redhat9上实践时就发现了很多问题。下面我就针对我实践过程中出现的问题及解决方案及设计到的知识谈一下。
1.gui及minigui在redhat9用framebuffer模式运行时:运行前对于minigui在framebuffer模式下要改他的配置文件minigui.cfg
更改方式如下:
# GAL engine
gal_engine=fbcon
# IAL engine
ial_engine=fbcon
mdev=/dev/mouse
mtype=IMPS2
-------------------------------------------------
gal_engine和ial_engine的值应该设置为fbcon,
当我编译完lgui,minigui源码及例子后,发现minigui提示没有找到图形引擎,使用dummy引擎。而lgui更是运行不了,段错误,后来我于是调试lgui,发现initframebuffer时出错了,于是我猜测是/dev/fb0文件有问题,后来一看果然没有这个文件。网上搜了一下资料,发现内核尽管编译了framebuffer,但默认是关闭的,要通过如下方式解决。
在/boot/grub/grub.conf加入一个段落:
----------------------------------------------------------
title MiniGUI 1.6.2
root(hd0,0)
kernel /vmlinuz-2.4.20X root=/……(你的内核名称) vga=0x0317 fb:on
即在root后面添加vga=0x0314 fb:on
这样下来后发现,还是没有解决问题,后来感觉是不是framebuffer这方面我了解的不够啊,于是上网查资料,发现资料好少,感觉是不是这个技术现在不行了啊,不过为了实践,管他好不好了,只得去看,看了一下发现没有讲这方面的,但看多了,突然有了一个想法,是不是framebuffer模式不能在x console下运行,于是乎改为文本模式。
2.在文本模式下运行:
结果:minigui正确显示,但是鼠标还是不行,没反应,不过已经让我高兴了,因为至少有进步啊,于是乎想到是不是鼠标设备文件有问题,上网查了,改为/dev/input/mice还是不行,这下郁闷了,不过既然能够显示出来,我就可以试验lgui了,因为lgui我已经看懂了,可以修改源码了,我最终的目的是运行lgui,但是在google搜了一下Lgui发现几乎没有这个gui的文章,更别说在linux编译运行及配置了,看来只有自己测试了,由于对源码有了了解,这个过程在没有资料的情况下也不算太糟糕,编译没有错误,此时运行还是段错误.segment fault,于是用gdb调试,发现是鼠标设备文件问题,于是改了设备文件还是有问题,还是已经是正常退出错误,我高兴了,因为有变化就意味者转机,于是进一步调试发现是源代码的错误,读环境变量错误,自己加上去,终于正常运行了,显示图形出来了。图形如下:
这个时候真的功夫不负有心人啊。当然和Minigui一个样还有一个问题,就是鼠标没有,并且鼠标移动时会擦除图形,但是已经有了很大提高了啊,这个时候就是做到这一步又用了一天,有时发现,当一个问题解决没解决,你一天都给耗了。
经过上面发现比较还是鼠标问题,于是搜索,但一无所获,就在我快要放弃的时候,我采取试试看的心态,将此程序放到federal 10运行,结果完全正确,鼠标有动作了,我高兴级了,但是鼠标所到之处都给擦除了,我分析这个是命令行下的鼠标显示时刷新屏幕所为,所以我觉得只要我隐藏鼠标,这个问题就能解决,上网搜索还是很少资料,不过偶然中发现有个console下gpm鼠标驱动的,于是试图去关闭它,奇迹出现了,鼠标终于不见了。现在终于运行正常了。试验刚刚成功了。
总结:
文本模式下鼠标动作是由叫gpm捕捉鼠标事件并改变鼠标位置,于是每次鼠标改变它都要刷新鼠标所在位置屏幕,于是就有了所到之处擦除的景象,解决后并更换背景图片后运行图形如下:
但是相比minugui,lgui没有移动窗体功能,于是我更改了代码,也实现了,现在想来有时真的遇到棘手的问题不要放弃并寻找不同方式可能就有意外的收获,不要轻易放弃任何可能。
上面出现的问题: 解决方案
1. linux版本问题 redhat9换到federal10
2. 运行模式问题 x console换到文本模式
3. 配置问题 配置为framebuffer开机开启
4. 源代码BUG 用gdb调试,发现问题解决
GUI窗口机制推荐看精通《嵌入式Linux编程——构建自己的GUI 环境》李玉东著。
Minigui简单介绍: