Can someone help me with why this patch isn't correct enough?
Thanks,
Clinton
Clinton Stimpson wrote:
> When hiding windows, WM_ERASEBKGND is supposed to be sent to the parent.
> The message will now be sent with this patch. An existing test was
> modified to also check for all parent messages.
> Partial fix for bug #6006
>
> Thanks,
> Clinton Stimpson
>
> ChangeLog:
> user32: send erase to parent when hiding children
>
>
>
> ------------------------------------------------------------------------
>
> Index: dlls/user32/winpos.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/user32/winpos.c,v
> retrieving revision 1.5
> diff -u -r1.5 winpos.c
> --- dlls/user32/winpos.c 26 Apr 2007 15:25:46 -0000 1.5
> +++ dlls/user32/winpos.c 23 Jun 2007 22:24:43 -0000
> @@ -1566,6 +1566,7 @@
> {
> RECT newWindowRect, newClientRect, valid_rects[2];
> UINT orig_flags;
> + HWND parent = GetAncestor( winpos->hwnd, GA_PARENT );
>
> orig_flags = winpos->flags;
>
> @@ -1592,7 +1593,7 @@
>
> if((winpos->flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER)
> {
> - if (GetAncestor( winpos->hwnd, GA_PARENT ) == GetDesktopWindow())
> + if (parent == GetDesktopWindow())
> winpos->hwndInsertAfter = SWP_DoOwnedPopups( winpos->hwnd, winpos->hwndInsertAfter );
> }
>
> @@ -1613,6 +1614,14 @@
> RedrawWindow( winpos->hwnd, NULL, NULL, rdw_flags );
> }
>
> + /* erase the parent for child windows that are being hidden */
> + if(parent && (orig_flags & SWP_HIDEWINDOW))
> + {
> + UINT rdw_flags = RDW_ERASE | RDW_INVALIDATE;
> + if ( !(orig_flags & SWP_DEFERERASE) ) rdw_flags |= RDW_ERASENOW;
> + RedrawWindow( parent, &newClientRect, NULL, rdw_flags );
> + }
> +
> if( winpos->flags & SWP_HIDEWINDOW )
> HideCaret(winpos->hwnd);
> else if (winpos->flags & SWP_SHOWWINDOW)
> Index: dlls/user32/tests/msg.c
> ===================================================================
> RCS file: /home/wine/wine/dlls/user32/tests/msg.c,v
> retrieving revision 1.33
> diff -u -r1.33 msg.c
> --- dlls/user32/tests/msg.c 21 Jun 2007 14:49:29 -0000 1.33
> +++ dlls/user32/tests/msg.c 23 Jun 2007 22:24:43 -0000
> @@ -727,6 +727,15 @@
> { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
> { 0 }
> };
> +/* ShowWindow(SW_HIDE) for a visible child window checking all parent events*/
> +static const struct message WmHideChildSeq2[] = {
> + { WM_SHOWWINDOW, sent|wparam, 0 },
> + { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE },
> + { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
> + { WM_ERASEBKGND, sent|parent },
> + { WM_WINDOWPOSCHANGED, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
> + { 0 }
> +};
> /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
> * for a not visible child window
> */
> @@ -3982,8 +3991,10 @@
> ShowWindow(hchild, SW_SHOW);
> ok_sequence(WmShowChildSeq, "ShowWindow(SW_SHOW):child", FALSE);
>
> + log_all_parent_messages++;
> ShowWindow(hchild, SW_HIDE);
> - ok_sequence(WmHideChildSeq, "ShowWindow(SW_HIDE):child", FALSE);
> + ok_sequence(WmHideChildSeq2, "ShowWindow(SW_HIDE):child", FALSE);
> + log_all_parent_messages--;
>
> ShowWindow(hchild, SW_SHOW);
> ok_sequence(WmShowChildSeq, "ShowWindow(SW_SHOW):child", FALSE);
>
>
> ------------------------------------------------------------------------
>
>