Fix redraw problems when making a child of a child visible

Troy Rollo wine at troy.rollo.name
Tue Jun 24 20:38:52 CDT 2003


We have some situations in which we have a child window that in turn has multiple children will have only one visible at a time. Each of those children has its own children. When hiding one of the second level children, then showing another, the newly displayed window and it's children are not redrawn.

I have not investigated whether a simpler case may also trigger the bug.

Index: dlls/x11drv/winpos.c
===================================================================
RCS file: /home/wine/wine/dlls/x11drv/winpos.c,v
retrieving revision 1.64
diff -u -r1.64 winpos.c
--- dlls/x11drv/winpos.c	18 Feb 2003 23:24:58 -0000	1.64
+++ dlls/x11drv/winpos.c	25 Jun 2003 01:18:37 -0000
@@ -353,7 +353,8 @@
                               win->rectClient.bottom - win->rectClient.top );
 
     /* if the client rect didn't move we don't need to repaint it all */
-    if (old_client_rect->left == win->rectClient.left &&
+    if (old_client_rect &&
+	old_client_rect->left == win->rectClient.left &&
         old_client_rect->top == win->rectClient.top)
     {
         RECT rc;
@@ -886,6 +887,7 @@
     RECT oldWindowRect, oldClientRect;
     UINT wvrFlags = 0;
     BOOL bChangePos;
+    BOOL bStartedVisible;
 
     TRACE( "hwnd %p, swp (%i,%i)-(%i,%i) flags %08x\n",
            winpos->hwnd, winpos->x, winpos->y,
@@ -904,6 +906,8 @@
 
     if (!(wndPtr = WIN_FindWndPtr( winpos->hwnd ))) return FALSE;
 
+    bStartedVisible = (wndPtr->flags & WS_VISIBLE) != 0;
+
     TRACE("\tcurrent (%ld,%ld)-(%ld,%ld), style %08x\n",
           wndPtr->rectWindow.left, wndPtr->rectWindow.top,
           wndPtr->rectWindow.right, wndPtr->rectWindow.bottom, (unsigned)wndPtr->dwStyle );
@@ -1015,7 +1019,7 @@
         expose_covered_parent_area( wndPtr, &oldWindowRect );
 
     if (wndPtr->dwStyle & WS_VISIBLE)
-        expose_covered_window_area( wndPtr, &oldClientRect, winpos->flags & SWP_FRAMECHANGED );
+        expose_covered_window_area( wndPtr, bStartedVisible ? &oldClientRect : 0, winpos->flags & SWP_FRAMECHANGED );
 
     WIN_ReleaseWndPtr(wndPtr);
 




More information about the wine-patches mailing list