Endless WM_PAINT loop fix

Rein Klazes rklazes at xs4all.nl
Sat Dec 27 12:09:24 CST 2003


Hi,

WordStar for Windows V2 does in its message handler of WM_PAINT:

        rgn=CreateRectRgn(0,0,0,0)
        BeginPaint(hWnd,...)
        <simple drawing code>
        EndPaint(hWnd,...)
        InvalidateRgn(hWnd,rgn,0);

In Wine the InvalidateRgn will create an update region for the window
and set a paint flag. This leads of course to an endless stream of
useless WM_PAINT messages. In Windows this case is probably optimized
away and gives no problems.

Changelog:
	windows		: painting.c
	If RedrawWindow is called with the RDW_INVALIDATE flag, if the 	
	UpdateRgn parameter is a NULLREGION and the Window has no update
	region yet, ignore the call.

Rein. 
-- 
Rein Klazes
rklazes at xs4all.nl
-------------- next part --------------
--- wine/./windows/painting.c	2003-12-05 07:35:15.000000000 +0100
+++ mywine/./windows/painting.c	2003-12-27 18:51:28.000000000 +0100
@@ -781,6 +781,26 @@
 	}
         dump_rdw_flags(flags);
     }
+    
+    /* this little optimization is actually needed by a program
+     * that does on receving WM_PAINT message:
+     *   rgn=CreateRectRgn(0,0,0,0)
+     *   BeginPaint(hWnd,...)
+     *   ...
+     *   EndPaint(hWnd,...)
+     *   InvalidateRgn(hWnd,rgn,0);
+     *
+     *   The following prevents that the Windows gets an update-
+     *   region and/or that it will generate new WM_PAINT message
+     *   endlessly.
+     */
+    if( flags & RDW_INVALIDATE &&
+            hrgnUpdate &&
+            !wndPtr->hrgnUpdate &&
+            NULLREGION == GetRgnBox(hrgnUpdate, &r) ) {
+        WIN_ReleaseWndPtr(wndPtr);
+        return TRUE;
+    }
 
     /* prepare an update region in window coordinates */
 


More information about the wine-patches mailing list