diff options
author | Gabriel de Dietrich <gabriel.dedietrich@qt.io> | 2018-04-18 19:04:13 -0700 |
---|---|---|
committer | Gabriel de Dietrich <gabriel.dedietrich@qt.io> | 2018-05-23 18:09:28 +0000 |
commit | 595c1ae9e7be14162acdfcbc573f31ef6661e718 (patch) | |
tree | 437422a3cfd7d0499510f5b375e030ee6ae4e2d2 /src/plugins/platforms/cocoa/qnsview_menus.mm | |
parent | bd74b624d53ce076a8b6a90a66da0a19da1ec17c (diff) |
Cocoa Menus: Add support for menu items in window-less apps
Since we moved the menu items validation and target/action to
QNSView (thus relying on the responder chain), we need to take
care of case when the applications that doesn't have any window
open. By adding similar methods to QCocoaApplicationDelegate,
the last responder, we ensure the menu items will be validated
and will trigger properly. This is particularly necessary for
dock menu items, which live separately from any top-level widget.
Dock menu added to Menurama which won't quit when its last window
is closed. This way we can test that dock menu items will trigger
in the absence of any window.
Change-Id: I56d864eb9da1f8dd5adb2a3b6c3dd5304c723117
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/cocoa/qnsview_menus.mm')
-rw-r--r-- | src/plugins/platforms/cocoa/qnsview_menus.mm | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/src/plugins/platforms/cocoa/qnsview_menus.mm b/src/plugins/platforms/cocoa/qnsview_menus.mm index db3d356f2e..f0489552aa 100644 --- a/src/plugins/platforms/cocoa/qnsview_menus.mm +++ b/src/plugins/platforms/cocoa/qnsview_menus.mm @@ -39,6 +39,7 @@ // This file is included from qnsview.mm, and only used to organize the code +#include <qcocoaapplicationdelegate.h> #include <qcocoansmenu.h> #include <qcocoamenuitem.h> #include <qcocoamenu.h> @@ -101,19 +102,8 @@ static bool selectorIsCutCopyPaste(SEL selector) - (void)qt_itemFired:(QCocoaNSMenuItem *)item { - auto *nativeItem = qt_objc_cast<QCocoaNSMenuItem *>(item); - Q_ASSERT_X(nativeItem, qPrintable(__FUNCTION__), "Triggered menu item is not a QCocoaNSMenuItem."); - auto *platformItem = nativeItem.platformMenuItem; - // Menu-holding items also get a target to play nicely - // with NSMenuValidation but should not trigger. - if (!platformItem || platformItem->menu()) - return; - - QScopedScopeLevelCounter scopeLevelCounter(QGuiApplicationPrivate::instance()->threadData); - QGuiApplicationPrivate::modifier_buttons = [QNSView convertKeyModifiers:[NSEvent modifierFlags]]; - - static QMetaMethod activatedSignal = QMetaMethod::fromSignal(&QCocoaMenuItem::activated); - activatedSignal.invoke(platformItem, Qt::QueuedConnection); + auto *appDelegate = [QCocoaApplicationDelegate sharedDelegate]; + [appDelegate qt_itemFired:item]; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector |