QtEmbedded鼠標驅動流程分析(下)

 

Qt代碼版本:qt-embedded-linux-opensource-src-4.5.2
上篇中,我們提到了
src/gui/embedded/qmousedriverfactory_qws.cpp 中
QMouseDriverFactory::create(…)函數加載一個QMouseHandler的地方,那麼我今天就接着地方往下講,我們以tslib爲例來講解

133 #ifndef QT_NO_QWS_MOUSE_TSLIB
134     if (driver == QLatin1String("tslib") || driver.isEmpty())
135         return new QWSTslibMouseHandler(key, device);
136 #endif

要使135行的QWSTslibMouseHandler能夠正常被加載,需要注意兩個條件
1. 就是133行的那個宏,如果你在編譯Qt-Embedded的時候沒有加“-qt-mouse-tslib”選項的話,那麼該宏會被使能,那麼134,135自然不會被編譯咯。
當然,如果你編譯Qt-Embedded的時候,使用“-plugin-mouse-tslib”,那麼下面的代碼

142 #if !defined(Q_OS_WIN32) || defined(QT_MAKEDLL)
143 #ifndef QT_NO_LIBRARY
144     if (QWSMouseHandlerFactoryInterface *factory = qobject_cast(loader()->instance(driver)))
145         return factory->create(driver, device);
146 #endif
147 #endif

會去插件目錄下找到對應的代碼,不是我們要要討論的重點。
2. 134行的driver名字來自於QWS_MOUSE_PROTO環境變量中的冒號前那一部分.例如”tslib:/dev/ts”中tslib就是driver,/dev/ts就是device。 名字不能搞錯:)

如果前面兩部分都沒有問題,可以進入實現代碼看看了
src/gui/embedded/qmousetslib_qws.cpp

320 QWSTslibMouseHandler::QWSTslibMouseHandler(const QString &driver,
321                                            const QString &device)
322     : QWSCalibratedMouseHandler(driver, device)
323 {
324     d = new QWSTslibMouseHandlerPrivate(this, device);
325 }

看來默默無聞的做着後勤工作的還是QWSTslibMouseHandlerPrivate

136 QWSTslibMouseHandlerPrivate::QWSTslibMouseHandlerPrivate(QWSTslibMouseHandler *h,
137                                                          const QString &device)
138     : handler(h), dev(0), mouseNotifier(0), jitter_limit(3)
139 {
140     QStringList args = device.split(QLatin1Char(':'), QString::SkipEmptyParts);
//..............
148     devName = args.join(QString());
150     if (devName.isNull()) {
151         const char *str = getenv("TSLIB_TSDEVICE");
152         if (str)
153             devName = QString::fromLocal8Bit(str);
154     }
156     if (devName.isNull())
157         devName = QLatin1String("/dev/ts");
159     if (!open())
160         return;
165     mouseNotifier = new QSocketNotifier(fd, QSocketNotifier::Read, this);
166     connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));
168 }

一些不重要的代碼被我刪掉了,通過上面代碼可以明白,如果在QWS_MOUSE_PROTO沒寫設備名,還可以通過環境TSLIB_TSDEVICE得到,如果TSLIB_TSDEVICE也沒有設置,那麼就會使用設備/dev/ts,你需要搞清你的驅動建立的設備名是什麼。
165,166行是關鍵的兩行,這表明Qt會通過QSocketNotifier監視你的鼠標設備上是否有新的數據傳入,如果有則通過readMouseData()讀取數據。

226 void QWSTslibMouseHandlerPrivate::readMouseData()
227 {
//............
285         if (calibrated) {
286             // tslib should do all the translation and filtering, so we send a
287             // "raw" mouse event
288             handler->QWSMouseHandler::mouseChanged(p, pressed);
289         } else {
290             handler->sendFiltered(p, pressed);
291         }
292     }
293 }

readMouseData()中大部分代碼都是讀取鼠標數據的,我們更關心把數據送到哪裏去,那麼我們看290行的sendFilterer(…)
src/gui/embedded/qmouse_qws.cpp

604 bool QWSCalibratedMouseHandler::sendFiltered(const QPoint &position, int button)
605 {
//.......
642
643         mouseChanged(transform(pos), button);
644         sent = true;
//.......
651 }
在我快沒有耐心的時候終於看到了我想看到的代碼
259 void QWSMouseHandler::mouseChanged(const QPoint &position, int state, int wheel)
260 {
261     mousePos = position + d_ptr->screen->offset();
262     QWSServer::sendMouseEvent(mousePos, state, wheel);
263 }

在這裏把鼠標事件正式交給QWSServer,感興趣的話可以接着往下跟蹤,應該會進入Qt的事件處理
mouse

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章