Module: wine Branch: master Commit: ab2cac4815e0ef4dbacea2708b121a22180438c3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab2cac4815e0ef4dbacea2708b...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Nov 27 20:52:25 2012 +0100
user32: Fix handling of NULL paint struct in BeginPaint.
---
dlls/user32/painting.c | 24 ++++++++++++++++-------- dlls/user32/tests/msg.c | 20 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-)
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c index b2ddfe6..a6fb23f 100644 --- a/dlls/user32/painting.c +++ b/dlls/user32/painting.c @@ -893,20 +893,28 @@ static HWND fix_caret(HWND hWnd, const RECT *scroll_rect, INT dx, INT dy, HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT *lps ) { HRGN hrgn; + HDC hdc; + BOOL erase; + RECT rect; UINT flags = UPDATE_NONCLIENT | UPDATE_ERASE | UPDATE_PAINT | UPDATE_INTERNALPAINT | UPDATE_NOCHILDREN;
- if (!lps) return 0; - HideCaret( hwnd );
if (!(hrgn = send_ncpaint( hwnd, NULL, &flags ))) return 0;
- lps->fErase = send_erase( hwnd, flags, hrgn, &lps->rcPaint, &lps->hdc ); + erase = send_erase( hwnd, flags, hrgn, &rect, &hdc );
- TRACE("hdc = %p box = (%s), fErase = %d\n", - lps->hdc, wine_dbgstr_rect(&lps->rcPaint), lps->fErase); + TRACE("hdc = %p box = (%s), fErase = %d\n", hdc, wine_dbgstr_rect(&rect), erase);
- return lps->hdc; + if (!lps) + { + release_dc( hwnd, hdc, TRUE ); + return 0; + } + lps->fErase = erase; + lps->rcPaint = rect; + lps->hdc = hdc; + return hdc; }
@@ -915,10 +923,10 @@ HDC WINAPI BeginPaint( HWND hwnd, PAINTSTRUCT *lps ) */ BOOL WINAPI EndPaint( HWND hwnd, const PAINTSTRUCT *lps ) { - if (!lps) return FALSE; - release_dc( hwnd, lps->hdc, TRUE ); ShowCaret( hwnd ); flush_window_surfaces( FALSE ); + if (!lps) return FALSE; + release_dc( hwnd, lps->hdc, TRUE ); return TRUE; }
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 9816f13..ac3ba16 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -9093,6 +9093,26 @@ static void test_DispatchMessage(void) if (++count > 10) break; } } + + flush_sequence(); + RedrawWindow( hwnd, &rect, 0, RDW_INVALIDATE|RDW_ERASE|RDW_FRAME ); + count = 0; + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) + { + if (msg.message != WM_PAINT) DispatchMessage( &msg ); + else + { + HDC hdc; + + flush_sequence(); + hdc = BeginPaint( hwnd, NULL ); + ok( !hdc, "got valid hdc %p from BeginPaint\n", hdc ); + ok( !EndPaint( hwnd, NULL ), "EndPaint succeeded\n" ); + ok_sequence( WmDispatchPaint, "WmDispatchPaint", FALSE ); + ok( !count, "Got multiple WM_PAINTs\n" ); + if (++count > 10) break; + } + } DestroyWindow(hwnd); }