src/macosx/native/sun/awt/LWCToolkit.m

Print this page




 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;