X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/36d7f54e469d8b6d877eeb89252159de4f1dcff7..1a0f14e16aab3d0c830da88203d7660f8771bcbc:/src/mac/carbon/window.cpp diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index 82980b387f..f24329b607 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -24,6 +24,7 @@ #include "wx/layout.h" #include "wx/dialog.h" #include "wx/scrolbar.h" +#include "wx/scrolwin.h" #include "wx/statbox.h" #include "wx/button.h" #include "wx/settings.h" @@ -36,6 +37,8 @@ #include "wx/log.h" #include "wx/geometry.h" #include "wx/textctrl.h" +#include "wx/laywin.h" +#include "wx/splitter.h" #include "wx/toolbar.h" #include "wx/dc.h" @@ -690,6 +693,39 @@ wxWindowMac::~wxWindowMac() m_isBeingDeleted = TRUE; + if ( m_peer ) + { + // deleting a window while it is shown invalidates the region occupied by border or + // focus + int outerBorder = MacGetLeftBorderSize() ; + if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() ) + outerBorder += 4 ; + + if ( IsShown() && ( outerBorder > 0 ) ) + { + // as the borders are drawn on the parent we have to properly invalidate all these areas + RgnHandle updateInner = NewRgn() , updateOuter = NewRgn() , updateTotal = NewRgn() ; + + Rect rect ; + + m_peer->GetRect( &rect ) ; + RectRgn( updateInner , &rect ) ; + InsetRect( &rect , -outerBorder , -outerBorder ) ; + RectRgn( updateOuter , &rect ) ; + DiffRgn( updateOuter , updateInner ,updateOuter ) ; + wxPoint parent(0,0); + GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; + parent -= GetParent()->GetClientAreaOrigin() ; + OffsetRgn( updateOuter , -parent.x , -parent.y ) ; + CopyRgn( updateOuter , updateTotal ) ; + + GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; + DisposeRgn(updateOuter) ; + DisposeRgn(updateInner) ; + DisposeRgn(updateTotal) ; + } + } + #ifndef __WXUNIVERSAL__ // VS: make sure there's no wxFrame with last focus set to us: for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) @@ -920,7 +956,7 @@ void wxWindowMac::MacUpdateControlFont() bool wxWindowMac::SetFont(const wxFont& font) { - bool retval = !wxWindowBase::SetFont( font ) ; + bool retval = wxWindowBase::SetFont( font ) ; MacUpdateControlFont() ; @@ -985,9 +1021,11 @@ void wxWindowMac::SetFocus() { if ( AcceptsFocus() ) { -#if !TARGET_API_MAC_OSX + wxWindow* former = FindFocus() ; -#endif + if ( former == this ) + return ; + OSStatus err = m_peer->SetFocus( kControlFocusNextPart ) ; // as we cannot rely on the control features to find out whether we are in full keyboard mode, we can only // leave in case of an error @@ -1106,6 +1144,14 @@ bool wxWindowMac::MacGetBoundsForControl(const wxPoint& pos, if ( adjustOrigin ) AdjustForParentClientOrigin( x , y ) ; +#if TARGET_API_MAC_OSX + // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border + if ( ! GetParent()->IsTopLevel() ) + { + x -= GetParent()->MacGetLeftBorderSize() ; + y -= GetParent()->MacGetTopBorderSize() ; + } +#endif return true ; } @@ -1592,21 +1638,49 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) { // we don't adjust twice for the origin Rect r = wxMacGetBoundsForControl(this , wxPoint( actualX,actualY), wxSize( actualWidth, actualHeight ) , false ) ; -#if TARGET_API_MAC_OSX - // this is in window relative coordinate, as this parent may have a border, its physical position is offset by this border - if ( ! GetParent()->IsTopLevel() ) + bool vis = m_peer->IsVisible(); + + int outerBorder = MacGetLeftBorderSize() ; + if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() ) + outerBorder += 4 ; + + if ( vis && ( outerBorder > 0 ) ) { - r.left -= GetParent()->MacGetLeftBorderSize() ; - r.top -= GetParent()->MacGetTopBorderSize() ; - r.right -= GetParent()->MacGetLeftBorderSize() ; - r.bottom -= GetParent()->MacGetTopBorderSize() ; + // as the borders are drawn on the parent we have to properly invalidate all these areas + RgnHandle updateInner = NewRgn() , updateOuter = NewRgn() , updateTotal = NewRgn() ; + + Rect rect ; + + m_peer->GetRect( &rect ) ; + RectRgn( updateInner , &rect ) ; + InsetRect( &rect , -outerBorder , -outerBorder ) ; + RectRgn( updateOuter , &rect ) ; + DiffRgn( updateOuter , updateInner ,updateOuter ) ; + wxPoint parent(0,0); + GetParent()->MacWindowToRootWindow( &parent.x , &parent.y ) ; + parent -= GetParent()->GetClientAreaOrigin() ; + OffsetRgn( updateOuter , -parent.x , -parent.y ) ; + CopyRgn( updateOuter , updateTotal ) ; + + rect = r ; + RectRgn( updateInner , &rect ) ; + InsetRect( &rect , -outerBorder , -outerBorder ) ; + RectRgn( updateOuter , &rect ) ; + DiffRgn( updateOuter , updateInner ,updateOuter ) ; + + OffsetRgn( updateOuter , -parent.x , -parent.y ) ; + UnionRgn( updateOuter , updateTotal , updateTotal ) ; + + GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; + DisposeRgn(updateOuter) ; + DisposeRgn(updateInner) ; + DisposeRgn(updateTotal) ; } -#endif - bool vis = m_peer->IsVisible(); // the HIViewSetFrame call itself should invalidate the areas, but when testing with the UnicodeTextCtrl it does not ! if ( vis ) m_peer->SetVisibility( false , true ) ; + m_peer->SetRect( &r ) ; if ( vis ) m_peer->SetVisibility( true , true ) ; @@ -2059,7 +2133,8 @@ void wxWindowMac::Freeze() #if TARGET_API_MAC_OSX if ( !m_frozenness++ ) { - m_peer->SetDrawingEnabled( false ) ; + if ( m_peer && m_peer->Ok() ) + m_peer->SetDrawingEnabled( false ) ; } #endif } @@ -2072,8 +2147,11 @@ void wxWindowMac::Thaw() if ( !--m_frozenness ) { - m_peer->SetDrawingEnabled( true ) ; - m_peer->InvalidateWithChildren() ; + if ( m_peer && m_peer->Ok() ) + { + m_peer->SetDrawingEnabled( true ) ; + m_peer->InvalidateWithChildren() ; + } } #endif } @@ -2124,7 +2202,9 @@ void wxWindowMac::OnEraseBackground(wxEraseEvent& event) } else #endif - event.GetDC()->Clear() ; + { + event.GetDC()->Clear() ; + } } void wxWindowMac::OnNcPaint( wxNcPaintEvent& event ) @@ -2198,9 +2278,24 @@ void wxWindowMac::MacPaintBorders( int left , int top ) if( IsTopLevel() ) return ; - int w , h ; - GetSize( &w , &h ) ; - Rect rect = { top , left , h + top , w + left } ; + Rect rect ; + m_peer->GetRect( &rect ) ; + InsetRect( &rect, -MacGetLeftBorderSize() , -MacGetTopBorderSize() ) ; + + if ( !IsTopLevel() ) + { + wxTopLevelWindowMac* top = MacGetTopLevelWindow(); + if (top) + { + wxPoint pt(0,0) ; + wxMacControl::Convert( &pt , GetParent()->m_peer , top->m_peer ) ; + rect.left += pt.x ; + rect.right += pt.x ; + rect.top += pt.y ; + rect.bottom += pt.y ; + } + } + if (HasFlag(wxRAISED_BORDER) || HasFlag( wxSUNKEN_BORDER) || HasFlag(wxDOUBLE_BORDER) ) { Rect srect = rect ; @@ -2576,7 +2671,11 @@ wxTopLevelWindowMac* wxWindowMac::MacGetTopLevelWindow() const } wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) { - + // includeOuterStructures is true if we try to draw somthing like a focus ring etc. + // also a window dc uses this, in this case we only clip in the hierarchy for hard + // borders like a scrollwindow, splitter etc otherwise we end up in a paranoia having + // to add focus borders everywhere + Rect r ; RgnHandle visRgn = NewRgn() ; RgnHandle tempRgn = NewRgn() ; @@ -2629,12 +2728,19 @@ wxRegion wxWindowMac::MacGetVisibleRegion( bool includeOuterStructures ) parent->MacWindowToRootWindow( &x, &y ) ; MacRootWindowToWindow( &x , &y ) ; - SetRectRgn( tempRgn , - x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() , - x + size.x - parent->MacGetRightBorderSize(), - y + size.y - parent->MacGetBottomBorderSize()) ; + if ( !includeOuterStructures || ( + parent->IsKindOf( CLASSINFO( wxScrolledWindow ) ) || + parent->IsKindOf( CLASSINFO( wxSashLayoutWindow ) ) || + ( parent->GetParent() && parent->GetParent()->IsKindOf( CLASSINFO( wxSplitterWindow ) ) ) + ) ) + { + SetRectRgn( tempRgn , + x + parent->MacGetLeftBorderSize() , y + parent->MacGetTopBorderSize() , + x + size.x - parent->MacGetRightBorderSize(), + y + size.y - parent->MacGetBottomBorderSize()) ; - SectRgn( visRgn , tempRgn , visRgn ) ; + SectRgn( visRgn , tempRgn , visRgn ) ; + } if ( parent->IsTopLevel() ) break ; child = parent ; @@ -2742,8 +2848,9 @@ bool wxWindowMac::MacDoRedraw( WXHRGN updatergnr , long time ) wxWindowDC dc(this) ; dc.SetClippingRegion(wxRegion(updatergn)); wxMacPortSetter helper(&dc) ; - OffsetRect( &childRect , dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y ) ; - DrawThemeFocusRect( &childRect , true ) ; + Rect r = childRect ; + OffsetRect( &r , dc.m_macLocalOrigin.x , dc.m_macLocalOrigin.y ) ; + DrawThemeFocusRect( &r , true ) ; } } }