From: Rodrigo Rivas Subject: [4/4] user32: Fix error handling in {Begin, , End}DeferWindowPos() (try 2) Message-Id: Date: Wed, 2 Sep 2015 15:38:08 +0200 --- dlls/user32/tests/win.c | 16 +++++----------- dlls/user32/winpos.c | 14 +++++++++----- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c index 6105752..1c5addd 100644 --- a/dlls/user32/tests/win.c +++ b/dlls/user32/tests/win.c @@ -8226,7 +8226,7 @@ static void test_bogus_DeferWindowPos(void) } else { - todo_wine ok(hdwp2 == NULL, "DeferWindowPos accepted a bogus HWND\n"); + ok(hdwp2 == NULL, "DeferWindowPos accepted a bogus HWND\n"); if (!hdwp2) { err = GetLastError(); @@ -8235,17 +8235,14 @@ static void test_bogus_DeferWindowPos(void) } } res = EndDeferWindowPos(hdwp); - todo_wine ok(res, "EndDeferWindowPos with bogus HWND failed\n"); + ok(res, "EndDeferWindowPos with bogus HWND failed\n"); for (i = 0; i < 3; ++i) { if (!hwnds[i]) continue; GetWindowRect(hwnds[i], &rect); - if (i == 2) - todo_wine ok(rect.top == 100, "Deferred movement with bogus HWND failed\n"); - else - ok(rect.top == 100, "Deferred movement with bogus HWND failed\n"); + ok(rect.top == 100, "Deferred movement with bogus HWND failed\n"); } for (i = 0; i < 3; ++i) @@ -8283,17 +8280,14 @@ static void test_destroyed_DeferWindowPos(void) hwnds[1] = NULL; res = EndDeferWindowPos(hdwp); - todo_wine ok(res, "EndDeferWindowPos with destroyed HWND failed\n"); + ok(res, "EndDeferWindowPos with destroyed HWND failed\n"); for (i = 0; i < 3; ++i) { if (!hwnds[i]) continue; GetWindowRect(hwnds[i], &rect); - if (i == 2) - todo_wine ok(rect.top == 100, "Deferred movement with destroyed HWND failed\n"); - else - ok(rect.top == 100, "Deferred movement with destroyed HWND failed\n"); + ok(rect.top == 100, "Deferred movement with destroyed HWND failed\n"); } for (i = 0; i < 3; ++i) diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index f92a3dc..7cb3a4f 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -2349,6 +2349,11 @@ HDWP WINAPI DeferWindowPos( HDWP hdwp, HWND hwnd, HWND hwndAfter, hwnd = WIN_GetFullHandle( hwnd ); if (is_desktop_window( hwnd )) return 0; + if (!IsWindow( hwnd )) + { + SetLastError( ERROR_INVALID_WINDOW_HANDLE ); + return 0; + } if (!(pDWP = get_user_handle_ptr( hdwp, USER_DWP ))) return 0; if (pDWP == OBJ_OTHER_PROCESS) @@ -2418,7 +2423,6 @@ BOOL WINAPI EndDeferWindowPos( HDWP hdwp ) { DWP *pDWP; WINDOWPOS *winpos; - BOOL res = TRUE; int i; TRACE("%p\n", hdwp); @@ -2430,20 +2434,20 @@ BOOL WINAPI EndDeferWindowPos( HDWP hdwp ) return FALSE; } - for (i = 0, winpos = pDWP->winPos; res && i < pDWP->actualCount; i++, winpos++) + for (i = 0, winpos = pDWP->winPos; i < pDWP->actualCount; i++, winpos++) { TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n", winpos->hwnd, winpos->hwndInsertAfter, winpos->x, winpos->y, winpos->cx, winpos->cy, winpos->flags); if (WIN_IsCurrentThread( winpos->hwnd )) - res = USER_SetWindowPos( winpos ); + USER_SetWindowPos( winpos ); else - res = SendMessageW( winpos->hwnd, WM_WINE_SETWINDOWPOS, 0, (LPARAM)winpos ); + SendMessageW( winpos->hwnd, WM_WINE_SETWINDOWPOS, 0, (LPARAM)winpos ); } HeapFree( GetProcessHeap(), 0, pDWP->winPos ); HeapFree( GetProcessHeap(), 0, pDWP ); - return res; + return TRUE; }