]> git.saurik.com Git - wxWidgets.git/blobdiff - src/univ/winuniv.cpp
Override GetPixelSize on OS X as the base impl creates a wxScreenDC each time, which...
[wxWidgets.git] / src / univ / winuniv.cpp
index c0b7f7a02cdcf3d381dee5cecd94e55f67e0878b..b1147291741290a84d9bd63baed89c1995c4ce25 100644 (file)
@@ -391,34 +391,36 @@ void wxWindow::DoDraw(wxControlRenderer * WXUNUSED(renderer))
 {
 }
 
-void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient)
+void wxWindow::Refresh(bool eraseBackground, const wxRect *rect)
 {
-    wxRect rectWin;
-    wxPoint pt = GetClientAreaOrigin();
+    wxRect rectClient; // the same rectangle in client coordinates
+    wxPoint origin = GetClientAreaOrigin();
 
     wxSize size = GetClientSize();
 
-    if ( rectClient )
+    if ( rect )
     {
-        rectWin = *rectClient;
+        // the rectangle passed as argument is in client coordinates
+        rectClient = *rect;
 
         // don't refresh anything beyond the client area (scrollbars for
         // example)
-        if ( rectWin.GetRight() > size.x )
-            rectWin.SetRight(size.x);
-        if ( rectWin.GetBottom() > size.y )
-            rectWin.SetBottom(size.y);
+        if ( rectClient.GetRight() > size.x )
+            rectClient.SetRight(size.x);
+        if ( rectClient.GetBottom() > size.y )
+            rectClient.SetBottom(size.y);
 
-        rectWin.Offset(pt);
     }
     else // refresh the entire client area
     {
-        rectWin.x = pt.x;
-        rectWin.y = pt.y;
-        rectWin.width = size.x;
-        rectWin.height = size.y;
+        // x,y is already set to 0 by default
+        rectClient.SetSize(size);
     }
 
+    // convert refresh rectangle to window coordinates:
+    wxRect rectWin(rectClient);
+    rectWin.Offset(origin);
+
     // debugging helper
 #ifdef WXDEBUG_REFRESH
     static bool s_refreshDebug = false;
@@ -440,16 +442,30 @@ void wxWindow::Refresh(bool eraseBackground, const wxRect *rectClient)
     wxWindowNative::Refresh(eraseBackground, &rectWin);
 
     // Refresh all sub controls if any.
-    wxWindowList::compatibility_iterator node = GetChildren().GetFirst();
-    while ( node )
+    wxWindowList& children = GetChildren();
+    for ( wxWindowList::iterator i = children.begin(); i != children.end(); ++i )
     {
-        wxWindow *win = node->GetData();
-        // Only refresh sub controls when it is visible
-        // and when it is in the update region.
-        if(!win->IsKindOf(CLASSINFO(wxTopLevelWindow)) && win->IsShown() && wxRegion(rectWin).Contains(win->GetRect()) != wxOutRegion)
-            win->Refresh(eraseBackground, &rectWin);
+        wxWindow *child = *i;
+        // only refresh subcontrols if they are visible:
+        if ( child->IsTopLevel() || !child->IsShown() || child->IsFrozen() )
+            continue;
 
-        node = node->GetNext();
+        // ...and when the subcontrols are in the update region:
+        wxRect childrect(child->GetRect());
+        childrect.Intersect(rectClient);
+        if ( childrect.IsEmpty() )
+            continue;
+
+        // refresh the subcontrol now:
+        childrect.Offset(-child->GetPosition());
+        // NB: We must call wxWindowNative version because we need to refresh
+        //     the entire control, not just its client area, and this is why we
+        //     don't account for child client area origin here neither. Also
+        //     note that we don't pass eraseBackground to the child, but use
+        //     true instead: this is because we can't be sure that
+        //     eraseBackground=false is safe for children as well and not only
+        //     for the parent.
+        child->wxWindowNative::Refresh(eraseBackground, &childrect);
     }
 }
 
@@ -704,8 +720,6 @@ void wxWindow::DoGetClientSize(int *width, int *height) const
     if ( m_renderer )
         rectBorder = m_renderer->GetBorderDimensions(GetBorder());
 
-    bool inside = m_renderer->AreScrollbarsInsideBorder();
-
     if ( width )
     {
 #if wxUSE_SCROLLBAR
@@ -714,17 +728,8 @@ void wxWindow::DoGetClientSize(int *width, int *height) const
             w -= m_scrollbarVert->GetSize().x;
 #endif // wxUSE_SCROLLBAR
 
-        // if we don't have scrollbar or if it is outside the border (and not
-        // blended into it), take account of the right border as well
-        if (
-#if wxUSE_SCROLLBAR
-             !m_scrollbarVert ||
-#endif // wxUSE_SCROLLBAR
-             inside )
-            w -= rectBorder.width;
-
-        // and always account for the left border
-        *width = w - rectBorder.x;
+        // account for the left and right borders
+        *width = w - rectBorder.x - rectBorder.width;
 
         // we shouldn't return invalid width
         if ( *width < 0 )
@@ -738,14 +743,7 @@ void wxWindow::DoGetClientSize(int *width, int *height) const
             h -= m_scrollbarHorz->GetSize().y;
 #endif // wxUSE_SCROLLBAR
 
-        if (
-#if wxUSE_SCROLLBAR
-            !m_scrollbarHorz ||
-#endif // wxUSE_SCROLLBAR
-            inside )
-            h -= rectBorder.height;
-
-        *height = h - rectBorder.y;
+        *height = h - rectBorder.y - rectBorder.height;
 
         // we shouldn't return invalid height
         if ( *height < 0 )
@@ -763,29 +761,18 @@ void wxWindow::DoSetClientSize(int width, int height)
     // and the scrollbars (as they may be offset into the border, use the
     // scrollbar position, not size - this supposes that PositionScrollbars()
     // had been called before)
-    bool inside = m_renderer->AreScrollbarsInsideBorder();
     wxSize size = GetSize();
 #if wxUSE_SCROLLBAR
     if ( m_scrollbarVert )
         width += size.x - m_scrollbarVert->GetPosition().x;
 #endif // wxUSE_SCROLLBAR
-    if (
-#if wxUSE_SCROLLBAR
-        !m_scrollbarVert ||
-#endif // wxUSE_SCROLLBAR
-        inside )
-        width += rectBorder.width;
+    width += rectBorder.width;
 
 #if wxUSE_SCROLLBAR
     if ( m_scrollbarHorz )
         height += size.y - m_scrollbarHorz->GetPosition().y;
 #endif // wxUSE_SCROLLBAR
-    if (
-#if wxUSE_SCROLLBAR
-        !m_scrollbarHorz ||
-#endif // wxUSE_SCROLLBAR
-        inside )
-        height += rectBorder.height;
+    height += rectBorder.height;
 
     wxWindowNative::DoSetClientSize(width, height);
 }