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