summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/widgets/kernel/qshortcut.cpp8
-rw-r--r--src/widgets/widgets/qmenubar.cpp13
-rw-r--r--tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp25
3 files changed, 33 insertions, 13 deletions
diff --git a/src/widgets/kernel/qshortcut.cpp b/src/widgets/kernel/qshortcut.cpp
index 6eec5ff7e8..be5788274e 100644
--- a/src/widgets/kernel/qshortcut.cpp
+++ b/src/widgets/kernel/qshortcut.cpp
@@ -141,9 +141,11 @@ bool qWidgetShortcutContextMatcher(QObject *object, Qt::ShortcutContext context)
static bool correctWidgetContext(Qt::ShortcutContext context, QWidget *w, QWidget *active_window)
{
bool visible = w->isVisible();
-#if defined(Q_OS_DARWIN) && !defined(QT_NO_MENUBAR)
- if (!qApp->testAttribute(Qt::AA_DontUseNativeMenuBar) && qobject_cast<QMenuBar *>(w))
- visible = true;
+#ifndef QT_NO_MENUBAR
+ if (QMenuBar *menuBar = qobject_cast<QMenuBar *>(w)) {
+ if (menuBar->isNativeMenuBar())
+ visible = true;
+ }
#endif
if (!visible || !w->isEnabled())
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index 63fe09f77e..2588f41468 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -1271,10 +1271,12 @@ void QMenuBar::actionEvent(QActionEvent *e)
} else if(e->type() == QEvent::ActionRemoved) {
e->action()->disconnect(this);
}
- if (isVisible()) {
+ // updateGeometries() is also needed for native menu bars because
+ // it updates shortcutIndexMap
+ if (isVisible() || isNativeMenuBar())
d->updateGeometries();
+ if (isVisible())
update();
- }
}
/*!
@@ -1686,6 +1688,13 @@ void QMenuBarPrivate::_q_internalShortcutActivated(int id)
{
Q_Q(QMenuBar);
QAction *act = actions.at(id);
+ if (act && act->menu()) {
+ if (QPlatformMenu *platformMenu = act->menu()->platformMenu()) {
+ platformMenu->showPopup(q->windowHandle(), actionRects.at(id), Q_NULLPTR);
+ return;
+ }
+ }
+
setCurrentAction(act, true, true);
if (act && !act->menu()) {
activateAction(act, QAction::Trigger);
diff --git a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
index b04fb7cd5d..f19d7619cc 100644
--- a/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
+++ b/tests/auto/widgets/widgets/qmenubar/tst_qmenubar.cpp
@@ -93,6 +93,7 @@ private slots:
#if !defined(Q_OS_DARWIN)
void accel();
void activatedCount();
+ void activatedCount_data();
void check_accelKeys();
void check_cursorKeys1();
@@ -144,8 +145,8 @@ protected slots:
void slotForTaskQTBUG53205();
private:
- TestMenu initSimpleMenuBar(QMenuBar *mb);
- TestMenu initWindowWithSimpleMenuBar(QMainWindow &w);
+ TestMenu initSimpleMenuBar(QMenuBar *mb, bool forceNonNative = true);
+ TestMenu initWindowWithSimpleMenuBar(QMainWindow &w, bool forceNonNative = true);
QAction *createCharacterAction(QMenu *menu, char lowerAscii);
QMenu *addNumberedMenu(QMenuBar *mb, int n);
TestMenu initComplexMenuBar(QMenuBar *mb);
@@ -213,10 +214,10 @@ void tst_QMenuBar::cleanup()
// Create a simple menu bar and connect its actions to onSimpleActivated().
-TestMenu tst_QMenuBar::initSimpleMenuBar(QMenuBar *mb)
-{
+TestMenu tst_QMenuBar::initSimpleMenuBar(QMenuBar *mb, bool forceNonNative) {
TestMenu result;
- mb->setNativeMenuBar(false);
+ if (forceNonNative)
+ mb->setNativeMenuBar(false);
connect(mb, SIGNAL(triggered(QAction*)), this, SLOT(onSimpleActivated(QAction*)));
QMenu *menu = mb->addMenu(QStringLiteral("&accel"));
QAction *action = menu->addAction(QStringLiteral("menu1") );
@@ -239,11 +240,11 @@ TestMenu tst_QMenuBar::initSimpleMenuBar(QMenuBar *mb)
return result;
}
-inline TestMenu tst_QMenuBar::initWindowWithSimpleMenuBar(QMainWindow &w)
+inline TestMenu tst_QMenuBar::initWindowWithSimpleMenuBar(QMainWindow &w, bool forceNonNative)
{
w.resize(200, 200);
centerOnScreen(&w);
- return initSimpleMenuBar(w.menuBar());
+ return initSimpleMenuBar(w.menuBar(), forceNonNative);
}
// add a menu with number n, set number as data.
@@ -341,7 +342,8 @@ void tst_QMenuBar::activatedCount()
{
// create a popup menu with menu items set the accelerators later...
QMainWindow w;
- initWindowWithSimpleMenuBar(w);
+ QFETCH( bool, forceNonNative );
+ initWindowWithSimpleMenuBar(w, forceNonNative);
w.show();
QApplication::setActiveWindow(&w);
QVERIFY(QTest::qWaitForWindowActive(&w));
@@ -350,6 +352,13 @@ void tst_QMenuBar::activatedCount()
//wait(5000);
QCOMPARE( m_simpleActivatedCount, 2 ); //1 from the popupmenu and 1 from the menubar
}
+
+void tst_QMenuBar::activatedCount_data()
+{
+ QTest::addColumn<bool>("forceNonNative");
+ QTest::newRow( "forcing non-native menubar" ) << true;
+ QTest::newRow( "not forcing non-native menubar" ) << false;
+}
#endif
void tst_QMenuBar::clear()