From f43784dc5b3aa318f46ddaa53506bfd1b38c5757 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 27 Jan 2021 17:21:58 +0000 Subject: [PATCH] macOS: Propagate focus loss message when resigning key window status and only grab focus if window can become the key window --- .../native/juce_mac_NSViewComponentPeer.mm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 64de41c93f..26ca406308 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -1068,6 +1068,11 @@ public: grabFocus(); } + void resignKeyWindow() + { + viewFocusLoss(); + } + bool windowShouldClose() { if (! isValidPeer (this)) @@ -1432,7 +1437,7 @@ public: void grabFocus() override { - if (window != nil) + if (window != nil && [window canBecomeKeyWindow]) { [window makeKeyWindow]; [window makeFirstResponder: view]; @@ -2064,6 +2069,7 @@ struct JuceNSWindowClass : public ObjCClass addMethod (@selector (canBecomeKeyWindow), canBecomeKeyWindow, "c@:"); addMethod (@selector (canBecomeMainWindow), canBecomeMainWindow, "c@:"); addMethod (@selector (becomeKeyWindow), becomeKeyWindow, "v@:"); + addMethod (@selector (resignKeyWindow), resignKeyWindow, "v@:"); addMethod (@selector (windowShouldClose:), windowShouldClose, "c@:@"); addMethod (@selector (constrainFrameRect:toScreen:), constrainFrameRect, @encode (NSRect), "@:", @encode (NSRect), "@"); addMethod (@selector (windowWillResize:toSize:), windowWillResize, @encode (NSSize), "@:@", @encode (NSSize)); @@ -2125,6 +2131,14 @@ private: } } + static void resignKeyWindow (id self, SEL) + { + sendSuperclassMessage (self, @selector (resignKeyWindow)); + + if (auto* owner = getOwner (self)) + owner->resignKeyWindow(); + } + static BOOL windowShouldClose (id self, SEL, id /*window*/) { auto* owner = getOwner (self);