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