diff --git a/include/wx/osx/cocoa/private.h b/include/wx/osx/cocoa/private.h index 8394ebb6ff..ea782e9fae 100644 --- a/include/wx/osx/cocoa/private.h +++ b/include/wx/osx/cocoa/private.h @@ -111,6 +111,8 @@ public : virtual void SetNeedsDisplay( const wxRect* where = NULL ) wxOVERRIDE; virtual bool GetNeedsDisplay() const wxOVERRIDE; + virtual void EnableFocusRing(bool enabled) wxOVERRIDE; + virtual void SetDrawingEnabled(bool enabled) wxOVERRIDE; virtual bool CanFocus() const wxOVERRIDE; diff --git a/include/wx/osx/core/private.h b/include/wx/osx/core/private.h index ba57b86157..eb27786c47 100644 --- a/include/wx/osx/core/private.h +++ b/include/wx/osx/core/private.h @@ -301,8 +301,7 @@ public : virtual void SetNeedsDisplay( const wxRect* where = NULL ) = 0; virtual bool GetNeedsDisplay() const = 0; - virtual bool NeedsFocusRect() const; - virtual void SetNeedsFocusRect( bool needs ); + virtual void EnableFocusRing(bool WXUNUSED(enabled)) {} virtual bool NeedsFrame() const; virtual void SetNeedsFrame( bool needs ); @@ -598,7 +597,6 @@ protected : bool m_wantsUserKey; bool m_wantsUserMouse; wxWindowMac* m_wxPeer; - bool m_needsFocusRect; bool m_needsFrame; bool m_shouldSendEvents; diff --git a/include/wx/osx/window.h b/include/wx/osx/window.h index e327b0a55b..f761a598bc 100644 --- a/include/wx/osx/window.h +++ b/include/wx/osx/window.h @@ -157,6 +157,7 @@ public: void MacOnScroll( wxScrollEvent&event ); virtual bool AcceptsFocus() const wxOVERRIDE; + virtual void EnableVisibleFocus(bool enabled) wxOVERRIDE; virtual bool IsDoubleBuffered() const wxOVERRIDE { return true; } diff --git a/include/wx/window.h b/include/wx/window.h index 8de7570428..de692b3708 100644 --- a/include/wx/window.h +++ b/include/wx/window.h @@ -767,6 +767,9 @@ public: // call this when the return value of AcceptsFocus() changes virtual void SetCanFocus(bool WXUNUSED(canFocus)) { } + // call to customize visible focus indicator if possible in the port + virtual void EnableVisibleFocus(bool WXUNUSED(enabled)) { } + // navigates inside this window bool NavigateIn(int flags = wxNavigationKeyEvent::IsForward) { return DoNavigateIn(flags); } diff --git a/interface/wx/window.h b/interface/wx/window.h index 3776331ddc..9d1d235c9f 100644 --- a/interface/wx/window.h +++ b/interface/wx/window.h @@ -540,6 +540,22 @@ public: */ virtual void SetCanFocus(bool canFocus); + /** + Enables or disables visible indication of keyboard focus. + + By default, controls behave in platform-appropriate way and show focus + in the same way native applications do. In some very rare circumstances + it may be desirable to change the default (notably multiline text + controls don't normally have a focus indicator on Mac), which this + method allows. It should only be used if you have a good understanding + of the native platform's guidelines and user expectations. + + This method is only implemented on Mac. + + @since 3.1.5 + */ + virtual void EnableVisibleFocus(bool enable); + /** This sets the window to receive keyboard input. diff --git a/src/generic/grideditors.cpp b/src/generic/grideditors.cpp index 7a328d9b97..dc01ce4465 100644 --- a/src/generic/grideditors.cpp +++ b/src/generic/grideditors.cpp @@ -460,10 +460,6 @@ void wxGridCellTextEditor::DoCreate(wxWindow* parent, text->SetMargins(0, 0); m_control = text; -#ifdef __WXOSX__ - wxWidgetImpl* impl = m_control->GetPeer(); - impl->SetNeedsFocusRect(false); -#endif // set max length allowed in the textctrl, if the parameter was set if ( m_maxChars != 0 ) { diff --git a/src/osx/cocoa/textctrl.mm b/src/osx/cocoa/textctrl.mm index 1e46578226..3029096b03 100644 --- a/src/osx/cocoa/textctrl.mm +++ b/src/osx/cocoa/textctrl.mm @@ -1590,7 +1590,6 @@ wxWidgetImplType* wxWidgetImpl::CreateTextControl( wxTextCtrl* wxpeer, v = [[wxNSTextScrollView alloc] initWithFrame:r]; wxNSTextViewControl* t = new wxNSTextViewControl( wxpeer, v, style ); c = t; - c->SetNeedsFocusRect( true ); t->SetStringValue(str); } diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm index 80a0838032..813bb1face 100644 --- a/src/osx/cocoa/window.mm +++ b/src/osx/cocoa/window.mm @@ -3849,10 +3849,6 @@ void wxWidgetCocoaImpl::DoNotifyFocusLost() void wxWidgetCocoaImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* otherWindow) { wxWindow* thisWindow = GetWXPeer(); - if ( thisWindow->MacGetTopLevelWindow() && NeedsFocusRect() ) - { - thisWindow->MacInvalidateBorders(); - } if ( receivedFocus ) { @@ -3925,6 +3921,11 @@ void wxWidgetCocoaImpl::SetFlipped(bool flipped) #endif +void wxWidgetCocoaImpl::EnableFocusRing(bool enabled) +{ + [m_osxView setFocusRingType:enabled ? NSFocusRingTypeExterior : NSFocusRingTypeNone]; +} + void wxWidgetCocoaImpl::SetDrawingEnabled(bool enabled) { if ( [m_osxView window] == nil ) diff --git a/src/osx/iphone/window.mm b/src/osx/iphone/window.mm index 607c92f839..50bdd3ff7c 100644 --- a/src/osx/iphone/window.mm +++ b/src/osx/iphone/window.mm @@ -642,10 +642,6 @@ void wxWidgetIPhoneImpl::InstallEventHandler( WXWidget control ) void wxWidgetIPhoneImpl::DoNotifyFocusEvent(bool receivedFocus, wxWidgetImpl* otherWindow) { wxWindow* thisWindow = GetWXPeer(); - if ( thisWindow->MacGetTopLevelWindow() && NeedsFocusRect() ) - { - thisWindow->MacInvalidateBorders(); - } if ( receivedFocus ) { diff --git a/src/osx/window_osx.cpp b/src/osx/window_osx.cpp index 46fa8188a1..6e349163ff 100644 --- a/src/osx/window_osx.cpp +++ b/src/osx/window_osx.cpp @@ -938,9 +938,6 @@ void wxWindowMac::MacInvalidateBorders() int outerBorder = MacGetLeftBorderSize() ; - if ( GetPeer()->NeedsFocusRect() ) - outerBorder += 4 ; - if ( outerBorder == 0 ) return ; @@ -1578,8 +1575,6 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right #if wxOSX_USE_COCOA_OR_CARBON { - const bool hasFocus = GetPeer()->NeedsFocusRect() && HasFocus(); - CGRect cgrect = CGRectMake( tx-1 , ty-1 , tw+2 , th+2 ) ; @@ -1594,7 +1589,6 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right info.version = 0 ; info.kind = 0 ; info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ; - info.isFocused = hasFocus ; if ( HasFlag(wxRAISED_BORDER) || HasFlag(wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) { @@ -1607,11 +1601,6 @@ void wxWindowMac::MacPaintBorders( int WXUNUSED(leftOrigin) , int WXUNUSED(right HIThemeDrawFrame( &cgrect , &info , cgContext , kHIThemeOrientationNormal ) ; } } - - if ( hasFocus ) - { - HIThemeDrawFocusRect( &cgrect , true , cgContext , kHIThemeOrientationNormal ) ; - } } #endif // wxOSX_USE_COCOA_OR_CARBON } @@ -2182,6 +2171,11 @@ bool wxWindowMac::AcceptsFocus() const return GetPeer()->CanFocus(); } +void wxWindowMac::EnableVisibleFocus(bool enabled) +{ + GetPeer()->EnableFocusRing(enabled); +} + void wxWindowMac::MacSuperChangedPosition() { // only window-absolute structures have to be moved i.e. controls @@ -2746,20 +2740,9 @@ void wxWidgetImpl::Init() m_wantsUserKey = false; m_wantsUserMouse = false; m_wxPeer = NULL; - m_needsFocusRect = false; m_needsFrame = true; } -void wxWidgetImpl::SetNeedsFocusRect( bool needs ) -{ - m_needsFocusRect = needs; -} - -bool wxWidgetImpl::NeedsFocusRect() const -{ - return m_needsFocusRect; -} - void wxWidgetImpl::SetNeedsFrame( bool needs ) { m_needsFrame = needs;