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