CGWindowLevel GetWindowLevel() const { return m_macWindowLevel; }
void RestoreWindowLevel();
+
+ static WX_NSResponder GetNextFirstResponder() ;
protected :
CGWindowLevel m_macWindowLevel;
WXWindow m_macWindow;
// wx native implementation
//
+static NSResponder* s_nextFirstResponder = NULL;
+
@interface wxNSWindow : NSWindow
{
}
- (void) sendEvent:(NSEvent *)event;
- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
- (void)noResponderFor: (SEL) selector;
+- (BOOL)makeFirstResponder:(NSResponder *)aResponder;
@end
@implementation wxNSWindow
return YES;
}
+- (BOOL)makeFirstResponder:(NSResponder *)aResponder
+{
+ s_nextFirstResponder = aResponder;
+ BOOL retval = [super makeFirstResponder:aResponder];
+ s_nextFirstResponder = nil;
+ return retval;
+}
+
@end
@interface wxNSPanel : NSPanel
- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen;
- (void)noResponderFor: (SEL) selector;
- (void)sendEvent:(NSEvent *)event;
+- (BOOL)makeFirstResponder:(NSResponder *)aResponder;
@end
@implementation wxNSPanel
}
}
+- (BOOL)makeFirstResponder:(NSResponder *)aResponder
+{
+ s_nextFirstResponder = aResponder;
+ BOOL retval = [super makeFirstResponder:aResponder];
+ s_nextFirstResponder = nil;
+ return retval;
+}
+
@end
[m_macWindow setLevel:m_macWindowLevel];
}
+WX_NSResponder wxNonOwnedWindowCocoaImpl::GetNextFirstResponder()
+{
+ return s_nextFirstResponder;
+}
+
+
//
//
//
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
if ( impl )
{
- impl->DoNotifyFocusEvent( false, NULL );
+ NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder();
+ NSView* otherView = [responder isKindOfClass:[NSView class]] ? (NSView*)responder : nil;
+
+ wxWidgetImpl* otherWindow = impl->FindFromWXWidget(otherView);
+ impl->DoNotifyFocusEvent( false, otherWindow );
}
}
wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self );
if ( impl )
{
- impl->DoNotifyFocusEvent( false, NULL );
+ NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder();
+ NSView* otherView = [responder isKindOfClass:[NSView class]] ? (NSView*)responder : nil;
+
+ wxWidgetImpl* otherWindow = impl->FindFromWXWidget(otherView);
+ impl->DoNotifyFocusEvent( false, otherWindow );
}
}
timpl->SetInternalSelection(range.location, range.location + range.length);
}
- impl->DoNotifyFocusEvent( false, NULL );
+ NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder();
+ NSView* otherView = [responder isKindOfClass:[NSView class]] ? (NSView*)responder : nil;
+
+ wxWidgetImpl* otherWindow = impl->FindFromWXWidget(otherView);
+ impl->DoNotifyFocusEvent( false, otherWindow );
}
}
@end
{
wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
BOOL r = superimpl(slf, (SEL)_cmd);
- // get the current focus after running resignFirstResponder
- // note that this value isn't reliable, it might return the same view that
- // is resigning
- NSView* otherView = FindFocus();
+
+ NSResponder * responder = wxNonOwnedWindowCocoaImpl::GetNextFirstResponder();
+ NSView* otherView = [responder isKindOfClass:[NSView class]] ? (NSView*)responder : nil;
+
wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
// CS: the fix for #12267 leads to missed focus events like in #14938 , as #12267 doesn't seem to happen anymore even