diff options
-rw-r--r-- | src/gui/kernel/qapplication_s60.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qwidget/tst_qwidget.cpp | 33 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp index e937918..2be3ed3 100644 --- a/src/gui/kernel/qapplication_s60.cpp +++ b/src/gui/kernel/qapplication_s60.cpp @@ -1341,6 +1341,10 @@ void QSymbianControl::setFocusSafely(bool focus) // focus in Symbian. If this is not executed, the control which happens to be on // the top of the stack may randomly be assigned focus by Symbian, for example // when creating new windows (specifically in CCoeAppUi::HandleStackChanged()). + + // Close any popups. + CEikonEnv::Static()->EikAppUi()->StopDisplayingMenuBar(); + if (focus) { S60->appUi()->RemoveFromStack(this); // Symbian doesn't automatically remove focus from the last focused control, so we need to diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 098ce3c..2f221d2 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -70,6 +70,7 @@ #include <qtoolbar.h> #include <QtGui/qpaintengine.h> #include <private/qbackingstore_p.h> +#include <qmenubar.h> #include <QtGui/QGraphicsView> #include <QtGui/QGraphicsProxyWidget> @@ -81,8 +82,14 @@ #include <avkon.hrh> // EEikStatusPaneUidTitle #include <akntitle.h> // CAknTitlePane #include <akncontext.h> // CAknContextPane +#endif + +#ifdef Q_OS_SYMBIAN #include <eikspane.h> // CEikStatusPane #include <eikbtgpc.h> // CEikButtonGroupContainer +#include <eikenv.h> // CEikonEnv +#include <eikaufty.h> // MEikAppUiFactory +#include <eikmenub.h> // CEikMenuBar #endif #ifdef Q_WS_QWS @@ -387,6 +394,7 @@ private slots: void maximizedWindowModeTransitions(); void minimizedWindowModeTransitions(); void normalWindowModeTransitions(); + void focusSwitchClosesPopupMenu(); #endif void focusProxyAndInputMethods(); @@ -10253,6 +10261,31 @@ void tst_QWidget::normalWindowModeTransitions() QVERIFY(!buttonGroup->IsVisible()); QVERIFY(!statusPane->IsVisible()); } + +void tst_QWidget::focusSwitchClosesPopupMenu() +{ + QMainWindow mainWindow; + QAction action("Test action", &mainWindow); + mainWindow.menuBar()->addAction(&action); + + mainWindow.show(); + QT_TRAP_THROWING(CEikonEnv::Static()->AppUiFactory()->MenuBar()->TryDisplayMenuBarL()); + QVERIFY(CEikonEnv::Static()->AppUiFactory()->MenuBar()->IsDisplayed()); + + // Close the popup by opening a new window. + QMainWindow mainWindow2; + QAction action2("Test action", &mainWindow2); + mainWindow2.menuBar()->addAction(&action2); + mainWindow2.show(); + QVERIFY(!CEikonEnv::Static()->AppUiFactory()->MenuBar()->IsDisplayed()); + + QT_TRAP_THROWING(CEikonEnv::Static()->AppUiFactory()->MenuBar()->TryDisplayMenuBarL()); + QVERIFY(CEikonEnv::Static()->AppUiFactory()->MenuBar()->IsDisplayed()); + + // Close the popup by switching focus. + mainWindow.activateWindow(); + QVERIFY(!CEikonEnv::Static()->AppUiFactory()->MenuBar()->IsDisplayed()); +} #endif class InputContextTester : public QInputContext |