From ef4a999a9f098f4013759422e6a1dfb8c32c1180 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Thu, 14 Aug 2014 16:56:14 +0300 Subject: Forward menu button events to Qt if there is no visible menubar. Task-number: QTBUG-32334 Change-Id: If1b4517f233b04d4c6c165cbfe62c8cf7b624c60 Reviewed-by: Paul Olav Tvete --- .../org/qtproject/qt5/android/QtActivityDelegate.java | 18 ------------------ .../jar/src/org/qtproject/qt5/android/QtNative.java | 10 ++++++++++ src/gui/kernel/qguiapplication.cpp | 12 +++++++++--- src/gui/kernel/qplatformtheme.h | 1 + src/plugins/platforms/android/androidjnimenu.cpp | 9 +++++++++ src/plugins/platforms/android/androidjnimenu.h | 1 + .../platforms/android/qandroidplatformtheme.cpp | 6 ++++++ src/plugins/platforms/android/qandroidplatformtheme.h | 1 + 8 files changed, 37 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index f57497069a..b4b483b416 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -815,15 +815,6 @@ public class QtActivityDelegate if (!m_started) return false; - if (keyCode == KeyEvent.KEYCODE_MENU) { - try { - return (Boolean)m_super_onKeyDown.invoke(m_activity, keyCode, event); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - m_metaState = MetaKeyKeyListener.handleKeyDown(m_metaState, keyCode, event); int c = event.getUnicodeChar(MetaKeyKeyListener.getMetaState(m_metaState)); int lc = c; @@ -858,15 +849,6 @@ public class QtActivityDelegate if (!m_started) return false; - if (keyCode == KeyEvent.KEYCODE_MENU) { - try { - return (Boolean)m_super_onKeyUp.invoke(m_activity, keyCode, event); - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_MUTE) diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java index 02bb1ae485..31a99bf910 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtNative.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtNative.java @@ -484,6 +484,16 @@ public class QtNative }); } + private static void openOptionsMenu() + { + runAction(new Runnable() { + @Override + public void run() { + m_activity.openOptionsMenu(); + } + }); + } + private static byte[][] getSSLCertificates() { ArrayList certificateList = new ArrayList(); diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 9155abf8b9..2d7900b5d9 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1886,11 +1886,17 @@ void QGuiApplicationPrivate::processKeyEvent(QWindowSystemInterfacePrivate::KeyE ev.setAccepted(false); static bool backKeyPressAccepted = false; + static bool menuKeyPressAccepted = false; if (e->keyType == QEvent::KeyPress) { backKeyPressAccepted = e->key == Qt::Key_Back && ev.isAccepted(); - } else if (e->keyType == QEvent::KeyRelease && e->key == Qt::Key_Back && !backKeyPressAccepted && !ev.isAccepted()) { - if (window) - QWindowSystemInterface::handleCloseEvent(window); + menuKeyPressAccepted = e->key == Qt::Key_Menu && ev.isAccepted(); + } else if (e->keyType == QEvent::KeyRelease) { + if (e->key == Qt::Key_Back && !backKeyPressAccepted && !ev.isAccepted()) { + if (window) + QWindowSystemInterface::handleCloseEvent(window); + } else if (e->key == Qt::Key_Menu && !menuKeyPressAccepted && !ev.isAccepted()) { + platform_theme->showPlatformMenuBar(); + } } #endif } diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h index a2d14be0fb..ad2b4a2164 100644 --- a/src/gui/kernel/qplatformtheme.h +++ b/src/gui/kernel/qplatformtheme.h @@ -276,6 +276,7 @@ public: virtual QPlatformMenuItem* createPlatformMenuItem() const; virtual QPlatformMenu* createPlatformMenu() const; virtual QPlatformMenuBar* createPlatformMenuBar() const; + virtual void showPlatformMenuBar() {} virtual bool usePlatformNativeDialog(DialogType type) const; virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const; diff --git a/src/plugins/platforms/android/androidjnimenu.cpp b/src/plugins/platforms/android/androidjnimenu.cpp index 6a979b9255..9dc8395888 100644 --- a/src/plugins/platforms/android/androidjnimenu.cpp +++ b/src/plugins/platforms/android/androidjnimenu.cpp @@ -68,6 +68,7 @@ namespace QtAndroidMenu static jmethodID openContextMenuMethodID = 0; static jmethodID closeContextMenuMethodID = 0; static jmethodID resetOptionsMenuMethodID = 0; + static jmethodID openOptionsMenuMethodID = 0; static jmethodID clearMenuMethodID = 0; static jmethodID addMenuItemMethodID = 0; @@ -87,6 +88,13 @@ namespace QtAndroidMenu env.jniEnv->CallStaticVoidMethod(applicationClass(), resetOptionsMenuMethodID); } + void openOptionsMenu() + { + AttachedJNIEnv env; + if (env.jniEnv) + env.jniEnv->CallStaticVoidMethod(applicationClass(), openOptionsMenuMethodID); + } + void showContextMenu(QAndroidPlatformMenu *menu, JNIEnv *env) { QMutexLocker lock(&visibleMenuMutex); @@ -409,6 +417,7 @@ namespace QtAndroidMenu GET_AND_CHECK_STATIC_METHOD(openContextMenuMethodID, appClass, "openContextMenu", "()V"); GET_AND_CHECK_STATIC_METHOD(closeContextMenuMethodID, appClass, "closeContextMenu", "()V"); GET_AND_CHECK_STATIC_METHOD(resetOptionsMenuMethodID, appClass, "resetOptionsMenu", "()V"); + GET_AND_CHECK_STATIC_METHOD(openOptionsMenuMethodID, appClass, "openOptionsMenu", "()V"); jclass clazz; FIND_AND_CHECK_CLASS("android/view/Menu"); diff --git a/src/plugins/platforms/android/androidjnimenu.h b/src/plugins/platforms/android/androidjnimenu.h index 2ae406901a..3ca0fb555f 100644 --- a/src/plugins/platforms/android/androidjnimenu.h +++ b/src/plugins/platforms/android/androidjnimenu.h @@ -55,6 +55,7 @@ class QWindow; namespace QtAndroidMenu { // Menu support + void openOptionsMenu(); void showContextMenu(QAndroidPlatformMenu *menu, JNIEnv *env = 0); void hideContextMenu(QAndroidPlatformMenu *menu); void syncMenu(QAndroidPlatformMenu *menu); diff --git a/src/plugins/platforms/android/qandroidplatformtheme.cpp b/src/plugins/platforms/android/qandroidplatformtheme.cpp index 1c9be189c8..b24085f5ea 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.cpp +++ b/src/plugins/platforms/android/qandroidplatformtheme.cpp @@ -39,6 +39,7 @@ ** ****************************************************************************/ +#include "androidjnimenu.h" #include "qandroidplatformtheme.h" #include "qandroidplatformmenubar.h" #include "qandroidplatformmenu.h" @@ -104,6 +105,11 @@ QPlatformMenuItem *QAndroidPlatformTheme::createPlatformMenuItem() const return new QAndroidPlatformMenuItem; } +void QAndroidPlatformTheme::showPlatformMenuBar() +{ + QtAndroidMenu::openOptionsMenu(); +} + static inline int paletteType(QPlatformTheme::Palette type) { switch (type) { diff --git a/src/plugins/platforms/android/qandroidplatformtheme.h b/src/plugins/platforms/android/qandroidplatformtheme.h index c37c9986c6..786e7e5650 100644 --- a/src/plugins/platforms/android/qandroidplatformtheme.h +++ b/src/plugins/platforms/android/qandroidplatformtheme.h @@ -55,6 +55,7 @@ public: virtual QPlatformMenuBar *createPlatformMenuBar() const; virtual QPlatformMenu *createPlatformMenu() const; virtual QPlatformMenuItem *createPlatformMenuItem() const; + virtual void showPlatformMenuBar(); virtual const QPalette *palette(Palette type = SystemPalette) const; virtual const QFont *font(Font type = SystemFont) const; virtual QVariant themeHint(ThemeHint hint) const; -- cgit v1.2.3