diff --git a/modules/juce_events/native/juce_mac_MessageManager.mm b/modules/juce_events/native/juce_mac_MessageManager.mm index 1940f0b8be..65b35193ad 100644 --- a/modules/juce_events/native/juce_mac_MessageManager.mm +++ b/modules/juce_events/native/juce_mac_MessageManager.mm @@ -29,6 +29,9 @@ AppFocusChangeCallback appFocusChangeCallback = nullptr; typedef bool (*CheckEventBlockedByModalComps) (NSEvent*); CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr; +typedef void (*MenuTrackingBeganCallback)(); +MenuTrackingBeganCallback menuTrackingBeganCallback = nullptr; + //============================================================================== struct AppDelegate { @@ -38,6 +41,11 @@ public: static AppDelegateClass cls; delegate = [cls.createInstance() init]; + NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; + + [center addObserver: delegate selector: @selector (trackingBegan:) + name: NSMenuDidBeginTrackingNotification object: nil]; + if (JUCEApplicationBase::isStandaloneApp()) { [NSApp setDelegate: delegate]; @@ -49,8 +57,6 @@ public: } else { - NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; - [center addObserver: delegate selector: @selector (applicationDidResignActive:) name: NSApplicationDidResignActiveNotification object: NSApp]; @@ -104,6 +110,7 @@ private: addMethod (@selector (applicationDidResignActive:), applicationDidResignActive, "v@:@"); addMethod (@selector (applicationWillUnhide:), applicationWillUnhide, "v@:@"); addMethod (@selector (broadcastMessageCallback:), broadcastMessageCallback, "v@:@"); + addMethod (@selector (trackingBegan:), trackingBegan, "v@:@"); addMethod (@selector (dummyMethod), dummyMethod, "v@:"); registerClass(); @@ -169,6 +176,12 @@ private: MessageManager::getInstance()->deliverBroadcastMessage (messageString); } + static void trackingBegan (id /*self*/, SEL, NSNotification*) + { + if (menuTrackingBeganCallback != nullptr) + (*menuTrackingBeganCallback)(); + } + static void dummyMethod (id /*self*/, SEL) {} // (used as a way of running a dummy thread) private: diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index f9d9b0f74c..49c6fd9b14 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -595,8 +595,18 @@ const PopupMenu* MenuBarModel::getMacExtraAppleItemsMenu() ? JuceMainMenuHandler::instance->extraAppleMenuItems.get() : nullptr; } +typedef void (*MenuTrackingBeganCallback)(); +extern MenuTrackingBeganCallback menuTrackingBeganCallback; + +static void mainMenuTrackingBegan() +{ + PopupMenu::dismissAllActiveMenus(); +} + void juce_initialiseMacMainMenu() { + menuTrackingBeganCallback = mainMenuTrackingBegan; + if (JuceMainMenuHandler::instance == nullptr) MainMenuHelpers::rebuildMainMenu (nullptr); }