*** empty log message ***
authorClaus Gittinger <cg@exept.de>
Mon, 24 Nov 2003 17:22:41 +0100
changeset 3961 e2f3d8b87361
parent 3960 2af61ccfd26b
child 3962 425f5e384a15
*** empty log message ***
WinWorkstation.st
--- 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!