diff options
Diffstat (limited to 'src/newt/native/NewtMacWindow.m')
-rw-r--r-- | src/newt/native/NewtMacWindow.m | 76 |
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); |