--- a/WinWorkstation.st Fri Nov 21 16:39:44 2003 +0100
+++ b/WinWorkstation.st Mon Nov 24 17:22:41 2003 +0100
@@ -45,6 +45,7 @@
#define xxHANDLE_VIEWGRAVITY /* not yet working */
#define COMPRESS_WINDOWPOSCHANGED
+#define USE_DRAW_MUTEX
#define xxLATE_GENERATE_EXPOSE /* get update region from stx thread */
#define xxNO_CLEAR_FOR_WM_PAINT /* do not fill exposed areas with bgColor */
#define xxLATE_CLEAR_FOR_WM_PAINT /* fill exposed areas with bgColor in ST/X thread (instead of in event-thread) */
@@ -828,9 +829,25 @@
#endif
static HANDLE hEventQMutex;
static HANDLE hEventFreeListMutex;
+
#ifdef USE_PAINT_MUTEX
static HANDLE hPaintMutex;
-#endif
+# define AQUIRE_PAINT_MUTEX { WaitForSingleObject(hPaintMutex, 100L); }
+# define RELEASE_PAINT_MUTEX { ReleaseMutex(hPaintMutex); }
+#else
+# define AQUIRE_PAINT_MUTEX { /* nothing */ }
+# define RELEASE_PAINT_MUTEX { /* nothing */ }
+#endif
+
+#ifdef USE_DRAW_MUTEX
+static HANDLE hDrawMutex;
+# define AQUIRE_DRAW_MUTEX { WaitForSingleObject(hDrawMutex, 100L); }
+# define RELEASE_DRAW_MUTEX { ReleaseMutex(hDrawMutex); }
+#else
+# define AQUIRE_DRAW_MUTEX { /* nothing */ }
+# define RELEASE_DRAW_MUTEX { /* nothing */ }
+#endif
+
static HANDLE hCreateEvent;
static HANDLE hNeverTriggered;
static HANDLE hInputEvent;
@@ -2051,9 +2068,7 @@
int isPrivateBrush = 0;
# ifdef CACHE_LAST_WM_PAINT_DC
-# ifdef USE_PAINT_MUTEX
- WaitForSingleObject(hPaintMutex, 100L);
-# endif
+ AQUIRE_PAINT_MUTEX;
if (last_wm_paint_dc && (last_wm_paint_win == hWnd)) {
dc = last_wm_paint_dc;
@@ -2148,8 +2163,8 @@
ReleaseDC(hWnd, dc);
# endif
-# if defined(CACHE_LAST_WM_PAINT_DC) && defined(USE_PAINT_MUTEX)
- ReleaseMutex(hPaintMutex);
+# if defined(CACHE_LAST_WM_PAINT_DC)
+ RELEASE_PAINT_MUTEX
# endif
}
@@ -2971,7 +2986,9 @@
# ifdef LATE_GENERATE_EXPOSE
enqEvent(ENQ_AT_END, 0, hWnd, __WM_PAINT, 0, 0, 0, 0, 0, EV_NOTIME);
# else
+ AQUIRE_DRAW_MUTEX
retVal = __generateExposes(hWnd, NULL, WM_PAINT, WM_PAINT_CLEAR_EARLY);
+ RELEASE_DRAW_MUTEX
# endif
switch (retVal) {
case -1: /* error */
@@ -9320,7 +9337,9 @@
*/
if ((gcData->rop2 == R2_COPYPEN)
&& (gcData->bitbltrop2 == BITBLT_COPY)) {
+ AQUIRE_DRAW_MUTEX
FillRect(hDC, &rct, hBrush);
+ RELEASE_DRAW_MUTEX
GcDataReleaseBrush(hDC, gcData);
} else {
HPEN prevPen;
@@ -9993,7 +10012,10 @@
{
PAINTSTRUCT ps;
+ AQUIRE_DRAW_MUTEX
__generateExposes(hWnd, NULL, WM_PAINT, 0);
+ RELEASE_DRAW_MUTEX
+
# if 0
BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
@@ -12413,7 +12435,7 @@
"PaintMutex"); /* name of mutex */
if (hPaintMutex == NULL) {
- fprintf(stderr, "WinWorkstation [fatal]: CreateMutex-3 failed\n");
+ fprintf(stderr, "WinWorkstation [fatal]: CreateMutex(PaintMutex) failed\n");
exit(1);
}
DuplicateHandle(GetCurrentProcess(),
@@ -12424,6 +12446,24 @@
FALSE,
DUPLICATE_SAME_ACCESS);
#endif
+#ifdef USE_DRAW_MUTEX
+ hDrawMutex = CreateMutex(
+ NULL, /* no security attributes */
+ FALSE, /* initially not owned */
+ "DrawMutex"); /* name of mutex */
+
+ if (hDrawMutex == NULL) {
+ fprintf(stderr, "WinWorkstation [fatal]: CreateMutex(DrawMutex) failed\n");
+ exit(1);
+ }
+ DuplicateHandle(GetCurrentProcess(),
+ hDrawMutex,
+ GetCurrentProcess(),
+ &hDrawMutex,
+ DUPLICATE_SAME_ACCESS,
+ FALSE,
+ DUPLICATE_SAME_ACCESS);
+#endif
#ifndef WIN32THREADS
_masterThreadId = GetCurrentThreadId();
@@ -15494,6 +15534,6 @@
!WinWorkstation class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.235 2003-11-21 14:16:36 ca Exp $'
+ ^ '$Header: /cvs/stx/stx/libview/WinWorkstation.st,v 1.236 2003-11-24 16:22:41 cg Exp $'
! !
WinWorkstation initialize!