]> git.saurik.com Git - wxWidgets.git/commitdiff
focus and border refreshes etc corrected
authorStefan Csomor <csomor@advancedconcepts.ch>
Sun, 29 Aug 2004 10:04:36 +0000 (10:04 +0000)
committerStefan Csomor <csomor@advancedconcepts.ch>
Sun, 29 Aug 2004 10:04:36 +0000 (10:04 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28947 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/mac/carbon/window.cpp

index ba16258f5366dd2a637565d34efe79efa8a1a465..df76db2af761ceb5be1185ca314542a04da296cf 100644 (file)
@@ -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 ) ;
             }
         }
     }