278 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_LWCToolkit_createAWTRunLoopMediator 279 (JNIEnv *env, jclass clz) 280 { 281 AWT_ASSERT_APPKIT_THREAD; 282 283 AWTRunLoopObject *o = nil; 284 285 // We double retain because this object is owned by both main thread and "other" thread 286 // We release in both doAWTRunLoop and stopAWTRunLoop 287 o = [[AWTRunLoopObject alloc] init]; 288 if (o) { 289 CFRetain(o); // GC 290 CFRetain(o); // GC 291 [o release]; 292 } 293 return ptr_to_jlong(o); 294 } 295 296 /* 297 * Class: sun_lwawt_macosx_LWCToolkit 298 * Method: doAWTRunLoop 299 * Signature: (JZZ)V 300 */ 301 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoop 302 (JNIEnv *env, jclass clz, jlong mediator, jboolean processEvents) 303 { 304 AWT_ASSERT_APPKIT_THREAD; 305 JNF_COCOA_ENTER(env); 306 307 AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator); 308 309 if (mediatorObject == nil) return; 310 311 // Don't use acceptInputForMode because that doesn't setup autorelease pools properly 312 BOOL isRunning = true; 313 while (![mediatorObject shouldEndRunLoop] && isRunning) { 314 isRunning = [[NSRunLoop currentRunLoop] runMode:[JNFRunLoop javaRunLoopMode] 315 beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]]; 316 if (processEvents) { 317 //We do not spin a runloop here as date is nil, so does not matter which mode to use 318 NSEvent *event; 319 if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask 320 untilDate:nil 321 inMode:NSDefaultRunLoopMode 322 dequeue:YES]) != nil) { 323 [NSApp sendEvent:event]; 324 } 325 326 } 327 } 328 329 330 CFRelease(mediatorObject); 331 332 JNF_COCOA_EXIT(env); 333 } 334 335 /* 336 * Class: sun_lwawt_macosx_LWCToolkit 337 * Method: stopAWTRunLoop 338 * Signature: (J)V 339 */ 340 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopAWTRunLoop 341 (JNIEnv *env, jclass clz, jlong mediator) 342 { 343 AWT_ASSERT_NOT_APPKIT_THREAD; 344 JNF_COCOA_ENTER(env); 345 346 AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator); 347 348 [ThreadUtilities performOnMainThread:@selector(endRunLoop) on:mediatorObject withObject:nil waitUntilDone:NO]; 349 350 CFRelease(mediatorObject); 351 352 JNF_COCOA_EXIT(env); 353 } 354 355 /* 356 * Class: sun_lwawt_macosx_LWCToolkit 357 * Method: isCapsLockOn 358 * Signature: ()Z 359 */ 360 JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn 361 (JNIEnv *env, jobject self) 362 { 363 __block jboolean isOn = JNI_FALSE; | 278 JNIEXPORT jlong JNICALL Java_sun_lwawt_macosx_LWCToolkit_createAWTRunLoopMediator 279 (JNIEnv *env, jclass clz) 280 { 281 AWT_ASSERT_APPKIT_THREAD; 282 283 AWTRunLoopObject *o = nil; 284 285 // We double retain because this object is owned by both main thread and "other" thread 286 // We release in both doAWTRunLoop and stopAWTRunLoop 287 o = [[AWTRunLoopObject alloc] init]; 288 if (o) { 289 CFRetain(o); // GC 290 CFRetain(o); // GC 291 [o release]; 292 } 293 return ptr_to_jlong(o); 294 } 295 296 /* 297 * Class: sun_lwawt_macosx_LWCToolkit 298 * Method: doAWTRunLoopImpl 299 * Signature: (JZZ)V 300 */ 301 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoopImpl 302 (JNIEnv *env, jclass clz, jlong mediator, jboolean processEvents, jboolean inAWT) 303 { 304 AWT_ASSERT_APPKIT_THREAD; 305 JNF_COCOA_ENTER(env); 306 307 AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator); 308 309 if (mediatorObject == nil) return; 310 311 // Don't use acceptInputForMode because that doesn't setup autorelease pools properly 312 BOOL isRunning = true; 313 while (![mediatorObject shouldEndRunLoop] && isRunning) { 314 isRunning = [[NSRunLoop currentRunLoop] runMode:(inAWT ? [JNFRunLoop javaRunLoopMode] : NSDefaultRunLoopMode) 315 beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]]; 316 if (processEvents) { 317 //We do not spin a runloop here as date is nil, so does not matter which mode to use 318 NSEvent *event; 319 if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask 320 untilDate:nil 321 inMode:NSDefaultRunLoopMode 322 dequeue:YES]) != nil) { 323 [NSApp sendEvent:event]; 324 } 325 326 } 327 } 328 329 330 CFRelease(mediatorObject); 331 332 JNF_COCOA_EXIT(env); 333 } 334 335 /* 336 * Class: sun_lwawt_macosx_LWCToolkit 337 * Method: stopAWTRunLoop 338 * Signature: (J)V 339 */ 340 JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopAWTRunLoop 341 (JNIEnv *env, jclass clz, jlong mediator) 342 { 343 JNF_COCOA_ENTER(env); 344 345 AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator); 346 347 [ThreadUtilities performOnMainThread:@selector(endRunLoop) on:mediatorObject withObject:nil waitUntilDone:NO]; 348 349 CFRelease(mediatorObject); 350 351 JNF_COCOA_EXIT(env); 352 } 353 354 /* 355 * Class: sun_lwawt_macosx_LWCToolkit 356 * Method: isCapsLockOn 357 * Signature: ()Z 358 */ 359 JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn 360 (JNIEnv *env, jobject self) 361 { 362 __block jboolean isOn = JNI_FALSE; |