]> git.saurik.com Git - wxWidgets.git/commitdiff
focus handling streamlined
authorStefan Csomor <csomor@advancedconcepts.ch>
Wed, 25 Mar 2009 10:24:51 +0000 (10:24 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Wed, 25 Mar 2009 10:24:51 +0000 (10:24 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59835 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/osx/carbon/private.h
include/wx/osx/core/private.h
src/osx/carbon/window.cpp
src/osx/cocoa/window.mm
src/osx/window_osx.cpp

index 2d0f7ea0a81f912ed1e091459ddde67ab24c6b7f..7a10d3bf29578ffd9bfc8175474dd1bb394ca766 100644 (file)
@@ -38,7 +38,6 @@ typedef SInt32 SRefCon;
 bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec);
 #endif
 
-WXDLLIMPEXP_CORE wxWindowMac * wxFindWindowFromWXWidget(WXWidget inControl );
 // TODO REMOVE WXDLLIMPEXP_CORE wxNonOwnedWindow* wxFindWindowFromWXWindow( WXWindow inWindow );
 
 #endif // wxUSE_GUI
index b514797d8959b93b67a06041f2f595128a45b1c7..ca5405dcf84c62b6e2d3c09e7db21374e528f299 100644 (file)
@@ -32,6 +32,8 @@ wxString WXDLLIMPEXP_CORE wxMacMakeStringFromPascal( const unsigned char * from
 
 #if wxUSE_GUI
 
+WXDLLIMPEXP_CORE wxWindowMac * wxFindWindowFromWXWidget(WXWidget inControl );
+
 #if wxOSX_USE_IPHONE
 #include <CoreGraphics/CoreGraphics.h>
 #else
@@ -258,6 +260,8 @@ public :
     
     static void         Associate( WXWidget control, wxWidgetImpl *impl );
     
+    static WXWidget     FindFocus();
+    
     // static creation methods, must be implemented by all toolkits
     
     static wxWidgetImplType*    CreateUserPane( wxWindowMac* wxpeer, 
index e4ff772b8f15d43f681460227fda7d0e7ecfa011..b1293cfa17480cd14e096ca066c354b2d7d7ec0f 100644 (file)
 #define wxMAC_DEBUG_REDRAW 0
 #endif
 
+// Get the window with the focus
+WXWidget wxWidgetImpl::FindFocus()
+{
+    ControlRef control = NULL ;
+    GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
+    return control;
+}
+
 // ---------------------------------------------------------------------------
 // Carbon Events
 // ---------------------------------------------------------------------------
index 399db3f0df48659f8632a597d9b5a27ed5a693e7..cf91905014597db29faffaef5c3477cc0b2f96dd 100644 (file)
 
 #include <objc/objc-runtime.h>
 
+// Get the window with the focus
+
+WXWidget wxWidgetImpl::FindFocus()
+{
+    NSView* focusedView = nil;
+    NSWindow* keyWindow = [[NSApplication sharedApplication] keyWindow];
+    if ( keyWindow != nil )
+    {
+        NSResponder* responder = [keyWindow firstResponder];
+        if ( [responder isKindOfClass:[NSTextView class]] && 
+            [keyWindow fieldEditor:NO forObject:nil] != nil )
+        {
+            focusedView = [(NSTextView*)responder delegate];
+        }
+        else
+        {
+            if ( [responder isKindOfClass:[NSView class]] )
+                focusedView = (NSView*) responder;
+        }
+    }
+    return focusedView;
+}
+
 NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin )
 {
     int x, y, w, h ;
@@ -47,7 +70,6 @@ NSRect wxOSXGetFrameForControl( wxWindowMac* window , const wxPoint& pos , const
     NSTrackingRectTag rectTag;
 }
 
-- (BOOL) canBecomeKeyView;
 // the tracking tag is needed to track mouse enter / exit events 
 - (void) setTrackingTag: (NSTrackingRectTag)tag;
 - (NSTrackingRectTag) trackingTag;
@@ -439,11 +461,6 @@ void SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEvent )
     }
 }
 
-- (BOOL) canBecomeKeyView
-{
-    return YES;
-}
-
 - (void) setTrackingTag: (NSTrackingRectTag)tag
 {
     rectTag = tag;
@@ -793,22 +810,26 @@ bool wxWidgetCocoaImpl::performKeyEquivalent(WX_NSEvent event, WXWidget slf, voi
 
 bool wxWidgetCocoaImpl::acceptsFirstResponder(WXWidget slf, void *_cmd)
 {
-    // FIXME: We need to find a way to query AcceptsFocus here, but when we do it
-    // it calls native APIs which lead us back here and into a loop.
-    wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
-    return superimpl(slf, (SEL)_cmd);
+    if ( m_wxPeer->MacIsUserPane() )
+        return m_wxPeer->AcceptsFocus();
+    else
+    {
+        wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
+        return superimpl(slf, (SEL)_cmd);
+    }
 }
 
 bool wxWidgetCocoaImpl::becomeFirstResponder(WXWidget slf, void *_cmd)
 {
     wxOSX_FocusHandlerPtr superimpl = (wxOSX_FocusHandlerPtr) [[slf superclass] instanceMethodForSelector:(SEL)_cmd];
     // get the current focus before running becomeFirstResponder
-    NSResponder* currentResponder = [[NSApp keyWindow] firstResponder]; 
-    NSView* otherView = (currentResponder != nil && [currentResponder isKindOfClass:[NSView class]]) ? (NSView*) currentResponder : NULL; 
+    NSView* otherView = FindFocus(); 
     wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
     BOOL r = superimpl(slf, (SEL)_cmd);
     if ( r )
+    {
         DoNotifyFocusEvent( true, otherWindow );
+    }
     return r;
 }
 
@@ -817,11 +838,14 @@ 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
-    NSResponder* currentResponder = [[NSApp keyWindow] firstResponder]; 
-    NSView* otherView = (currentResponder != nil && [currentResponder isKindOfClass:[NSView class]]) ? (NSView*) currentResponder : NULL; 
+    NSView* otherView = FindFocus(); 
     wxWidgetImpl* otherWindow = FindFromWXWidget(otherView);
-    if ( r )
+    // 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)
+    {
         DoNotifyFocusEvent( false, otherWindow );
+    }
     return r;
 }
 
@@ -1163,7 +1187,7 @@ bool wxWidgetCocoaImpl::CanFocus() const
 
 bool wxWidgetCocoaImpl::HasFocus() const
 {
-    return ( [[m_osxView window] firstResponder] == m_osxView );
+    return ( FindFocus() == m_osxView );
 }
 
 bool wxWidgetCocoaImpl::SetFocus() 
index 4f99e89bc1c600b59c61ab82fe3995bb1ecd8969..da9e32a5e154ed361e526f518488a4bd767dd518 100644 (file)
@@ -200,10 +200,6 @@ WXWidget wxWindowMac::GetHandle() const
     return NULL;
 }
 
-//
-// TODO END move to window_osx.cpp
-//
-
 // ---------------------------------------------------------------------------
 // Utility Routines to move between different coordinate systems
 // ---------------------------------------------------------------------------
@@ -1515,16 +1511,9 @@ void wxWindowMac::MacOnScroll( wxScrollEvent &event )
     }
 }
 
-// Get the window with the focus
 wxWindow *wxWindowBase::DoFindFocus()
 {
-#if wxOSX_USE_CARBON
-    ControlRef control ;
-    GetKeyboardFocus( GetUserFocusWindow() , &control ) ;
-    return wxFindWindowFromWXWidget( (WXWidget) control ) ;
-#else
-    return NULL;
-#endif
+    return wxFindWindowFromWXWidget(wxWidgetImpl::FindFocus());
 }
 
 void wxWindowMac::OnInternalIdle()
@@ -2006,7 +1995,10 @@ void wxWindowMac::MacRepositionScrollBars()
 
 bool wxWindowMac::AcceptsFocus() const
 {
-    return m_peer->CanFocus() && wxWindowBase::AcceptsFocus();
+    if ( MacIsUserPane() )
+        return wxWindowBase::AcceptsFocus();
+    else
+        return m_peer->CanFocus();
 }
 
 void wxWindowMac::MacSuperChangedPosition()