summaryrefslogtreecommitdiffstats
path: root/src/gui/embedded/qmouseintegrity_qws.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/embedded/qmouseintegrity_qws.cpp')
-rw-r--r--src/gui/embedded/qmouseintegrity_qws.cpp231
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
-