Alexandre Julliard : user32: Fix handling of NULL paint struct in BeginPaint.
Alexandre Julliard
julliard at winehq.org
Tue Nov 27 14:30:51 CST 2012
Module: wine
Branch: master
Commit: ab2cac4815e0ef4dbacea2708b121a22180438c3
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ab2cac4815e0ef4dbacea2708b121a22180438c3
Author: Alexandre Julliard <julliard at 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);
}
More information about the wine-cvs
mailing list