• QtEmbedded鼠标驱动流程分析(下)


    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。

    原文链接: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

    原文地址 http://www.cuteqt.com/blog/?p=759

  • 相关阅读:
    怎样使用七牛云CDN加速并绑定阿里云域名
    mac系统Docker安装Redis教程
    使用Java Executor框架实现多线程
    我是怎样测试Java类的线程安全性的
    Java8 Stream终端操作使用详解
    Java8 Stream中间操作使用详解
    Java 8创建Stream流的5种方法
    JVM源码分析之Metaspace解密
    全链路压测体系建设方案的思考与实践
    JVM源码分析之Object.wait/notify(All)完全解读
  • 原文地址:https://www.cnblogs.com/cute/p/2114244.html
Copyright © 2020-2023  润新知