diff options
Diffstat (limited to 'src/gui/embedded/qmouseintegrity_qws.cpp')
-rw-r--r-- | src/gui/embedded/qmouseintegrity_qws.cpp | 231 |
1 files changed, 121 insertions, 110 deletions
diff --git a/src/gui/embedded/qmouseintegrity_qws.cpp b/src/gui/embedded/qmouseintegrity_qws.cpp index e7f1c51..939a598 100644 --- a/src/gui/embedded/qmouseintegrity_qws.cpp +++ b/src/gui/embedded/qmouseintegrity_qws.cpp @@ -45,24 +45,11 @@ #include <qwindowsystem_qws.h> #include <qapplication.h> #include <qtimer.h> -#include <qthread.h> - #include <INTEGRITY.h> +#include <QThread> -typedef Address MOUSEHandler; -typedef struct MOUSEMessageStruct -{ - Value x; - Value y; - Value z; - Value buttons; -} MOUSEMessage; - -static Error MOUSE_Init(MOUSEHandler *handler, Boolean *isabsolute); -static Error MOUSE_SynchronousGetPosition(MOUSEHandler handler, MOUSEMessage *msg, - Boolean absolute); -static Error MOUSE_ShouldFilter(MOUSEHandler handler, Boolean *filter); +#include <device/hiddriver.h> QT_BEGIN_NAMESPACE @@ -82,7 +69,6 @@ public: bool waitforread; bool suspended; QIntMouseListenThread *mousethread; - private: QIntMouseHandler *handler; }; @@ -92,14 +78,17 @@ class QIntMouseListenThread : public QThread protected: QIntMousePrivate *imp; bool loop; + QList<HIDHandle> handleList; + QList<Activity> actList; + Semaphore loopsem; public: QIntMouseListenThread(QIntMousePrivate *im) : QThread(), imp(im) {}; ~QIntMouseListenThread() {}; void run(); - void stoploop() { loop = false; }; + bool setup(QString driverName, uint32_t index); + void stoploop() { loop = false; ReleaseSemaphore(loopsem); }; }; - QIntMouseHandler::QIntMouseHandler(const QString &driver, const QString &device) : QObject(), QWSCalibratedMouseHandler(driver, device) { @@ -109,6 +98,7 @@ QIntMouseHandler::QIntMouseHandler(const QString &driver, const QString &device) d->calibrated = (test != transform(test)); + d->mousethread->setup(QString(), 0); d->mousethread->start(); } @@ -133,9 +123,9 @@ void QIntMouseHandler::readMouseData(int x, int y, int buttons) d->waitforread = false; if (d->suspended) return; - if (d->calibrated) { + if (d->calibrated) sendFiltered(QPoint(x, y), buttons); - } else { + else { QPoint pos; pos = transform(QPoint(x, y)); limitToScreen(pos); @@ -153,27 +143,125 @@ void QIntMouseHandler::calibrate(const QWSPointerCalibrationData *data) QWSCalibratedMouseHandler::calibrate(data); } +bool QIntMouseListenThread::setup(QString driverName, uint32_t index) +{ + int i; + int devices; + Error driverError, deviceError; + HIDDriver *driver; + HIDHandle handle; + /* FIXME : take a list of driver names/indexes for setup */ + devices = 0; + i = 0; + do { + driverError = gh_hid_get_driver(i, &driver); + if (driverError == Success) { + int j = 0; + do { + deviceError = gh_hid_init_device(driver, j, &handle); + if (deviceError == Success) { + int32_t type; + /* only accept pointing devices */ + deviceError = gh_hid_get_setting(handle, HID_SETTING_CAPABILITIES, &type); + if ((deviceError == Success) && (type & HID_TYPE_AXIS)) { + handleList.append(handle); + devices++; + } else + gh_hid_close(handle); + j++; + } + } while (deviceError == Success); + i++; + } + } while (driverError == Success); + return (devices > 0); +} + void QIntMouseListenThread::run(void) { - MOUSEHandler handler; - MOUSEMessage msg; - Boolean filter; - Boolean isabsolute; + Value id; + HIDEvent event; + Activity loopact; + QPoint currentpos(0,0); + Qt::MouseButtons currentbutton = Qt::NoButton; + Qt::KeyboardModifiers keymod; + + /* first create all Activities for the main loop. + * We couldn't do this in setup() because this Task is different */ + Activity act; + int i = 0; + foreach (HIDHandle h, handleList) { + CheckSuccess(CreateActivity(CurrentTask(), 2, false, i, &act)); + actList.append(act); + i++; + CheckSuccess(gh_hid_async_wait_for_event(h, act)); + } + + /* setup a Semaphore used to watch for a request for exit */ + CheckSuccess(CreateSemaphore(0, &loopsem)); + CheckSuccess(CreateActivity(CurrentTask(), 2, false, 0, &loopact)); + CheckSuccess(AsynchronousReceive(loopact, (Object)loopsem, NULL)); + loop = true; - CheckSuccess(MOUSE_Init(&handler, &isabsolute)); - CheckSuccess(MOUSE_ShouldFilter(handler, &filter)); - if (!filter) - imp->calibrated = false; - imp->waitforread = false; do { - MOUSE_SynchronousGetPosition(handler, &msg, isabsolute); - imp->dataReady(msg.x, msg.y, msg.buttons); + uint32_t num_events = 1; + + WaitForActivity(&id); + if (loop) { + while (gh_hid_get_event(handleList.at(id), &event, &num_events) == Success) { + if (event.type == HID_TYPE_AXIS) { + switch (event.index) { + case HID_AXIS_ABSX: + currentpos.setX(event.value); + break; + case HID_AXIS_ABSY: + currentpos.setY(event.value); + break; + case HID_AXIS_RELX: + currentpos.setX(currentpos.x() + event.value); + break; + case HID_AXIS_RELY: + currentpos.setY(currentpos.y() + event.value); + break; + default: + break; + } + } else if (event.type == HID_TYPE_KEY) { + switch (event.index) { + case HID_BUTTON_LEFT: + if (event.value) + currentbutton |= Qt::LeftButton; + else + currentbutton &= ~Qt::LeftButton; + break; + case HID_BUTTON_MIDDLE: + if (event.value) + currentbutton |= Qt::MiddleButton; + else + currentbutton &= ~Qt::MiddleButton; + break; + case HID_BUTTON_RIGHT: + if (event.value) + currentbutton |= Qt::RightButton; + else + currentbutton &= ~Qt::RightButton; + break; + } + } else if (event.type == HID_TYPE_SYNC) { + /* sync events are sent by mouses and not by keyboards. + * this should probably be changed */ + imp->dataReady(currentpos.x(), currentpos.y(), currentbutton); + //QWindowSystemInterface::handleMouseEvent(0, currentpos, currentpos, currentbutton); + } + } + CheckSuccess(gh_hid_async_wait_for_event(handleList.at(id), actList.at(id))); + } } while (loop); + CloseSemaphore(loopsem); QThread::exit(0); } -QIntMousePrivate::QIntMousePrivate(QIntMouseHandler *handler) - : QObject() +QIntMousePrivate::QIntMousePrivate(QIntMouseHandler *handler) : QObject() { this->handler = handler; suspended = false; @@ -191,81 +279,4 @@ QT_END_NAMESPACE #include "qmouseintegrity_qws.moc" -typedef struct USBMouseStruct -{ - Connection mouseconn; - Buffer mousemsg[2]; - Value x; - Value y; -} USBMouse; - -USBMouse mousedev; - -Error MOUSE_Init(MOUSEHandler *handler, Boolean *isabsolute) -{ - Error E; - bool loop = true; - memset((void*)&mousedev, 0, sizeof(USBMouse)); - mousedev.mousemsg[0].BufferType = DataImmediate; - mousedev.mousemsg[1].BufferType = DataImmediate | LastBuffer; - do { - E = RequestResource((Object*)&mousedev.mouseconn, - "MouseClient", "!systempassword"); - if (E == Success) { - *isabsolute = true; - loop = false; - } else { - E = RequestResource((Object*)&mousedev.mouseconn, - "USBMouseClient", "!systempassword"); - if (E == Success) { - *isabsolute = false; - loop = false; - } - } - if (loop) - sleep(1); - } while (loop); - *handler = (MOUSEHandler)&mousedev; - return Success; -} - -Error MOUSE_SynchronousGetPosition(MOUSEHandler handler, MOUSEMessage *msg, - Boolean isabsolute) -{ - signed long x; - signed long y; - USBMouse *mdev = (USBMouse *)handler; - mdev->mousemsg[0].Transferred = 0; - mdev->mousemsg[1].Transferred = 0; - SynchronousReceive(mdev->mouseconn, mdev->mousemsg); - if (isabsolute) { - x = (signed long)mdev->mousemsg[0].Length; - y = (signed long)mdev->mousemsg[1].TheAddress; - } else { - x = mdev->x + (signed long)mdev->mousemsg[0].Length; - y = mdev->y + (signed long)mdev->mousemsg[1].TheAddress; - } - if (x < 0) - mdev->x = 0; - else - mdev->x = x; - if (y < 0) - mdev->y = 0; - else - mdev->y = y; - msg->x = mdev->x; - msg->y = mdev->y; - msg->buttons = mdev->mousemsg[0].TheAddress; - return Success; -} - -Error MOUSE_ShouldFilter(MOUSEHandler handler, Boolean *filter) -{ - if (filter == NULL) - return Failure; - *filter = false; - return Success; -} - #endif // QT_NO_QWS_MOUSE_INTEGRITY - |