本文轉(zhuǎn)載至:http://blog.chinaunix.net/uid-12873540-id-2912723.html
前幾天搞了minigui和lgui姆坚,看了源代碼十兢,對(duì)窗口機(jī)制算是有了比較好的了解了瞬女,當(dāng)然過(guò)程當(dāng)中發(fā)現(xiàn)了一些大家現(xiàn)在討論的很少的東西肺缕,這些我將在本文中談到狈涮,包括GUI窗體機(jī)制咐蝇,framebuffer機(jī)制及應(yīng)用涯鲁。
前面一段時(shí)間搞了驅(qū)動(dòng)方面的,突然感覺(jué)得搞下圖形界面的有序,以前一直對(duì)window窗口平臺(tái)及l(fā)inux x系統(tǒng)窗體機(jī)制很感興趣抹腿,于是上網(wǎng)搜了下,發(fā)現(xiàn)當(dāng)前流行minigui旭寿,這個(gè)好像是嵌入式系統(tǒng)比較流行的警绩,在網(wǎng)上看了些資料,下了源碼盅称,及例子程序肩祥,例子在qvsb上跑起來(lái)了,但在framebuffer下運(yùn)行失敗缩膝,所以覺(jué)得是該將窗口機(jī)制深入研究了混狠,于是看了源代碼,后來(lái)發(fā)現(xiàn)看minigui有點(diǎn)累疾层,因?yàn)檫@款GUI盡管源碼量不大将饺,由于其為了保持高度兼容及抽象,代碼已經(jīng)變得復(fù)雜了痛黎,再加上網(wǎng)上對(duì)此源碼級(jí)機(jī)制分析的基本沒(méi)有予弧,只有如何使用的,所以我看了半天湖饱,只懂了一些桌肴,這時(shí)正好在網(wǎng)上搜到一條有關(guān)窗體機(jī)制分析的文章,是《精通嵌入式Linux編程——構(gòu)建自己的GUI環(huán)境》李玉東著,并且其就是針對(duì)LGUI這一版本的琉历,且有源代碼坠七,這正好合我口味水醋,于是我就開(kāi)始看LGUI的源碼了,越看越有勁彪置,于是看了將近一天拄踪,差不了,于是開(kāi)始實(shí)踐了拳魁。
后來(lái)才發(fā)覺(jué)這只是半步惶桐,在redhat9上實(shí)踐時(shí)就發(fā)現(xiàn)了很多問(wèn)題。下面我就針對(duì)我實(shí)踐過(guò)程中出現(xiàn)的問(wèn)題及解決方案及設(shè)計(jì)到的知識(shí)談一下潘懊。
1. gui及minigui在redhat9用framebuffer模式運(yùn)行時(shí):運(yùn)行前對(duì)于minigui在framebuffer模式下要改他的配置文件minigui.cfg
更改方式如下:
# GAL engine
gal_engine=fbcon
# IAL engine
ial_engine=fbcon
mdev=/dev/mouse
mtype=IMPS2
gal_engine和ial_engine的值應(yīng)該設(shè)置為fbcon姚糊。當(dāng)我編譯完lgui,minigui源碼及例子后,發(fā)現(xiàn)minigui提示沒(méi)有找到圖形引擎授舟,使用dummy引擎救恨。而lgui更是運(yùn)行不了,段錯(cuò)誤释树,后來(lái)我于是調(diào)試lgui,發(fā)現(xiàn)initframebuffer時(shí)出錯(cuò)了肠槽,于是我猜測(cè)是/dev/fb0文件有問(wèn)題,后來(lái)一看果然沒(méi)有這個(gè)文件奢啥。網(wǎng)上搜了一下資料秸仙,發(fā)現(xiàn)內(nèi)核盡管編譯了framebuffer,但默認(rèn)是關(guān)閉的,要通過(guò)如下方式解決桩盲。在/boot/grub/grub.conf加入一個(gè)段落:
title MiniGUI1.6.2
root(hd0,0)
kernel /vmlinuz-2.4.20Xroot=/……(你的內(nèi)核名稱) vga=0x0317 fb:on
即在root后面添加vga=0x0314 fb:on寂纪。這樣下來(lái)后發(fā)現(xiàn),還是沒(méi)有解決問(wèn)題赌结,后來(lái)感覺(jué)是不是framebuffer這方面我了解的不夠啊捞蛋,于是上網(wǎng)查資料,發(fā)現(xiàn)資料好少姑曙,感覺(jué)是不是這個(gè)技術(shù)現(xiàn)在不行了啊襟交,不過(guò)為了實(shí)踐迈倍,管他好不好了伤靠,只得去看,看了一下發(fā)現(xiàn)沒(méi)有講這方面的啼染,但看多了宴合,突然有了一個(gè)想法,是不是framebuffer模式不能在x console下運(yùn)行迹鹅,于是乎改為文本模式卦洽。
2.? 在文本模式下運(yùn)行
結(jié)果:minigui正確顯示,但是鼠標(biāo)還是不行斜棚,沒(méi)反應(yīng)阀蒂,不過(guò)已經(jīng)讓我高興了该窗,因?yàn)橹辽儆羞M(jìn)步啊,于是乎想到是不是鼠標(biāo)設(shè)備文件有問(wèn)題蚤霞,上網(wǎng)查了酗失,改為/dev/input/mice還是不行,這下郁悶了昧绣,不過(guò)既然能夠顯示出來(lái)规肴,我就可以試驗(yàn)lgui了,因?yàn)閘gui我已經(jīng)看懂了夜畴,可以修改源碼了拖刃,我最終的目的是運(yùn)行l(wèi)gui,但是在google搜了一下Lgui發(fā)現(xiàn)幾乎沒(méi)有這個(gè)gui的文章贪绘,更別說(shuō)在linux編譯運(yùn)行及配置了兑牡,看來(lái)只有自己測(cè)試了,由于對(duì)源碼有了了解兔簇,這個(gè)過(guò)程在沒(méi)有資料的情況下也不算太糟糕发绢,編譯沒(méi)有錯(cuò)誤,此時(shí)運(yùn)行還是段錯(cuò)誤.segment fault垄琐,于是用gdb調(diào)試边酒,發(fā)現(xiàn)是鼠標(biāo)設(shè)備文件問(wèn)題,于是改了設(shè)備文件還是有問(wèn)題狸窘,還是已經(jīng)是正常退出錯(cuò)誤墩朦,我高興了,因?yàn)橛凶兓鸵馕墩咿D(zhuǎn)機(jī)翻擒,于是進(jìn)一步調(diào)試發(fā)現(xiàn)是源代碼的錯(cuò)誤氓涣,讀環(huán)境變量錯(cuò)誤,自己加上去陋气,終于正常運(yùn)行了劳吠,顯示圖形出來(lái)了。
/* 圖形加載失敗 */
這個(gè)時(shí)候真的功夫不負(fù)有心人啊巩趁。當(dāng)然和Minigui一個(gè)樣還有一個(gè)問(wèn)題痒玩,就是鼠標(biāo)沒(méi)有,并且鼠標(biāo)移動(dòng)時(shí)會(huì)擦除圖形议慰,但是已經(jīng)有了很大提高了啊蠢古,這個(gè)時(shí)候就是做到這一步又用了一天,有時(shí)發(fā)現(xiàn)别凹,當(dāng)一個(gè)問(wèn)題解決沒(méi)解決草讶,你一天都給耗了。
經(jīng)過(guò)上面發(fā)現(xiàn)比較還是鼠標(biāo)問(wèn)題炉菲,于是搜索堕战,但一無(wú)所獲坤溃,就在我快要放棄的時(shí)候,我采取試試看的心態(tài)嘱丢,將此程序放到federal 10運(yùn)行浇雹,結(jié)果完全正確,鼠標(biāo)有動(dòng)作了屿讽,我高興級(jí)了昭灵,但是鼠標(biāo)所到之處都給擦除了,我分析這個(gè)是命令行下的鼠標(biāo)顯示時(shí)刷新屏幕所為伐谈,所以我覺(jué)得只要我隱藏鼠標(biāo)烂完,這個(gè)問(wèn)題就能解決,上網(wǎng)搜索還是很少資料诵棵,不過(guò)偶然中發(fā)現(xiàn)有個(gè)console下gpm鼠標(biāo)驅(qū)動(dòng)的抠蚣,于是試圖去關(guān)閉它,奇跡出現(xiàn)了履澳,鼠標(biāo)終于不見(jiàn)了∷徽現(xiàn)在終于運(yùn)行正常了。試驗(yàn)剛剛成功了距贷。
3. 總結(jié)
文本模式下鼠標(biāo)動(dòng)作是由叫g(shù)pm捕捉鼠標(biāo)事件并改變鼠標(biāo)位置柄冲,于是每次鼠標(biāo)改變它都要刷新鼠標(biāo)所在位置屏幕,于是就有了所到之處擦除的景象忠蝗,解決后并更換背景圖片后運(yùn)行圖形如下:
/* 圖形加載失敗 */
但是相比minugui现横,lgui沒(méi)有移動(dòng)窗體功能,于是我更改了代碼阁最,也實(shí)現(xiàn)了戒祠,現(xiàn)在想來(lái)有時(shí)真的遇到棘手的問(wèn)題不要放棄并尋找不同方式可能就有意外的收獲,不要輕易放棄任何可能速种。
上面出現(xiàn)的問(wèn)題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?解決方案
1.linux版本問(wèn)題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? redhat9換到federal10
2.運(yùn)行模式問(wèn)題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x console換到文本模式
3.配置問(wèn)題 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?配置為framebuffer開(kāi)機(jī)開(kāi)啟
4.源代碼BUG ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用gdb調(diào)試姜盈,發(fā)現(xiàn)問(wèn)題解決
GUI窗口機(jī)制推薦看精通《嵌入式Linux編程——構(gòu)建自己的GUI環(huán)境》李玉東著。
附百度云網(wǎng)盤(pán)鏈接:http://pan.baidu.com/s/1c2I3wlE?
密碼:74pn