]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/window.cpp
redraw forced for size changes (layout for measuring is simpler than word-wrapping...
[wxWidgets.git] / src / mac / window.cpp
index 1e7584ac8d197b064d9f64d18aa6a82ce8f239e2..8fad9699bc916d1c04c295ac515513beba896c3a 100644 (file)
@@ -638,12 +638,40 @@ void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
                 oldRgn = NewRgn() ;
                 newRgn = NewRgn() ;
                 diffRgn = NewRgn() ;
+                
+                // invalidate the differences between the old and the new area
+                
                 SetRectRgn(oldRgn , oldPos.x , oldPos.y , oldPos.x + m_width , oldPos.y + m_height ) ;
                 SetRectRgn(newRgn , newPos.x , newPos.y , newPos.x + actualWidth , newPos.y + actualHeight ) ;
                 DiffRgn( newRgn , oldRgn , diffRgn ) ;
                 InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ;
                 DiffRgn( oldRgn , newRgn , diffRgn ) ;
                 InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ;
+                
+                // we also must invalidate the border areas, someone might optimize this one day to invalidate only the really
+                // changing pixels...
+                
+                if ( MacGetLeftBorderSize() != 0 || MacGetRightBorderSize() != 0 || 
+                       MacGetTopBorderSize() != 0 || MacGetBottomBorderSize() != 0 )
+                {
+                       RgnHandle innerOldRgn, innerNewRgn ;
+                       innerOldRgn = NewRgn() ;
+                       innerNewRgn = NewRgn() ;
+                       
+                       SetRectRgn(innerOldRgn , oldPos.x + MacGetLeftBorderSize()  , oldPos.y + MacGetTopBorderSize() , 
+                               oldPos.x + m_width - MacGetRightBorderSize() , oldPos.y + m_height - MacGetBottomBorderSize() ) ;
+                   DiffRgn( oldRgn , innerOldRgn , diffRgn ) ;
+                       InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ;
+
+                       SetRectRgn(innerNewRgn , newPos.x + MacGetLeftBorderSize()  , newPos.y + MacGetTopBorderSize() , 
+                               newPos.x + actualWidth - MacGetRightBorderSize() , newPos.y + actualHeight - MacGetBottomBorderSize() ) ;
+                   DiffRgn( newRgn , innerNewRgn , diffRgn ) ;
+                       InvalWindowRgn( (WindowRef) MacGetRootWindow() , diffRgn ) ;
+                       
+                       DisposeRgn( innerOldRgn ) ;
+                       DisposeRgn( innerNewRgn ) ;
+                }
+                
                 DisposeRgn(oldRgn) ;
                 DisposeRgn(newRgn) ;
                 DisposeRgn(diffRgn) ;
@@ -818,7 +846,7 @@ void wxWindowMac::MacSuperEnabled( bool enabled )
 
 bool wxWindowMac::MacIsReallyShown() const
 {
-    if ( m_isShown && (m_parent != NULL) ) {
+    if ( m_isShown && (m_parent != NULL && !IsTopLevel() ) ) {
         return m_parent->MacIsReallyShown();
     }
     return m_isShown;
@@ -1250,7 +1278,16 @@ void wxWindowMac::ScrollWindow(int dx, int dy, const wxRect *rect)
         child->GetPosition( &x, &y );
         int w,h;
         child->GetSize( &w, &h );
-        child->SetSize( x+dx, y+dy, w, h );
+        if (rect)
+        {
+            wxRect rc(x,y,w,h);
+            if (rect->Intersects(rc))
+                child->SetSize( x+dx, y+dy, w, h );
+        }
+        else
+        {
+            child->SetSize( x+dx, y+dy, w, h );                
+        }        
     }
     
     Update() ;