鍵盤驅動插件到底是怎麼工做的呢?怎麼才能讓它來響應板子上的按鍵消息呢?這些疑問須要分析一個完整的鍵盤處理插件才能回答,下面咱們就來看看最基本的pc101這個鍵盤插件是怎麼實現的吧。首先,說到插件, 先要實現一個插件的框架,這個框架的代碼要遵循Qt中的插件規範,還要符合鍵盤驅動插件的特色。 聽起來很難?呵呵,其實很是簡單, 只有兩個函數須要本身實現。
涉及的代碼:
鍵盤plugin框架:src/plugins/kbddrivers/usb/main.cpp
鍵盤driver handler的實現:src/gui/embedded/qkbdusb_qws.cpp
實現插件框架 main.cpp
class QUsbKbdDriver : public QKbdDriverPlugin
{
public:
QUsbKbdDriver();
QStringList keys() const;
QWSKeyboardHandler* create(const QString &driver, const QString &device);
};
keys就是返回當前driver插件的鍵值,只要不和其餘插件鍵值衝突就行。create返回你實現的QWSKeyboardHandler派生類的實例。
實現鍵盤處理實例 qkbdusb_qws.h
class QWSUsbKeyboardHandler : public QWSPC101KeyboardHandler
{
public:
QWSUsbKeyboardHandler(const QString&);
virtual ~QWSUsbKeyboardHandler();
private:
QWSUsbKbPrivate *d;
};
從代碼上來看, 這個Handler的類除了必須從QWSKeyboardHandler基類來派生以外,沒有什麼特別的要求。 但它對應的cpp文件其實實現了很多的功能,篇幅關係不能把整個代碼貼出來,特此總結一個通常的keyboard driver plugin流程,以下: 一、打開鍵盤設備並初始化 — 通常狀況下是調用open,由設備驅動決定 二、監控鍵盤事件 — 通常用QSocketNotifier去監控鍵盤fd 三、發生鍵盤事件時讀取鍵盤事件信息,如按下、擡起等 — 通常是調用read,或者ioctl,取決於鍵盤驅動 四、得到鍵盤事件信息後,將鍵值、按下等信息翻譯成Qt內部鍵盤事件的格式,並經過調用processKeyEvent將事件分發出去。 五、析構函數別忘了關閉設備 90%以上的Keyboard Driver Handler會遵循這樣的流程去處理鍵盤,若是咱們要寫本身的插件,確定這樣寫也沒錯。具體的代碼可能還須要看看例子。