diff options
author | RSDuck <RSDuck@users.noreply.github.com> | 2021-05-24 20:23:06 +0200 |
---|---|---|
committer | RSDuck <RSDuck@users.noreply.github.com> | 2021-05-24 20:23:06 +0200 |
commit | e48e45db7698e006d19b9f5422d9fc86fe8e9013 (patch) | |
tree | 15e97946cf484eb7bbb264278da6c156a2b9b86f /src/frontend/qt_sdl/main.cpp | |
parent | 9181ab19c703890db7f12a2f7f42fc6b1c99d0e8 (diff) |
frontend: handle tablet and touch events
fixes #654 and #548
Diffstat (limited to 'src/frontend/qt_sdl/main.cpp')
-rw-r--r-- | src/frontend/qt_sdl/main.cpp | 104 |
1 files changed, 97 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()); |