diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index 2389f7faa6..8d6c1bbc67 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -537,12 +537,43 @@ private: } private: + /* Returns true if and only if the peer handles the event. */ + static bool tryPassingKeyEventToPeer (NSMenuItem* item) + { + auto* e = [NSApp currentEvent]; + + if ([e type] != NSEventTypeKeyDown && [e type] != NSEventTypeKeyUp) + return false; + + const auto triggeredByShortcut = [[e charactersIgnoringModifiers] isEqualToString: [item keyEquivalent]] + && ([e modifierFlags] & ~(NSUInteger) 0xFFFF) == [item keyEquivalentModifierMask]; + + if (! triggeredByShortcut) + return false; + + if (auto* focused = juce::Component::getCurrentlyFocusedComponent()) + { + if (auto* peer = dynamic_cast (focused->getPeer())) + { + if ([e type] == NSEventTypeKeyDown) + peer->redirectKeyDown (e); + else + peer->redirectKeyUp (e); + + return true; + } + } + + return false; + } + static void menuItemInvoked (id self, SEL, NSMenuItem* item) { - auto owner = getIvar (self, "owner"); + if (tryPassingKeyEventToPeer (item)) + return; if (auto* juceItem = getJuceClassFromNSObject ([item representedObject])) - owner->invoke (*juceItem, static_cast ([item tag])); + getIvar (self, "owner")->invoke (*juceItem, static_cast ([item tag])); } static void menuNeedsUpdate (id self, SEL, NSMenu* menu)