diff options
Diffstat (limited to 'src/plugins/platforms/ios')
-rw-r--r-- | src/plugins/platforms/ios/quiview.mm | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/plugins/platforms/ios/quiview.mm b/src/plugins/platforms/ios/quiview.mm index bf929667a6..9f910dfe5e 100644 --- a/src/plugins/platforms/ios/quiview.mm +++ b/src/plugins/platforms/ios/quiview.mm @@ -50,6 +50,7 @@ #include <QtGui/private/qguiapplication_p.h> #include <QtGui/private/qwindow_p.h> +#include <qpa/qwindowsysteminterface_p.h> @implementation QUIView @@ -442,6 +443,58 @@ QWindowSystemInterface::flushWindowSystemEvents(); } +- (int)mapPressTypeToKey:(UIPress*)press +{ + switch (press.type) { + case UIPressTypeUpArrow: return Qt::Key_Up; + case UIPressTypeDownArrow: return Qt::Key_Down; + case UIPressTypeLeftArrow: return Qt::Key_Left; + case UIPressTypeRightArrow: return Qt::Key_Right; + case UIPressTypeSelect: return Qt::Key_Select; + case UIPressTypeMenu: return Qt::Key_Menu; + case UIPressTypePlayPause: return Qt::Key_MediaTogglePlayPause; + } + return Qt::Key_unknown; +} + +- (bool)processPresses:(NSSet *)presses withType:(QEvent::Type)type { + // Presses on Menu button will generate a Menu key event. By default, not handling + // this event will cause the application to return to Headboard (tvOS launcher). + // When handling the event (for example, as a back button), both press and + // release events must be handled accordingly. + + QScopedValueRollback<bool> syncRollback(QWindowSystemInterfacePrivate::synchronousWindowSystemEvents, true); + + bool handled = false; + for (UIPress* press in presses) { + int key = [self mapPressTypeToKey:press]; + if (key == Qt::Key_unknown) + continue; + if (QWindowSystemInterface::handleKeyEvent(m_qioswindow->window(), type, key, Qt::NoModifier)) + handled = true; + } + + return handled; +} + +- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event +{ + if (![self processPresses:presses withType:QEvent::KeyPress]) + [super pressesBegan:presses withEvent:event]; +} + +- (void)pressesChanged:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event +{ + if (![self processPresses:presses withType:QEvent::KeyPress]) + [super pressesChanged:presses withEvent:event]; +} + +- (void)pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event +{ + if (![self processPresses:presses withType:QEvent::KeyRelease]) + [super pressesEnded:presses withEvent:event]; +} + - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { #ifndef Q_OS_TVOS |