1 /*
   2  * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #import "CWrapper.h"
  27 
  28 #import <JavaNativeFoundation/JavaNativeFoundation.h>
  29 
  30 #import "AWTWindow.h"
  31 #import "LWCToolkit.h"
  32 #import "GeomUtilities.h"
  33 #import "ThreadUtilities.h"
  34 
  35 #import "sun_lwawt_macosx_CWrapper_NSWindow.h"
  36 
  37 /*
  38  * Class:     sun_lwawt_macosx_CWrapper$NSObject
  39  * Method:    release
  40  * Signature: (J)V
  41  */
  42 JNIEXPORT void JNICALL
  43 Java_sun_lwawt_macosx_CWrapper_00024NSObject_release
  44 (JNIEnv *env, jclass cls, jlong objectPtr)
  45 {
  46 JNF_COCOA_ENTER(env);
  47 
  48     id obj = (id)jlong_to_ptr(objectPtr);
  49     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
  50         CFRelease(obj);
  51     }];
  52 
  53 JNF_COCOA_EXIT(env);
  54 }
  55 
  56 
  57 /*
  58  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  59  * Method:    makeKeyAndOrderFront
  60  * Signature: (J)V
  61  */
  62 JNIEXPORT void JNICALL
  63 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyAndOrderFront
  64 (JNIEnv *env, jclass cls, jlong windowPtr)
  65 {
  66 JNF_COCOA_ENTER(env);
  67 
  68     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
  69     [JNFRunLoop performOnMainThread:@selector(makeKeyAndOrderFront:)
  70                                  on:window
  71                          withObject:nil
  72                       waitUntilDone:NO];
  73 
  74 JNF_COCOA_EXIT(env);
  75 }
  76 
  77 /*
  78  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  79  * Method:    makeMainWindow
  80  * Signature: (J)V
  81  */
  82 JNIEXPORT void JNICALL
  83 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow
  84 (JNIEnv *env, jclass cls, jlong windowPtr)
  85 {
  86 JNF_COCOA_ENTER(env);
  87 
  88     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
  89     [JNFRunLoop performOnMainThread:@selector(makeMainWindow)
  90                                  on:window
  91                          withObject:nil
  92                       waitUntilDone:NO];
  93 
  94 JNF_COCOA_EXIT(env);
  95 }
  96 
  97 /*
  98  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
  99  * Method:    canBecomeMainWindow
 100  * Signature: (J)V
 101  */
 102 JNIEXPORT jboolean JNICALL
 103 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow
 104 (JNIEnv *env, jclass cls, jlong windowPtr)
 105 {
 106     __block jboolean canBecomeMainWindow = JNI_FALSE;
 107 
 108 JNF_COCOA_ENTER(env);
 109 
 110     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 111     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 112     canBecomeMainWindow = [window canBecomeMainWindow];
 113     }];
 114 
 115 JNF_COCOA_EXIT(env);
 116 
 117     return canBecomeMainWindow;
 118 }
 119 
 120 /*
 121  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 122  * Method:    isKeyWindow
 123  * Signature: (J)Z
 124  */
 125 JNIEXPORT jboolean JNICALL
 126 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow
 127 (JNIEnv *env, jclass cls, jlong windowPtr)
 128 {
 129     __block jboolean isKeyWindow = JNI_FALSE;
 130 
 131 JNF_COCOA_ENTER(env);
 132 
 133     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 134     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 135         isKeyWindow = [window isKeyWindow];
 136     }];
 137 
 138 JNF_COCOA_EXIT(env);
 139 
 140     return isKeyWindow;
 141 }
 142 
 143 /*
 144  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 145  * Method:    orderFront
 146  * Signature: (J)V
 147  */
 148 JNIEXPORT void JNICALL
 149 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront
 150 (JNIEnv *env, jclass cls, jlong windowPtr)
 151 {
 152 JNF_COCOA_ENTER(env);
 153 
 154     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 155     [JNFRunLoop performOnMainThread:@selector(orderFront:)
 156                                  on:window
 157                          withObject:window
 158                       waitUntilDone:NO];
 159 
 160 JNF_COCOA_EXIT(env);
 161 }
 162 
 163 /*
 164  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 165  * Method:    orderOut
 166  * Signature: (J)V
 167  */
 168 JNIEXPORT void JNICALL
 169 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut
 170 (JNIEnv *env, jclass cls, jlong windowPtr)
 171 {
 172 JNF_COCOA_ENTER(env);
 173 
 174     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 175     [JNFRunLoop performOnMainThread:@selector(orderOut:)
 176                                  on:window
 177                          withObject:window
 178                       waitUntilDone:NO];
 179 
 180 JNF_COCOA_EXIT(env);
 181 }
 182 
 183 /*
 184  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 185  * Method:    orderFrontRegardless
 186  * Signature: (J)V
 187  */
 188 JNIEXPORT void JNICALL
 189 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless
 190 (JNIEnv *env, jclass cls, jlong windowPtr)
 191 {
 192 JNF_COCOA_ENTER(env);
 193 
 194     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 195     [JNFRunLoop performOnMainThread:@selector(orderFrontRegardless)
 196                                  on:window
 197                          withObject:nil
 198                       waitUntilDone:NO];
 199 
 200 JNF_COCOA_EXIT(env);
 201 }
 202 
 203 /*
 204  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 205  * Method:    orderWindow
 206  * Signature: (JIJ)V
 207  */
 208 JNIEXPORT void JNICALL
 209 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow
 210 (JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr)
 211 {
 212 JNF_COCOA_ENTER(env);
 213 
 214     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 215     NSWindow *relativeTo = (NSWindow *)jlong_to_ptr(relativeToPtr);
 216     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 217         [window orderWindow:(NSWindowOrderingMode)order relativeTo:[relativeTo windowNumber]];
 218     }];
 219 
 220 JNF_COCOA_EXIT(env);
 221 }
 222 
 223 // Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet)
 224 static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS];
 225 static void initLevels()
 226 {
 227     static dispatch_once_t pred;
 228 
 229     dispatch_once(&pred, ^{
 230         LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSNormalWindowLevel] = NSNormalWindowLevel;
 231         LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSFloatingWindowLevel] = NSFloatingWindowLevel;
 232     });
 233 }
 234 
 235 /*
 236  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 237  * Method:    setLevel
 238  * Signature: (JI)V
 239  */
 240 JNIEXPORT void JNICALL
 241 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel
 242 (JNIEnv *env, jclass cls, jlong windowPtr, jint level)
 243 {
 244 JNF_COCOA_ENTER(env);
 245 
 246     if (level >= 0 && level < sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS) {
 247         initLevels();
 248 
 249         NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 250         [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 251             [window setLevel: LEVELS[level]];
 252         }];
 253     } else {
 254         [JNFException raise:env as:kIllegalArgumentException reason:"unknown level"];
 255     }
 256 
 257 JNF_COCOA_EXIT(env);
 258 }
 259 
 260 /*
 261  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 262  * Method:    addChildWindow
 263  * Signature: (JJI)V
 264  */
 265 JNIEXPORT void JNICALL
 266 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow
 267 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order)
 268 {
 269 JNF_COCOA_ENTER(env);
 270 
 271     NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr);
 272     NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr);
 273     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 274         [parent addChildWindow:child ordered:order];
 275     }];
 276 
 277 JNF_COCOA_EXIT(env);
 278 }
 279 
 280 /*
 281  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 282  * Method:    removeChildWindow
 283  * Signature: (JJ)V
 284  */
 285 JNIEXPORT void JNICALL
 286 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow
 287 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr)
 288 {
 289 JNF_COCOA_ENTER(env);
 290 
 291     AWTWindow *parent = (AWTWindow *)jlong_to_ptr(parentPtr);
 292     AWTWindow *child = (AWTWindow *)jlong_to_ptr(childPtr);
 293     [JNFRunLoop performOnMainThread:@selector(removeChildWindow:)
 294                                  on:parent
 295                          withObject:child
 296                       waitUntilDone:NO];
 297 
 298 JNF_COCOA_EXIT(env);
 299 }
 300 
 301 /*
 302  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 303  * Method:    setFrame
 304  * Signature: (JIIIIZ)V
 305  */
 306 JNIEXPORT void JNICALL
 307 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setFrame
 308 (JNIEnv *env, jclass cls, jlong windowPtr, jint x, jint y, jint w, jint h, jboolean display)
 309 {
 310 JNF_COCOA_ENTER(env);
 311 
 312     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 313     NSRect frame = NSMakeRect(x, y, w, h);
 314     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 315         [window setFrame:frame display:display];
 316     }];
 317 
 318 JNF_COCOA_EXIT(env);
 319 }
 320 
 321 /*
 322  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 323  * Method:    setAlphaValue
 324  * Signature: (JF)V
 325  */
 326 JNIEXPORT void JNICALL
 327 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue
 328 (JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha)
 329 {
 330 JNF_COCOA_ENTER(env);
 331 
 332     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 333     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 334         [window setAlphaValue:(CGFloat)alpha];
 335     }];
 336 
 337 JNF_COCOA_EXIT(env);
 338 }
 339 
 340 /*
 341  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 342  * Method:    setOpaque
 343  * Signature: (Z)V
 344  */
 345 JNIEXPORT void JNICALL
 346 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque
 347 (JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque)
 348 {
 349 JNF_COCOA_ENTER(env);
 350 
 351     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 352     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 353         [window setOpaque:(BOOL)opaque];
 354     }];
 355 
 356 JNF_COCOA_EXIT(env);
 357 }
 358 
 359 /*
 360  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 361  * Method:    setBackgroundColor
 362  * Signature: (J)V
 363  */
 364 JNIEXPORT void JNICALL
 365 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor
 366 (JNIEnv *env, jclass cls, jlong windowPtr, jlong colorPtr)
 367 {
 368 JNF_COCOA_ENTER(env);
 369 
 370     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 371     NSColor *color = (NSColor *)jlong_to_ptr(colorPtr);
 372     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 373         [window setBackgroundColor:color];
 374     }];
 375 
 376 JNF_COCOA_EXIT(env);
 377 }
 378 
 379 /*
 380  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 381  * Method:    screen
 382  * Signature: (J)J
 383  */
 384 JNIEXPORT jlong JNICALL
 385 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_screen
 386 (JNIEnv *env, jclass cls, jlong windowPtr)
 387 {
 388     __block jlong screenPtr = 0L;
 389 
 390 JNF_COCOA_ENTER(env);
 391 
 392     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 393     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 394         const NSScreen *screen = [window screen];
 395         CFRetain(screen); // GC
 396         screenPtr = ptr_to_jlong(screen);
 397     }];
 398 
 399 JNF_COCOA_EXIT(env);
 400 
 401     return screenPtr;
 402 }
 403 
 404 /*
 405  * Method:    miniaturize
 406  * Signature: (J)V
 407  */
 408 JNIEXPORT void JNICALL
 409 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize
 410 (JNIEnv *env, jclass cls, jlong windowPtr)
 411 {
 412 JNF_COCOA_ENTER(env);
 413 
 414     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 415     [JNFRunLoop performOnMainThread:@selector(miniaturize:)
 416                                  on:window
 417                          withObject:nil
 418                       waitUntilDone:NO];
 419 
 420 JNF_COCOA_EXIT(env);
 421 }
 422 
 423 /*
 424  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 425  * Method:    deminiaturize
 426  * Signature: (J)V
 427  */
 428 JNIEXPORT void JNICALL
 429 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize
 430 (JNIEnv *env, jclass cls, jlong windowPtr)
 431 {
 432 JNF_COCOA_ENTER(env);
 433 
 434     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 435     [JNFRunLoop performOnMainThread:@selector(deminiaturize:)
 436                                  on:window
 437                          withObject:nil
 438                       waitUntilDone:NO];
 439 
 440 JNF_COCOA_EXIT(env);
 441 }
 442 
 443 /*
 444  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 445  * Method:    zoom
 446  * Signature: (J)V
 447  */
 448 JNIEXPORT void JNICALL
 449 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom
 450 (JNIEnv *env, jclass cls, jlong windowPtr)
 451 {
 452 JNF_COCOA_ENTER(env);
 453 
 454     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 455     [JNFRunLoop performOnMainThread:@selector(zoom:)
 456                                  on:window
 457                          withObject:nil
 458                       waitUntilDone:NO];
 459 
 460 JNF_COCOA_EXIT(env);
 461 }
 462 
 463 /*
 464  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 465  * Method:    makeFirstResponder
 466  * Signature: (JJ)V
 467  */
 468 JNIEXPORT void JNICALL
 469 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder
 470 (JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr)
 471 {
 472 JNF_COCOA_ENTER(env);
 473 
 474     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 475     NSResponder *responder = (NSResponder *)jlong_to_ptr(responderPtr);
 476     [JNFRunLoop performOnMainThread:@selector(makeFirstResponder:)
 477                                  on:window
 478                          withObject:responder
 479                       waitUntilDone:NO];
 480 
 481 JNF_COCOA_EXIT(env);
 482 }
 483 
 484 /*
 485  * Class:     sun_lwawt_macosx_CWrapper$NSView
 486  * Method:    addSubview
 487  * Signature: (JJ)V
 488  */
 489 JNIEXPORT void JNICALL
 490 Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview
 491 (JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr)
 492 {
 493 JNF_COCOA_ENTER(env);
 494 
 495     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 496     NSView *subview = (NSView *)jlong_to_ptr(subviewPtr);
 497     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 498         [view addSubview:subview];
 499     }];
 500 
 501 JNF_COCOA_EXIT(env);
 502 }
 503 
 504 /*
 505  * Class:     sun_lwawt_macosx_CWrapper$NSView
 506  * Method:    removeFromSuperview
 507  * Signature: (J)V
 508  */
 509 JNIEXPORT void JNICALL
 510 Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview
 511 (JNIEnv *env, jclass cls, jlong viewPtr)
 512 {
 513 JNF_COCOA_ENTER(env);
 514 
 515     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 516     [JNFRunLoop performOnMainThread:@selector(removeFromSuperview)
 517                                  on:view
 518                          withObject:nil
 519                       waitUntilDone:NO];
 520 
 521 JNF_COCOA_EXIT(env);
 522 }
 523 
 524 /*
 525  * Class:     sun_lwawt_macosx_CWrapper$NSView
 526  * Method:    setFrame
 527  * Signature: (JIIII)V
 528  */
 529 JNIEXPORT void JNICALL
 530 Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame
 531 (JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h)
 532 {
 533 JNF_COCOA_ENTER(env);
 534 
 535     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 536     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 537         [view setFrame:NSMakeRect(x, y, w, h)];
 538     }];
 539 
 540 JNF_COCOA_EXIT(env);
 541 }
 542 
 543 /*
 544  * Class:     sun_lwawt_macosx_CWrapper$NSView
 545  * Method:    frame
 546  * Signature: (J)Ljava/awt/Rectangle;
 547  */
 548 JNIEXPORT jobject JNICALL
 549 Java_sun_lwawt_macosx_CWrapper_00024NSView_frame
 550 (JNIEnv *env, jclass cls, jlong viewPtr)
 551 {
 552     jobject jRect = NULL;
 553 
 554 JNF_COCOA_ENTER(env);
 555 
 556     __block NSRect rect = NSZeroRect;
 557 
 558     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 559     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 560         rect = [view frame];
 561     }];
 562 
 563     jRect = NSToJavaRect(env, rect);
 564 
 565 JNF_COCOA_EXIT(env);
 566 
 567     return jRect;
 568 }
 569 
 570 /*
 571  * Class:     sun_lwawt_macosx_CWrapper$NSView
 572  * Method:    enterFullScreenMode
 573  * Signature: (J)V
 574  */
 575 JNIEXPORT void JNICALL
 576 Java_sun_lwawt_macosx_CWrapper_00024NSView_enterFullScreenMode
 577 (JNIEnv *env, jclass cls, jlong viewPtr)
 578 {
 579 JNF_COCOA_ENTER(env);
 580 
 581     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 582     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 583         NSScreen *screen = [[view window] screen];
 584         NSDictionary *opts = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], NSFullScreenModeAllScreens, nil];
 585         [view enterFullScreenMode:screen withOptions:opts];
 586     }];
 587 
 588 JNF_COCOA_EXIT(env);
 589 }
 590 
 591 /*
 592  * Class:     sun_lwawt_macosx_CWrapper$NSView
 593  * Method:    exitFullScreenMode
 594  * Signature: (J)V
 595  */
 596 JNIEXPORT void JNICALL
 597 Java_sun_lwawt_macosx_CWrapper_00024NSView_exitFullScreenMode
 598 (JNIEnv *env, jclass cls, jlong viewPtr)
 599 {
 600 JNF_COCOA_ENTER(env);
 601 
 602     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 603     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 604         [view exitFullScreenModeWithOptions:nil];
 605     }];
 606 
 607 JNF_COCOA_EXIT(env);
 608 }
 609 
 610 /*
 611  * Class:     sun_lwawt_macosx_CWrapper$NSView
 612  * Method:    window
 613  * Signature: (J)J
 614  */
 615 JNIEXPORT jlong JNICALL
 616 Java_sun_lwawt_macosx_CWrapper_00024NSView_window
 617 (JNIEnv *env, jclass cls, jlong viewPtr)
 618 {
 619     __block jlong windowPtr = 0L;
 620 
 621 JNF_COCOA_ENTER(env);
 622 
 623     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 624     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 625         windowPtr = ptr_to_jlong([view window]);
 626     }];
 627 
 628 JNF_COCOA_EXIT(env);
 629 
 630     return windowPtr;
 631 }
 632 
 633 /*
 634  * Class:     sun_lwawt_macosx_CWrapper$NSScreen
 635  * Method:    frame
 636  * Signature: (J)Ljava/awt/Rectangle;
 637  */
 638 JNIEXPORT jobject JNICALL
 639 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_frame
 640 (JNIEnv *env, jclass cls, jlong screenPtr)
 641 {
 642     jobject jRect = NULL;
 643 
 644 JNF_COCOA_ENTER(env);
 645 
 646     __block NSRect rect = NSZeroRect;
 647 
 648     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 649     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 650         rect = [screen frame];
 651     }];
 652 
 653     jRect = NSToJavaRect(env, rect);
 654 
 655 JNF_COCOA_EXIT(env);
 656 
 657     return jRect;
 658 }
 659 
 660 /*
 661  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 662  * Method:    visibleFrame
 663  * Signature: (J)Ljava/awt/geom/Rectangle2D;
 664  */
 665 JNIEXPORT jobject JNICALL
 666 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_visibleFrame
 667 (JNIEnv *env, jclass cls, jlong screenPtr)
 668 {
 669     jobject jRect = NULL;
 670 
 671 JNF_COCOA_ENTER(env);
 672 
 673     __block NSRect rect = NSZeroRect;
 674 
 675     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 676     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 677         rect = [screen visibleFrame];
 678     }];
 679 
 680     jRect = NSToJavaRect(env, rect);
 681 
 682 JNF_COCOA_EXIT(env);
 683 
 684     return jRect;
 685 }
 686 
 687 /*
 688  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 689  * Method:    screenByDisplayId
 690  * Signature: (J)J
 691  */
 692 JNIEXPORT jlong JNICALL
 693 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screenByDisplayId
 694 (JNIEnv *env, jclass cls, jint displayID)
 695 {
 696     __block jlong screenPtr = 0L;
 697 
 698 JNF_COCOA_ENTER(env);
 699 
 700     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 701         NSArray *screens = [NSScreen screens];
 702         for (NSScreen *screen in screens) {
 703             NSDictionary *screenInfo = [screen deviceDescription];
 704             NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
 705             if ([screenID intValue] == displayID){
 706                 CFRetain(screen); // GC
 707                 screenPtr = ptr_to_jlong(screen);
 708                 break;
 709             }
 710         }
 711     }];
 712 
 713 JNF_COCOA_EXIT(env);
 714 
 715     return screenPtr;
 716 }
 717 
 718 /*
 719  * Class:     sun_lwawt_macosx_CWrapper$NSColor
 720  * Method:    clearColor
 721  * Signature: ()J
 722  */
 723 JNIEXPORT jlong JNICALL
 724 Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor
 725 (JNIEnv *env, jclass cls)
 726 {
 727     __block jlong clearColorPtr = 0L;
 728 
 729 JNF_COCOA_ENTER(env);
 730 
 731     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 732         clearColorPtr = ptr_to_jlong([NSColor clearColor]);
 733     }];
 734 
 735 JNF_COCOA_EXIT(env);
 736 
 737     return clearColorPtr;
 738 }
 739