summaryrefslogtreecommitdiffstats
path: root/src/newt/native/NewtMacWindow.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/newt/native/NewtMacWindow.m')
-rw-r--r--src/newt/native/NewtMacWindow.m76
1 files changed, 66 insertions, 10 deletions
diff --git a/src/newt/native/NewtMacWindow.m b/src/newt/native/NewtMacWindow.m
index 43e66506c..1f74742ec 100644
--- a/src/newt/native/NewtMacWindow.m
+++ b/src/newt/native/NewtMacWindow.m
@@ -103,6 +103,8 @@ static jmethodID windowRepaintID = NULL;
jvmHandle = NULL;
jvmVersion = 0;
destroyNotifySent = NO;
+ softLocked = NO;
+ pthread_mutex_init(&softLockSync, NULL); // fast non-recursive
ptrTrackingTag = 0;
@@ -117,6 +119,15 @@ static jmethodID windowRepaintID = NULL;
return [super initWithFrame:frameRect];
}
+- (void) dealloc
+{
+ if(softLocked) {
+ fprintf(stderr, "*** Warning: softLock still hold @ dealloc!\n"); fflush(NULL);
+ }
+ pthread_mutex_destroy(&softLockSync);
+ [super dealloc];
+}
+
- (void) setJVMHandle: (JavaVM*) vm
{
jvmHandle = vm;
@@ -146,16 +157,6 @@ static jmethodID windowRepaintID = NULL;
return javaWindowObject;
}
-- (void) setDestroyNotifySent: (BOOL) v
-{
- destroyNotifySent = v;
-}
-
-- (BOOL) getDestroyNotifySent
-{
- return destroyNotifySent;
-}
-
- (void) rightMouseDown: (NSEvent*) theEvent
{
NSResponder* next = [self nextResponder];
@@ -182,6 +183,61 @@ static jmethodID windowRepaintID = NULL;
return myCursor;
}
+- (void) setDestroyNotifySent: (BOOL) v
+{
+ destroyNotifySent = v;
+}
+
+- (BOOL) getDestroyNotifySent
+{
+ return destroyNotifySent;
+}
+
+#define SOFT_LOCK_BLOCKING 1
+
+- (BOOL) softLock
+{
+ pthread_mutex_lock(&softLockSync);
+ softLocked = YES;
+#ifndef SOFT_LOCK_BLOCKING
+ pthread_mutex_unlock(&softLockSync);
+#endif
+ return softLocked;
+}
+
+- (void) softUnlock
+{
+#ifndef SOFT_LOCK_BLOCKING
+ pthread_mutex_lock(&softLockSync);
+#endif
+ softLocked = NO;
+ pthread_mutex_unlock(&softLockSync);
+}
+
+- (BOOL) needsDisplay
+{
+#ifndef SOFT_LOCK_BLOCKING
+ return NO == softLocked && NO == destroyNotifySent && [super needsDisplay];
+#else
+ return NO == destroyNotifySent && [super needsDisplay];
+#endif
+}
+
+- (void) displayIfNeeded
+{
+#ifndef SOFT_LOCK_BLOCKING
+ if( NO == softLocked && NO == destroyNotifySent ) {
+ [super displayIfNeeded];
+ }
+#else
+ [self softLock];
+ if( NO == destroyNotifySent ) {
+ [super displayIfNeeded];
+ }
+ [self softUnlock];
+#endif
+}
+
- (void) viewWillDraw
{
DBG_PRINT("*************** viewWillDraw: 0x%p\n", javaWindowObject);