From ce7bfd6a3f9258e2edb0b056e076f71978c1cc52 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 31 Jul 2007 20:32:15 +0200 Subject: [PATCH] user32: Erase parent window when child is hidden. From a patch by Clinton Stimpson. --- dlls/user32/painting.c | 2 +- dlls/user32/tests/msg.c | 2 +- dlls/user32/user_private.h | 1 + dlls/user32/winpos.c | 18 ++++++++++++------ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c index 30dddae6f06..862c75f7371 100644 --- a/dlls/user32/painting.c +++ b/dlls/user32/painting.c @@ -280,7 +280,7 @@ static BOOL send_erase( HWND hwnd, UINT flags, HRGN client_rgn, * * Implementation of RDW_ERASENOW behavior. */ -static void erase_now( HWND hwnd, UINT rdw_flags ) +void erase_now( HWND hwnd, UINT rdw_flags ) { HWND child = 0; HRGN hrgn; diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 04dca3fb0a4..930821fea59 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -3994,7 +3994,7 @@ static void test_messages(void) /* check parent messages too */ log_all_parent_messages++; ShowWindow(hchild, SW_HIDE); - ok_sequence(WmHideChildSeq2, "ShowWindow(SW_HIDE):child", TRUE); + ok_sequence(WmHideChildSeq2, "ShowWindow(SW_HIDE):child", FALSE); log_all_parent_messages--; ShowWindow(hchild, SW_SHOW); diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index d6eac1790bb..67be8f5fb7d 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -213,6 +213,7 @@ extern HBRUSH SYSCOLOR_55AABrush; extern BOOL CLIPBOARD_ReleaseOwner(void); extern BOOL FOCUS_MouseActivate( HWND hwnd ); extern BOOL HOOK_IsHooked( INT id ); +extern void erase_now( HWND hwnd, UINT rdw_flags ); extern LRESULT call_current_hook( HHOOK hhook, INT code, WPARAM wparam, LPARAM lparam ); extern LRESULT MSG_SendInternalMessageTimeout( DWORD dest_pid, DWORD dest_tid, UINT msg, WPARAM wparam, LPARAM lparam, diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index adf897e589e..a13753c7461 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -1604,13 +1604,19 @@ BOOL USER_SetWindowPos( WINDOWPOS * winpos ) &newWindowRect, &newClientRect, orig_flags, valid_rects )) return FALSE; - /* Windows doesn't redraw a window if it is being just moved */ - if (!(orig_flags & SWP_SHOWWINDOW) && - (winpos->flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOGEOMETRYCHANGE) + /* erase parent if hiding child */ + if (!(orig_flags & SWP_DEFERERASE)) { - UINT rdw_flags = RDW_FRAME | RDW_ERASE; - if ( !(orig_flags & SWP_DEFERERASE) ) rdw_flags |= RDW_ERASENOW; - RedrawWindow( winpos->hwnd, NULL, NULL, rdw_flags ); + if (orig_flags & SWP_HIDEWINDOW) + { + HWND parent = GetAncestor( winpos->hwnd, GA_PARENT ); + erase_now( parent, RDW_NOCHILDREN ); + } + else if (!(orig_flags & SWP_SHOWWINDOW) && + (winpos->flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOGEOMETRYCHANGE) + { + erase_now( winpos->hwnd, 0 ); + } } if( winpos->flags & SWP_HIDEWINDOW )