From 7ebf5540cc5a5b7c0d0d12a75172b02c3e9a15d7 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sun, 29 Aug 2004 10:04:36 +0000 Subject: [PATCH] focus and border refreshes etc corrected git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28947 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/mac/carbon/window.cpp | 68 ++++++++++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/src/mac/carbon/window.cpp b/src/mac/carbon/window.cpp index ba16258f53..df76db2af7 100644 --- a/src/mac/carbon/window.cpp +++ b/src/mac/carbon/window.cpp @@ -693,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() ) @@ -1111,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 ; } @@ -1597,21 +1638,11 @@ 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() ) - { - r.left -= GetParent()->MacGetLeftBorderSize() ; - r.top -= GetParent()->MacGetTopBorderSize() ; - r.right -= GetParent()->MacGetLeftBorderSize() ; - r.bottom -= GetParent()->MacGetTopBorderSize() ; - } -#endif bool vis = m_peer->IsVisible(); int outerBorder = MacGetLeftBorderSize() ; if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() ) - outerBorder = 4 ; + outerBorder += 4 ; if ( vis && ( outerBorder > 0 ) ) { @@ -1636,10 +1667,8 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height) InsetRect( &rect , -outerBorder , -outerBorder ) ; RectRgn( updateOuter , &rect ) ; DiffRgn( updateOuter , updateInner ,updateOuter ) ; - wxPoint parentorig(0,0); - GetParent()->MacWindowToRootWindow( &parentorig.x , &parentorig.y ) ; - parent -= GetParent()->GetClientAreaOrigin() ; - OffsetRgn( updateOuter , -parentorig.x , -parentorig.y ) ; + + OffsetRgn( updateOuter , -parent.x , -parent.y ) ; UnionRgn( updateOuter , updateTotal , updateTotal ) ; GetParent()->m_peer->SetNeedsDisplay( true , updateTotal ) ; @@ -2169,7 +2198,9 @@ void wxWindowMac::OnEraseBackground(wxEraseEvent& event) } else #endif - event.GetDC()->Clear() ; + { + event.GetDC()->Clear() ; + } } void wxWindowMac::OnNcPaint( wxNcPaintEvent& event ) @@ -2813,8 +2844,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 ) ; } } } -- 2.45.2