嵌入式Linux中基于Qt/Embedded的鍵盤接口設(shè)計
3 Qt/Embedded鍵盤輸入策略
3.1 Qt/Embedded架構(gòu)簡介
Qt/Embedded Linux應(yīng)用程序需要一個正在運行著的服務(wù)器應(yīng)用或者是本身就是一個服務(wù)器應(yīng)用程序。任何一個Qt/Embedded Linux應(yīng)用程序都可以扮演服務(wù)器的角色。當(dāng)多于一個應(yīng)用程序運行的時候,應(yīng)用程序作為客戶端與服務(wù)器程序相連接。
服務(wù)器進(jìn)程和客戶端進(jìn)程有不同的分工:服務(wù)器進(jìn)程管理著鼠標(biāo)指針的處理、字符的輸入和屏幕的輸出。另外服務(wù)器還控制著屏幕光標(biāo)的輸出和屏幕保護(hù)程序??蛻舳诉M(jìn)程完成所有應(yīng)用程序的具體操作。一個QWSServer類的實例代表一個服務(wù)器應(yīng)用,一個QWSClient類的實例代表著一個客戶端應(yīng)用。每一方面都有一些類完成各種操作。
所有系統(tǒng)產(chǎn)生的事件包括鍵盤事件和鼠標(biāo)事件都被傳遞到服務(wù)器應(yīng)用中,然后服務(wù)器將這些事件分發(fā)到客戶端應(yīng)用中。
3.2 客戶端/服務(wù)器的通信
如圖3所示,正在運行著的程序通過增加和刪除窗口不斷地改變屏幕的顯示。服務(wù)器在對應(yīng)的QWSWindow對象中維護(hù)著每一個頂層窗口的信息。每當(dāng)服務(wù)器接收到一個事件時,它都會查詢它的頂層窗口列表找到包含該事件位置的窗口。每一個窗口都有一個創(chuàng)建它們的客戶端應(yīng)用的ID,將這個ID返回給服務(wù)器。最后服務(wù)器將這個事件封裝成一個QWSEvent類的實例,傳遞給相應(yīng)的客戶端。
另外還可以通過QWSServer::KeyboardFilter類實現(xiàn)按鍵事件的全局的底層過濾器。這種方法可以實現(xiàn)電源管理中的一鍵掛起,而不用在所有的應(yīng)用程序中都對這個按鍵事件進(jìn)行過濾。
如圖4所示,服務(wù)器通過UNIX域套接字與客戶端進(jìn)行通信??蛻舳藦姆?wù)器接收事件,這些事件通過重新實現(xiàn)QApplication的qwsEvent-Filter()函數(shù)可以被直接檢索訪問。
客戶端相互之間(和服務(wù)器)通過QCopChannel類通信。QCOP用于在多個通道間傳送信息,是一個多對多的通信協(xié)議。每個通道用名字作為識別 ID,任何一個想要和它通信的通道都能監(jiān)聽它。QCOP協(xié)議既允許在相同的地址空間內(nèi)的客戶端之間進(jìn)行通信,也允許在不同的進(jìn)程的客戶端之間進(jìn)行通信。
3.3 字符輸入層
如圖5所示,當(dāng)一個服務(wù)器應(yīng)用程序開始運行時使用Qt的插件系統(tǒng)加載鍵盤驅(qū)動,驅(qū)動是一個QWSKeyboardHandler類的實例。
鍵盤驅(qū)動從設(shè)備接收鍵盤事件,并把事件封裝成一個QWSEvent類的實例,然后把這個類傳送給服務(wù)器。定制鍵盤可以通過子類QWSKeybo- ardHandler類創(chuàng)建一個鍵盤驅(qū)動插件來實現(xiàn)。默認(rèn)的QKbdDriverFactory類將自動檢測到這個插件然后把驅(qū)動加載到正在運行的服務(wù)器應(yīng)用中。
4 鍵盤驅(qū)動插件的實現(xiàn)
本文通過Qt的插件系統(tǒng)實現(xiàn)了矩陣鍵盤的接口驅(qū)動。插件是一種遵循一定規(guī)范的應(yīng)用程序接口編寫出來的程序。在現(xiàn)代計算機(jī)語言中,應(yīng)用環(huán)境復(fù)雜多變,常常要面臨著適應(yīng)這樣那樣的未知需求的挑戰(zhàn),為了使程序設(shè)計語言具有良好的可擴(kuò)展性,使之能夠適應(yīng)復(fù)雜的應(yīng)用環(huán)境,同時也出于降低設(shè)計復(fù)雜性的考慮,采用插件機(jī)制是一個很不錯的方法。通過采用插件系統(tǒng),把擴(kuò)展功能從框架中剝離出來,可以降低框架的復(fù)雜度,讓框架更容易實現(xiàn)。擴(kuò)展功能與框架之間以一種松耦合的方式集成,允許在保持接口不變的情況下,實現(xiàn)彼此的獨立變化。
Qt提供了兩種插件:一種是高層的插件,用來擴(kuò)展Qt自身,如自定義數(shù)據(jù)庫驅(qū)動、圖像格式、文本編解碼器、自定義風(fēng)格等;一種是底層的插件,用來擴(kuò)展Qt應(yīng)用程序。 linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論