aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRSDuck <RSDuck@users.noreply.github.com>2021-05-24 20:23:06 +0200
committerRSDuck <RSDuck@users.noreply.github.com>2021-05-24 20:23:06 +0200
commite48e45db7698e006d19b9f5422d9fc86fe8e9013 (patch)
tree15e97946cf484eb7bbb264278da6c156a2b9b86f
parent9181ab19c703890db7f12a2f7f42fc6b1c99d0e8 (diff)
frontend: handle tablet and touch events
fixes #654 and #548
-rw-r--r--src/frontend/qt_sdl/main.cpp104
-rw-r--r--src/frontend/qt_sdl/main.h7
2 files changed, 104 insertions, 7 deletions
diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp
index 71ab896..73ccf71 100644
--- a/src/frontend/qt_sdl/main.cpp
+++ b/src/frontend/qt_sdl/main.cpp
@@ -764,15 +764,68 @@ void ScreenHandler::screenOnMouseMove(QMouseEvent* event)
int x = event->pos().x();
int y = event->pos().y();
- Frontend::GetTouchCoords(x, y);
+ if (Frontend::GetTouchCoords(x, y))
+ NDS::TouchScreen(x, y);
+}
- // clamp to screen range
- if (x < 0) x = 0;
- else if (x > 255) x = 255;
- if (y < 0) y = 0;
- else if (y > 191) y = 191;
+void ScreenHandler::screenHandleTablet(QTabletEvent* event)
+{
+ event->accept();
- NDS::TouchScreen(x, y);
+ switch(event->type())
+ {
+ case QEvent::TabletPress:
+ case QEvent::TabletMove:
+ {
+ int x = event->x();
+ int y = event->y();
+
+ if (Frontend::GetTouchCoords(x, y))
+ {
+ touching = true;
+ NDS::TouchScreen(x, y);
+ }
+ }
+ break;
+ case QEvent::TabletRelease:
+ if (touching)
+ {
+ NDS::ReleaseScreen();
+ touching = false;
+ }
+ break;
+ }
+}
+
+void ScreenHandler::screenHandleTouch(QTouchEvent* event)
+{
+ event->accept();
+
+ switch(event->type())
+ {
+ case QEvent::TouchBegin:
+ case QEvent::TouchUpdate:
+ if (event->touchPoints().length() > 0)
+ {
+ QPointF lastPosition = event->touchPoints().first().lastPos();
+ int x = (int)lastPosition.x();
+ int y = (int)lastPosition.y();
+
+ if (Frontend::GetTouchCoords(x, y))
+ {
+ touching = true;
+ NDS::TouchScreen(x, y);
+ }
+ }
+ break;
+ case QEvent::TouchEnd:
+ if (touching)
+ {
+ NDS::ReleaseScreen();
+ touching = false;
+ }
+ break;
+ }
}
void ScreenHandler::showCursor()
@@ -801,6 +854,8 @@ ScreenPanelNative::ScreenPanelNative(QWidget* parent) : QWidget(parent)
touching = false;
+ setAttribute(Qt::WA_AcceptTouchEvents);
+
OSD::Init(nullptr);
}
@@ -879,6 +934,23 @@ void ScreenPanelNative::mouseMoveEvent(QMouseEvent* event)
screenOnMouseMove(event);
}
+void ScreenPanelNative::tabletEvent(QTabletEvent* event)
+{
+ screenHandleTablet(event);
+}
+
+bool ScreenPanelNative::event(QEvent* event)
+{
+ if (event->type() == QEvent::TouchBegin
+ || event->type() == QEvent::TouchEnd
+ || event->type() == QEvent::TouchUpdate)
+ {
+ screenHandleTouch((QTouchEvent*)event);
+ return true;
+ }
+ return QWidget::event(event);
+}
+
void ScreenPanelNative::onScreenLayoutChanged()
{
setMinimumSize(screenGetMinSize());
@@ -890,6 +962,7 @@ ScreenPanelGL::ScreenPanelGL(QWidget* parent) : QOpenGLWidget(parent)
{
touching = false;
+ setAttribute(Qt::WA_AcceptTouchEvents);
}
ScreenPanelGL::~ScreenPanelGL()
@@ -1090,6 +1163,23 @@ void ScreenPanelGL::mouseMoveEvent(QMouseEvent* event)
screenOnMouseMove(event);
}
+void ScreenPanelGL::tabletEvent(QTabletEvent* event)
+{
+ screenHandleTablet(event);
+}
+
+bool ScreenPanelGL::event(QEvent* event)
+{
+ if (event->type() == QEvent::TouchBegin
+ || event->type() == QEvent::TouchEnd
+ || event->type() == QEvent::TouchUpdate)
+ {
+ screenHandleTouch((QTouchEvent*)event);
+ return true;
+ }
+ return QWidget::event(event);
+}
+
void ScreenPanelGL::onScreenLayoutChanged()
{
setMinimumSize(screenGetMinSize());
diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h
index 46eacc1..19f9d22 100644
--- a/src/frontend/qt_sdl/main.h
+++ b/src/frontend/qt_sdl/main.h
@@ -110,6 +110,9 @@ protected:
void screenOnMouseRelease(QMouseEvent* event);
void screenOnMouseMove(QMouseEvent* event);
+ void screenHandleTablet(QTabletEvent* event);
+ void screenHandleTouch(QTouchEvent* event);
+
float screenMatrix[Frontend::MaxScreenTransforms][6];
int screenKind[Frontend::MaxScreenTransforms];
int numScreens;
@@ -137,6 +140,8 @@ protected:
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
+ void tabletEvent(QTabletEvent* event) override;
+ bool event(QEvent* event) override;
private slots:
void onScreenLayoutChanged();
@@ -168,6 +173,8 @@ protected:
void mouseReleaseEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;
+ void tabletEvent(QTabletEvent* event) override;
+ bool event(QEvent* event) override;
private slots:
void onScreenLayoutChanged();