From af5fe425a8c6a1f9620c0c877ba8accc066298c1 Mon Sep 17 00:00:00 2001 From: Joel Bodenmann Date: Tue, 26 Jul 2016 12:50:32 +0200 Subject: [PATCH] Adding QWidget touch driver --- docs/releases.txt | 1 + .../ginput/touch/QWidget/example/mywidget.cpp | 54 ++++++++++++++ .../ginput/touch/QWidget/example/mywidget.h | 18 +++++ .../ginput/touch/QWidget/example/readme.txt | 3 + .../ginput/touch/QWidget/gmouse_lld_QWidget.c | 74 +++++++++++++++++++ drivers/ginput/touch/QWidget/readme.txt | 5 ++ 6 files changed, 155 insertions(+) create mode 100644 drivers/ginput/touch/QWidget/example/mywidget.cpp create mode 100644 drivers/ginput/touch/QWidget/example/mywidget.h create mode 100644 drivers/ginput/touch/QWidget/example/readme.txt create mode 100644 drivers/ginput/touch/QWidget/gmouse_lld_QWidget.c create mode 100644 drivers/ginput/touch/QWidget/readme.txt diff --git a/docs/releases.txt b/docs/releases.txt index fa87deef..edca8ede 100644 --- a/docs/releases.txt +++ b/docs/releases.txt @@ -11,6 +11,7 @@ FEATURE: Added gwinPrintg() FIX: Fix sprintg and related functions handling of NULL pointers. FIX: Fixing width calculation of gdispGDrawString() and gdispGFillString(). FEATURE: Added QImage display driver. +FEATURE: Added QWidget touch driver FEATURE: Added support for Qt as a GOS platform FEATURE: Add ability to set a parent for a win32 ugfx emulator window FEATURE: Add ability to inject mouse events for a Win32 ugfx emulator window diff --git a/drivers/ginput/touch/QWidget/example/mywidget.cpp b/drivers/ginput/touch/QWidget/example/mywidget.cpp new file mode 100644 index 00000000..b14713b1 --- /dev/null +++ b/drivers/ginput/touch/QWidget/example/mywidget.cpp @@ -0,0 +1,54 @@ +#include "mywidget.h" +#include "ugfx/src/ginput/ginput_driver_mouse.h" + +extern GMouse* qwidgetMouse; +extern coord_t qwidgetMouseX; +extern coord_t qwidgetMouseY; +extern coord_t qwidgetMouseZ; +extern uint16_t qwidgetMouseButtons; + +MyWidget::MyWidget(QWidget* parent) : QWidget(parent) +{ + // GMouse + if (!qwidgetMouse) { + qFatal("MyWidget::MyWidget(): Invalid GMouse (nullptr)."); + } + qwidgetMouse->display = nullptr; // Set your display here! +} + +void MyWidget::mousePressEvent(QMouseEvent* event) +{ + event->accept(); + + qwidgetMouseX = event->x(); + qwidgetMouseY = event->y(); + qwidgetMouseZ = 1; + + if (event->buttons() & Qt::LeftButton) { + qwidgetMouseButtons = GINPUT_MOUSE_BTN_LEFT; + } else if (event->buttons() & Qt::RightButton) { + qwidgetMouseButtons = GINPUT_MOUSE_BTN_RIGHT; + } + + _gmouseWakeup(qwidgetMouse); +} + +void MyWidget::mouseReleaseEvent(QMouseEvent* event) +{ + event->accept(); + + qwidgetMouseZ = 0; + qwidgetMouseButtons = 0; + + _gmouseWakeup(qwidgetMouse); +} + +void MyWidget::mouseMoveEvent(QMouseEvent* event) +{ + event->accept(); + + qwidgetMouseX = event->x(); + qwidgetMouseY = event->y(); + + _gmouseWakeup(qwidgetMouse); +} diff --git a/drivers/ginput/touch/QWidget/example/mywidget.h b/drivers/ginput/touch/QWidget/example/mywidget.h new file mode 100644 index 00000000..f3e329d3 --- /dev/null +++ b/drivers/ginput/touch/QWidget/example/mywidget.h @@ -0,0 +1,18 @@ +#pragma once + +class MyWidget : public QWidget +{ + Q_OBJECT + +public: + MyWidget(QWidget* parent = nullptr); + virtual ~MyWidget() = default; + +protected: + virtual void mousePressEvent(QMouseEvent* event) override; + virtual void mouseReleaseEvent(QMouseEvent* event) override; + virtual void mouseMoveEvent(QMouseEvent* event) override; + +private: + Q_DISABLE_COPY(MyWidget) +}; diff --git a/drivers/ginput/touch/QWidget/example/readme.txt b/drivers/ginput/touch/QWidget/example/readme.txt new file mode 100644 index 00000000..df127019 --- /dev/null +++ b/drivers/ginput/touch/QWidget/example/readme.txt @@ -0,0 +1,3 @@ +This example shows how a QWidget can be used as touch input. + +Important note: The GDisplay pointer must be set to a valid display in mywidget.cpp:16 for this to work. diff --git a/drivers/ginput/touch/QWidget/gmouse_lld_QWidget.c b/drivers/ginput/touch/QWidget/gmouse_lld_QWidget.c new file mode 100644 index 00000000..d79da2a2 --- /dev/null +++ b/drivers/ginput/touch/QWidget/gmouse_lld_QWidget.c @@ -0,0 +1,74 @@ +/* + * This file is subject to the terms of the GFX License. If a copy of + * the license was not distributed with this file, you can obtain one at: + * + * http://ugfx.org/license.html + */ + +#include "ugfx/gfx.h" + + +#if GFX_USE_GINPUT && GINPUT_NEED_MOUSE + +#define GMOUSE_DRIVER_VMT GMOUSEVMT_QWidget +#include "../../../../src/ginput/ginput_driver_mouse.h" + +GMouse* qwidgetMouse; +coord_t qwidgetMouseX; +coord_t qwidgetMouseY; +coord_t qwidgetMouseZ; +uint16_t qwidgetMouseButtons; + +static bool_t _init(GMouse* m, unsigned driverinstance) +{ + (void)driverinstance; + + qwidgetMouse = m; + + return TRUE; +} + +static bool_t _read(GMouse* m, GMouseReading* pdr) +{ + (void)m; + + pdr->x = qwidgetMouseX; + pdr->y = qwidgetMouseY; + pdr->z = qwidgetMouseZ; + pdr->buttons = qwidgetMouseButtons; + + return TRUE; +} + +const GMouseVMT GMOUSE_DRIVER_VMT[1] = {{ + { + GDRIVER_TYPE_MOUSE, + 0, + sizeof(GMouse), + _gmouseInitDriver, + _gmousePostInitDriver, + _gmouseDeInitDriver + }, + 1, // z_max + 0, // z_min + 1, // z_touchon + 0, // z_touchoff + { // pen_jitter + 1, // calibrate + 1, // click + 1 // move + }, + { // finger_jitter + 1, // calibrate + 1, // click + 1 // move + }, + _init, // init + 0, // deinit + _read, // get + 0, // calsave + 0 // calload +}}; + +#endif /* GFX_USE_GINPUT && GINPUT_NEED_MOUSE */ + diff --git a/drivers/ginput/touch/QWidget/readme.txt b/drivers/ginput/touch/QWidget/readme.txt new file mode 100644 index 00000000..cd2cca8d --- /dev/null +++ b/drivers/ginput/touch/QWidget/readme.txt @@ -0,0 +1,5 @@ +Limitation: As this driver only exports one set of variables, this driver can only be used + on systems with one single touch input device of this type. To overcome this + limitation, the global variables have to be converted into arrays. The driverinstance + variable passed to the _read() function is then used to distinguish between the + different instances.