X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5646fba6b09d067405c514a5bfac6ccbd98357ce..a188ac2988b6fedeead7a809124b8eaa2290c020:/src/osx/cocoa/window.mm diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 713fce435b..e5e4b7e3b4 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -33,27 +33,39 @@ // Get the window with the focus -WXWidget wxWidgetImpl::FindFocus() +NSView* GetViewFromResponder( NSResponder* responder ) { - NSView* focusedView = nil; - NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow]; - if ( keyWindow != nil ) + NSView* view = nil; + if ( [responder isKindOfClass:[NSTextView class]] ) { - NSResponder* responder = [keyWindow firstResponder]; - if ( [responder isKindOfClass:[NSTextView class]] && - [keyWindow fieldEditor:NO forObject:nil] != nil ) - { - focusedView = [(NSTextView*)responder delegate]; - } + NSView* delegate = [(NSTextView*)responder delegate]; + if ( [delegate isKindOfClass:[NSTextField class] ] ) + view = delegate; else - { - if ( [responder isKindOfClass:[NSView class]] ) - focusedView = (NSView*) responder; - } + view = (NSView*) responder; } + else + { + if ( [responder isKindOfClass:[NSView class]] ) + view = (NSView*) responder; + } + return view; +} + +NSView* GetFocusedViewInWindow( NSWindow* keyWindow ) +{ + NSView* focusedView = nil; + if ( keyWindow != nil ) + focusedView = GetViewFromResponder([keyWindow firstResponder]); + return focusedView; } +WXWidget wxWidgetImpl::FindFocus() +{ + return GetFocusedViewInWindow( [[NSApplication sharedApplication] keyWindow] ); +} + NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin ) { int x, y, w, h ; @@ -583,6 +595,8 @@ BOOL wxOSX_performDragOperation( id self, SEL _cmd, id sender ) return impl->performDragOperation(sender, self, _cmd) ? YES:NO ; } +#endif + void wxOSX_mouseEvent(NSView* self, SEL _cmd, NSEvent *event) { wxWidgetCocoaImpl* impl = (wxWidgetCocoaImpl* ) wxWidgetImpl::FindFromWXWidget( self ); @@ -835,8 +849,6 @@ bool wxWidgetCocoaImpl::performDragOperation(void* s, WXWidget WXUNUSED(slf), vo return result != wxDragNone; } -#endif - typedef void (*wxOSX_TextEventHandlerPtr)(NSView* self, SEL _cmd, NSString *event); typedef void (*wxOSX_EventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); typedef BOOL (*wxOSX_PerformKeyEventHandlerPtr)(NSView* self, SEL _cmd, NSEvent *event); @@ -848,14 +860,18 @@ void wxWidgetCocoaImpl::mouseEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { if ( !DoHandleMouseEvent(event) ) { - wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; - superimpl(slf, (SEL)_cmd, event); + // for plain NSView mouse events would propagate to parents otherwise + if (!m_wxPeer->MacIsUserPane()) + { + wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + superimpl(slf, (SEL)_cmd, event); + } } } void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) { - if ( [[slf window] firstResponder] != slf || !DoHandleKeyEvent(event) ) + if ( GetFocusedViewInWindow([slf window]) != slf || m_hasEditor || !DoHandleKeyEvent(event) ) { wxOSX_EventHandlerPtr superimpl = (wxOSX_EventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; superimpl(slf, (SEL)_cmd, event); @@ -864,10 +880,10 @@ void wxWidgetCocoaImpl::keyEvent(WX_NSEvent event, WXWidget slf, void *_cmd) void wxWidgetCocoaImpl::insertText(NSString* text, WXWidget slf, void *_cmd) { - if (m_lastKeyDownEvent && !DoHandleCharEvent(m_lastKeyDownEvent, text) ) + if ( m_lastKeyDownEvent==NULL || m_hasEditor || !DoHandleCharEvent(m_lastKeyDownEvent, text) ) { - wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; - superimpl(slf, (SEL)_cmd, text); + wxOSX_TextEventHandlerPtr superimpl = (wxOSX_TextEventHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; + superimpl(slf, (SEL)_cmd, text); } m_lastKeyDownEvent = NULL; } @@ -895,12 +911,14 @@ bool wxWidgetCocoaImpl::becomeFirstResponder(WXWidget slf, void *_cmd) wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd]; // get the current focus before running becomeFirstResponder NSView* otherView = FindFocus(); + wxWidgetImpl* otherWindow = FindFromWXWidget(otherView); BOOL r = superimpl(slf, (SEL)_cmd); if ( r ) { DoNotifyFocusEvent( true, otherWindow ); } + return r; } @@ -909,11 +927,13 @@ bool wxWidgetCocoaImpl::resignFirstResponder(WXWidget slf, void *_cmd) 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(); wxWidgetImpl* otherWindow = FindFromWXWidget(otherView); // NSTextViews have an editor as true responder, therefore the might get the - // resign notification if their editor takes over, don't trigger any event hen - if ( r && otherWindow != this) + // resign notification if their editor takes over, don't trigger any event then + if ( r && !m_hasEditor) { DoNotifyFocusEvent( false, otherWindow ); } @@ -1063,7 +1083,7 @@ void wxOSXCocoaClassAddWXMethods(Class c) wxOSX_CLASS_ADD_METHOD(c, @selector(insertText:), (IMP) wxOSX_insertText, "v@:@" ) - wxOSX_CLASS_ADD_METHOD(c, @selector(performKeyEquivalent:), (IMP) wxOSX_performKeyEquivalent, "v@:@" ) + wxOSX_CLASS_ADD_METHOD(c, @selector(performKeyEquivalent:), (IMP) wxOSX_performKeyEquivalent, "c@:@" ) wxOSX_CLASS_ADD_METHOD(c, @selector(acceptsFirstResponder), (IMP) wxOSX_acceptsFirstResponder, "c@:" ) wxOSX_CLASS_ADD_METHOD(c, @selector(becomeFirstResponder), (IMP) wxOSX_becomeFirstResponder, "c@:" ) @@ -1121,6 +1141,7 @@ void wxWidgetCocoaImpl::Init() m_osxView = NULL; m_isFlipped = true; m_lastKeyDownEvent = NULL; + m_hasEditor = false; } wxWidgetCocoaImpl::~wxWidgetCocoaImpl() @@ -1267,6 +1288,7 @@ bool wxWidgetCocoaImpl::SetFocus() return false; [[m_osxView window] makeFirstResponder: m_osxView] ; + [[m_osxView window] makeKeyAndOrderFront:nil] ; return true; } @@ -1484,11 +1506,17 @@ bool wxWidgetCocoaImpl::DoHandleKeyEvent(NSEvent *event) // this will fire higher level events, like insertText, to help // us handle EVT_CHAR, etc. - if ([event type] == NSKeyDown) + if ( !m_hasEditor && [event type] == NSKeyDown) { m_lastKeyDownEvent = event; if ( !result ) - [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + { + if ( [m_osxView isKindOfClass:[NSScrollView class] ] ) + [[(NSScrollView*)m_osxView documentView] interpretKeyEvents:[NSArray arrayWithObject:event]]; + else + [m_osxView interpretKeyEvents:[NSArray arrayWithObject:event]]; + result = true; + } } return result; }