⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qmousebus_qws.cpp

📁 奇趣公司比较新的qt/emd版本
💻 CPP
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "qmousebus_qws.h"#ifndef QT_NO_QWS_MOUSE_BUS#include "qwindowsystem_qws.h"#include "qsocketnotifier.h"#include "qapplication.h"#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <termios.h>/* * bus mouse driver (a.k.a. Logitech busmouse) */class QWSBusMouseHandlerPrivate : public QObject{    Q_OBJECTpublic:    QWSBusMouseHandlerPrivate(QWSBusMouseHandler *h, const QString &driver, const QString &device);    ~QWSBusMouseHandlerPrivate();    void suspend();    void resume();private slots:    void readMouseData();protected:    enum { mouseBufSize = 128 };    QWSBusMouseHandler *handler;    QSocketNotifier *mouseNotifier;    int mouseFD;    int mouseIdx;    int obstate;    uchar mouseBuf[mouseBufSize];};QWSBusMouseHandler::QWSBusMouseHandler(const QString &driver, const QString &device)    : QWSMouseHandler(driver, device){    d = new QWSBusMouseHandlerPrivate(this, driver, device);}QWSBusMouseHandler::~QWSBusMouseHandler(){    delete d;}void QWSBusMouseHandler::suspend(){    d->suspend();}void QWSBusMouseHandler::resume(){    d->resume();}QWSBusMouseHandlerPrivate::QWSBusMouseHandlerPrivate(QWSBusMouseHandler *h,    const QString &, const QString &device)    : handler(h){    QString mouseDev = device;    if (mouseDev.isEmpty())        mouseDev = QLatin1String("/dev/mouse");    obstate = -1;    mouseFD = -1;    mouseFD = open(mouseDev.toLocal8Bit(), O_RDWR | O_NDELAY);    if (mouseFD < 0)        mouseFD = open(mouseDev.toLocal8Bit(), O_RDONLY | O_NDELAY);    if (mouseFD < 0)        qDebug("Cannot open %s (%s)", qPrintable(mouseDev), strerror(errno));    // Clear pending input    tcflush(mouseFD,TCIFLUSH);    usleep(50000);    char buf[100];                                // busmouse driver will not read if bufsize < 3,  YYD    while (read(mouseFD, buf, 100) > 0) { }  // eat unwanted replies    mouseIdx = 0;    mouseNotifier = new QSocketNotifier(mouseFD, QSocketNotifier::Read, this);    connect(mouseNotifier, SIGNAL(activated(int)),this, SLOT(readMouseData()));}QWSBusMouseHandlerPrivate::~QWSBusMouseHandlerPrivate(){    if (mouseFD >= 0) {        tcflush(mouseFD,TCIFLUSH);            // yyd.        close(mouseFD);    }}void QWSBusMouseHandlerPrivate::suspend(){    mouseNotifier->setEnabled(false);}void QWSBusMouseHandlerPrivate::resume(){    mouseIdx = 0;    obstate = -1;    mouseNotifier->setEnabled(true);}void QWSBusMouseHandlerPrivate::readMouseData(){    int n;    // It'll only read 3 bytes a time and return all other buffer zeroed, thus cause protocol errors    for (;;) {        if (mouseBufSize - mouseIdx < 3)            break;        n = read(mouseFD, mouseBuf+mouseIdx, 3);        if (n != 3)            break;        mouseIdx += 3;    }    static const int accel_limit = 5;    static const int accel = 2;    int idx = 0;    int bstate = 0;    int dx = 0, dy = 0;    bool sendEvent = false;    int tdx = 0, tdy = 0;    while (mouseIdx-idx >= 3) {#if 0 // debug        qDebug("Got mouse data");#endif        uchar *mb = mouseBuf+idx;        bstate = 0;        dx = 0;        dy = 0;        sendEvent = false;        if (((mb[0] & 0x04)))            bstate |= Qt::LeftButton;        if (((mb[0] & 0x01)))            bstate |= Qt::RightButton;        dx=(signed char)mb[1];        dy=(signed char)mb[2];        sendEvent=true;        if (sendEvent) {            if (qAbs(dx) > accel_limit || qAbs(dy) > accel_limit) {                dx *= accel;                dy *= accel;            }            tdx += dx;            tdy += dy;            if (bstate != obstate) {                QPoint pos = handler->pos() + QPoint(tdx,-tdy);                handler->limitToScreen(pos);                handler->mouseChanged(pos,bstate);                sendEvent = false;                tdx = 0;                tdy = 0;                obstate = bstate;            }        }        idx += 3;    }    if (sendEvent) {        QPoint pos = handler->pos() + QPoint(tdx,-tdy);        handler->limitToScreen(pos);        handler->mouseChanged(pos,bstate);    }    int surplus = mouseIdx - idx;    for (int i = 0; i < surplus; i++)        mouseBuf[i] = mouseBuf[idx+i];    mouseIdx = surplus;}#include "qmousebus_qws.moc"#endif // QT_NO_QWS_MOUSE_BUS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -