--- old/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m 2015-05-08 19:31:09.623064100 +0300 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m 2015-05-08 19:31:09.028488600 +0300 @@ -23,6 +23,7 @@ * questions. */ +#import #import #import "sun_lwawt_macosx_CFRetainedResource.h" @@ -37,7 +38,7 @@ (JNIEnv *env, jclass clazz, jlong ptr, jboolean releaseOnAppKitThread) { if (releaseOnAppKitThread) { - [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + [NSApp postRunnableEvent:^(){ CFRelease(jlong_to_ptr(ptr)); }]; } else { --- old/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m 2015-05-08 19:31:12.994492200 +0300 +++ new/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m 2015-05-08 19:31:12.477926600 +0300 @@ -517,7 +517,7 @@ if (processEvents) { //We do not spin a runloop here as date is nil, so does not matter which mode to use NSEvent *event; - if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask + if ((event = [NSApp nextEventMatchingMask:(NSAnyEventMask & ~NSApplicationDefined) untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]) != nil) { --- old/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h 2015-05-08 19:31:16.344417600 +0300 +++ new/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h 2015-05-08 19:31:15.834352800 +0300 @@ -37,6 +37,7 @@ - (void) registerWithProcessManager; - (void) setDockIconWithEnv:(JNIEnv *)env; - (void) postDummyEvent; +- (void) postRunnableEvent:(void (^)())block; - (void) waitForDummyEvent; + (void) runAWTLoopWithApp:(NSApplication*)app; --- old/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m 2015-05-08 19:31:19.693842900 +0300 +++ new/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m 2015-05-08 19:31:19.143773000 +0300 @@ -337,9 +337,13 @@ - (void)sendEvent:(NSEvent *)event { - if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp)) { + if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp) && [event subtype] == 0) { [seenDummyEventLock lockWhenCondition:NO]; [seenDummyEventLock unlockWithCondition:YES]; + } else if ([event type] == NSApplicationDefined && [event subtype] == 777) { + void (^block)() = (void (^)()) [event data1]; + block(); + [block release]; } else if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask)) { // Cocoa won't send us key up event when releasing a key while Cmd is down, // so we have to do it ourselves. @@ -349,6 +353,28 @@ } } +- (void)postRunnableEvent:(void (^)())block +{ + void (^copy)() = [block copy]; + NSInteger encode = (NSInteger) copy; + [copy retain]; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSEvent* event = [NSEvent otherEventWithType: NSApplicationDefined + location: NSMakePoint(0,0) + modifierFlags: 0 + timestamp: 0 + windowNumber: 0 + context: nil + subtype: 777 + data1: encode + data2: 0]; + + [NSApp postEvent: event atStart: NO]; + [pool drain]; +} + + + - (void)postDummyEvent { seenDummyEventLock = [[NSConditionLock alloc] initWithCondition:NO]; dummyEventTimestamp = [NSProcessInfo processInfo].systemUptime;