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:    makeKeyWindow
  80  * Signature: (J)V
  81  */
  82 JNIEXPORT void JNICALL
  83 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow
  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(makeKeyWindow)
  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:    makeMainWindow
 100  * Signature: (J)V
 101  */
 102 JNIEXPORT void JNICALL
 103 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeMainWindow
 104 (JNIEnv *env, jclass cls, jlong windowPtr)
 105 {
 106 JNF_COCOA_ENTER(env);
 107 
 108     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 109     [JNFRunLoop performOnMainThread:@selector(makeMainWindow)
 110                                  on:window
 111                          withObject:nil
 112                       waitUntilDone:NO];
 113 
 114 JNF_COCOA_EXIT(env);
 115 }
 116 
 117 /*
 118  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 119  * Method:    canBecomeMainWindow
 120  * Signature: (J)V
 121  */
 122 JNIEXPORT jboolean JNICALL
 123 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_canBecomeMainWindow
 124 (JNIEnv *env, jclass cls, jlong windowPtr)
 125 {
 126     __block jboolean canBecomeMainWindow = JNI_FALSE;
 127 
 128 JNF_COCOA_ENTER(env);
 129 
 130     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 131     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 132         canBecomeMainWindow = [window canBecomeMainWindow];
 133     }];
 134 
 135 JNF_COCOA_EXIT(env);
 136 
 137     return canBecomeMainWindow;
 138 }
 139 
 140 /*
 141  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 142  * Method:    isKeyWindow
 143  * Signature: (J)Z
 144  */
 145 JNIEXPORT jboolean JNICALL
 146 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_isKeyWindow
 147 (JNIEnv *env, jclass cls, jlong windowPtr)
 148 {
 149     __block jboolean isKeyWindow = JNI_FALSE;
 150 
 151 JNF_COCOA_ENTER(env);
 152 
 153     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 154     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 155         isKeyWindow = [window isKeyWindow];
 156     }];
 157 
 158 JNF_COCOA_EXIT(env);
 159 
 160     return isKeyWindow;
 161 }
 162 
 163 /*
 164  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 165  * Method:    orderFront
 166  * Signature: (J)V
 167  */
 168 JNIEXPORT void JNICALL
 169 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFront
 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(orderFront:)
 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:    orderOut
 186  * Signature: (J)V
 187  */
 188 JNIEXPORT void JNICALL
 189 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderOut
 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(orderOut:)
 196                                  on:window
 197                          withObject:window
 198                       waitUntilDone:NO];
 199 
 200 JNF_COCOA_EXIT(env);
 201 }
 202 
 203 /*
 204  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 205  * Method:    orderFrontRegardless
 206  * Signature: (J)V
 207  */
 208 JNIEXPORT void JNICALL
 209 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderFrontRegardless
 210 (JNIEnv *env, jclass cls, jlong windowPtr)
 211 {
 212 JNF_COCOA_ENTER(env);
 213 
 214     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 215     [JNFRunLoop performOnMainThread:@selector(orderFrontRegardless)
 216                                  on:window
 217                          withObject:nil
 218                       waitUntilDone:NO];
 219 
 220 JNF_COCOA_EXIT(env);
 221 }
 222 
 223 /*
 224  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 225  * Method:    orderWindow
 226  * Signature: (JIJ)V
 227  */
 228 JNIEXPORT void JNICALL
 229 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_orderWindow
 230 (JNIEnv *env, jclass cls, jlong windowPtr, jint order, jlong relativeToPtr)
 231 {
 232 JNF_COCOA_ENTER(env);
 233 
 234     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 235     NSWindow *relativeTo = (NSWindow *)jlong_to_ptr(relativeToPtr);
 236     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 237         [window orderWindow:(NSWindowOrderingMode)order relativeTo:[relativeTo windowNumber]];
 238     }];
 239 
 240 JNF_COCOA_EXIT(env);
 241 }
 242 
 243 // Used for CWrapper.NSWindow.setLevel() (and level() which isn't implemented yet)
 244 static NSInteger LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS];
 245 static void initLevels()
 246 {
 247     static dispatch_once_t pred;
 248 
 249     dispatch_once(&pred, ^{
 250         LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSNormalWindowLevel] = NSNormalWindowLevel;
 251         LEVELS[sun_lwawt_macosx_CWrapper_NSWindow_NSFloatingWindowLevel] = NSFloatingWindowLevel;
 252     });
 253 }
 254 
 255 /*
 256  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 257  * Method:    setLevel
 258  * Signature: (JI)V
 259  */
 260 JNIEXPORT void JNICALL
 261 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setLevel
 262 (JNIEnv *env, jclass cls, jlong windowPtr, jint level)
 263 {
 264 JNF_COCOA_ENTER(env);
 265 
 266     if (level >= 0 && level < sun_lwawt_macosx_CWrapper_NSWindow_MAX_WINDOW_LEVELS) {
 267         initLevels();
 268 
 269         NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 270         [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 271             [window setLevel: LEVELS[level]];
 272         }];
 273     } else {
 274         [JNFException raise:env as:kIllegalArgumentException reason:"unknown level"];
 275     }
 276 
 277 JNF_COCOA_EXIT(env);
 278 }
 279 
 280 /*
 281  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 282  * Method:    addChildWindow
 283  * Signature: (JJI)V
 284  */
 285 JNIEXPORT void JNICALL
 286 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_addChildWindow
 287 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr, jint order)
 288 {
 289 JNF_COCOA_ENTER(env);
 290 
 291     NSWindow *parent = (NSWindow *)jlong_to_ptr(parentPtr);
 292     NSWindow *child = (NSWindow *)jlong_to_ptr(childPtr);
 293     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 294         [parent addChildWindow:child ordered:order];
 295     }];
 296 
 297 JNF_COCOA_EXIT(env);
 298 }
 299 
 300 /*
 301  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 302  * Method:    removeChildWindow
 303  * Signature: (JJ)V
 304  */
 305 JNIEXPORT void JNICALL
 306 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_removeChildWindow
 307 (JNIEnv *env, jclass cls, jlong parentPtr, jlong childPtr)
 308 {
 309 JNF_COCOA_ENTER(env);
 310 
 311     AWTWindow *parent = (AWTWindow *)jlong_to_ptr(parentPtr);
 312     AWTWindow *child = (AWTWindow *)jlong_to_ptr(childPtr);
 313     [JNFRunLoop performOnMainThread:@selector(removeChildWindow:)
 314                                  on:parent
 315                          withObject:child
 316                       waitUntilDone:NO];
 317 
 318 JNF_COCOA_EXIT(env);
 319 }
 320 
 321 /*
 322  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 323  * Method:    setFrame
 324  * Signature: (JIIIIZ)V
 325  */
 326 JNIEXPORT void JNICALL
 327 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setFrame
 328 (JNIEnv *env, jclass cls, jlong windowPtr, jint x, jint y, jint w, jint h, jboolean display)
 329 {
 330 JNF_COCOA_ENTER(env);
 331 
 332     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 333     NSRect frame = NSMakeRect(x, y, w, h);
 334     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 335         [window setFrame:frame display:display];
 336     }];
 337 
 338 JNF_COCOA_EXIT(env);
 339 }
 340 
 341 /*
 342  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 343  * Method:    setAlphaValue
 344  * Signature: (JF)V
 345  */
 346 JNIEXPORT void JNICALL
 347 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setAlphaValue
 348 (JNIEnv *env, jclass cls, jlong windowPtr, jfloat alpha)
 349 {
 350 JNF_COCOA_ENTER(env);
 351 
 352     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 353     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 354         [window setAlphaValue:(CGFloat)alpha];
 355     }];
 356 
 357 JNF_COCOA_EXIT(env);
 358 }
 359 
 360 /*
 361  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 362  * Method:    setOpaque
 363  * Signature: (Z)V
 364  */
 365 JNIEXPORT void JNICALL
 366 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setOpaque
 367 (JNIEnv *env, jclass cls, jlong windowPtr, jboolean opaque)
 368 {
 369 JNF_COCOA_ENTER(env);
 370 
 371     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 372     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 373         [window setOpaque:(BOOL)opaque];
 374     }];
 375 
 376 JNF_COCOA_EXIT(env);
 377 }
 378 
 379 /*
 380  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 381  * Method:    setBackgroundColor
 382  * Signature: (J)V
 383  */
 384 JNIEXPORT void JNICALL
 385 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_setBackgroundColor
 386 (JNIEnv *env, jclass cls, jlong windowPtr, jlong colorPtr)
 387 {
 388 JNF_COCOA_ENTER(env);
 389 
 390     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 391     NSColor *color = (NSColor *)jlong_to_ptr(colorPtr);
 392     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 393         [window setBackgroundColor:color];
 394     }];
 395 
 396 JNF_COCOA_EXIT(env);
 397 }
 398 
 399 /*
 400  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 401  * Method:    screen
 402  * Signature: (J)J
 403  */
 404 JNIEXPORT jlong JNICALL
 405 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_screen
 406 (JNIEnv *env, jclass cls, jlong windowPtr)
 407 {
 408     __block jlong screenPtr = 0L;
 409 
 410 JNF_COCOA_ENTER(env);
 411 
 412     AWTWindow *window = (AWTWindow *)jlong_to_ptr(windowPtr);
 413     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 414         const NSScreen *screen = [window screen];
 415         CFRetain(screen); // GC
 416         screenPtr = ptr_to_jlong(screen);
 417     }];
 418 
 419 JNF_COCOA_EXIT(env);
 420 
 421     return screenPtr;
 422 }
 423 
 424 /*
 425  * Method:    miniaturize
 426  * Signature: (J)V
 427  */
 428 JNIEXPORT void JNICALL
 429 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_miniaturize
 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(miniaturize:)
 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:    deminiaturize
 446  * Signature: (J)V
 447  */
 448 JNIEXPORT void JNICALL
 449 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_deminiaturize
 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(deminiaturize:)
 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:    zoom
 466  * Signature: (J)V
 467  */
 468 JNIEXPORT void JNICALL
 469 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_zoom
 470 (JNIEnv *env, jclass cls, jlong windowPtr)
 471 {
 472 JNF_COCOA_ENTER(env);
 473 
 474     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 475     [JNFRunLoop performOnMainThread:@selector(zoom:)
 476                                  on:window
 477                          withObject:nil
 478                       waitUntilDone:NO];
 479 
 480 JNF_COCOA_EXIT(env);
 481 }
 482 
 483 /*
 484  * Class:     sun_lwawt_macosx_CWrapper$NSWindow
 485  * Method:    makeFirstResponder
 486  * Signature: (JJ)V
 487  */
 488 JNIEXPORT void JNICALL
 489 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeFirstResponder
 490 (JNIEnv *env, jclass cls, jlong windowPtr, jlong responderPtr)
 491 {
 492 JNF_COCOA_ENTER(env);
 493 
 494     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 495     NSResponder *responder = (NSResponder *)jlong_to_ptr(responderPtr);
 496     [JNFRunLoop performOnMainThread:@selector(makeFirstResponder:)
 497                                  on:window
 498                          withObject:responder
 499                       waitUntilDone:NO];
 500 
 501 JNF_COCOA_EXIT(env);
 502 }
 503 
 504 /*
 505  * Class:     sun_lwawt_macosx_CWrapper$NSView
 506  * Method:    addSubview
 507  * Signature: (JJ)V
 508  */
 509 JNIEXPORT void JNICALL
 510 Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview
 511 (JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr)
 512 {
 513 JNF_COCOA_ENTER(env);
 514 
 515     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 516     NSView *subview = (NSView *)jlong_to_ptr(subviewPtr);
 517     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 518         [view addSubview:subview];
 519     }];
 520 
 521 JNF_COCOA_EXIT(env);
 522 }
 523 
 524 /*
 525  * Class:     sun_lwawt_macosx_CWrapper$NSView
 526  * Method:    removeFromSuperview
 527  * Signature: (J)V
 528  */
 529 JNIEXPORT void JNICALL
 530 Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview
 531 (JNIEnv *env, jclass cls, jlong viewPtr)
 532 {
 533 JNF_COCOA_ENTER(env);
 534 
 535     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 536     [JNFRunLoop performOnMainThread:@selector(removeFromSuperview)
 537                                  on:view
 538                          withObject:nil
 539                       waitUntilDone:NO];
 540 
 541 JNF_COCOA_EXIT(env);
 542 }
 543 
 544 /*
 545  * Class:     sun_lwawt_macosx_CWrapper$NSView
 546  * Method:    setFrame
 547  * Signature: (JIIII)V
 548  */
 549 JNIEXPORT void JNICALL
 550 Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame
 551 (JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h)
 552 {
 553 JNF_COCOA_ENTER(env);
 554 
 555     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 556     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 557         [view setFrame:NSMakeRect(x, y, w, h)];
 558     }];
 559 
 560 JNF_COCOA_EXIT(env);
 561 }
 562 
 563 /*
 564  * Class:     sun_lwawt_macosx_CWrapper$NSView
 565  * Method:    frame
 566  * Signature: (J)Ljava/awt/Rectangle;
 567  */
 568 JNIEXPORT jobject JNICALL
 569 Java_sun_lwawt_macosx_CWrapper_00024NSView_frame
 570 (JNIEnv *env, jclass cls, jlong viewPtr)
 571 {
 572     jobject jRect = NULL;
 573 
 574 JNF_COCOA_ENTER(env);
 575 
 576     __block NSRect rect = NSZeroRect;
 577 
 578     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 579     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 580         rect = [view frame];
 581     }];
 582 
 583     jRect = NSToJavaRect(env, rect);
 584 
 585 JNF_COCOA_EXIT(env);
 586 
 587     return jRect;
 588 }
 589 
 590 /*
 591  * Class:     sun_lwawt_macosx_CWrapper$NSView
 592  * Method:    enterFullScreenMode
 593  * Signature: (J)V
 594  */
 595 JNIEXPORT void JNICALL
 596 Java_sun_lwawt_macosx_CWrapper_00024NSView_enterFullScreenMode
 597 (JNIEnv *env, jclass cls, jlong viewPtr)
 598 {
 599 JNF_COCOA_ENTER(env);
 600 
 601     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 602     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 603         NSScreen *screen = [[view window] screen];
 604         NSDictionary *opts = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], NSFullScreenModeAllScreens, nil];
 605         [view enterFullScreenMode:screen withOptions:opts];
 606     }];
 607 
 608 JNF_COCOA_EXIT(env);
 609 }
 610 
 611 /*
 612  * Class:     sun_lwawt_macosx_CWrapper$NSView
 613  * Method:    exitFullScreenMode
 614  * Signature: (J)V
 615  */
 616 JNIEXPORT void JNICALL
 617 Java_sun_lwawt_macosx_CWrapper_00024NSView_exitFullScreenMode
 618 (JNIEnv *env, jclass cls, jlong viewPtr)
 619 {
 620 JNF_COCOA_ENTER(env);
 621 
 622     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 623     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 624         [view exitFullScreenModeWithOptions:nil];
 625     }];
 626 
 627 JNF_COCOA_EXIT(env);
 628 }
 629 
 630 /*
 631  * Class:     sun_lwawt_macosx_CWrapper$NSView
 632  * Method:    window
 633  * Signature: (J)J
 634  */
 635 JNIEXPORT jlong JNICALL
 636 Java_sun_lwawt_macosx_CWrapper_00024NSView_window
 637 (JNIEnv *env, jclass cls, jlong viewPtr)
 638 {
 639     __block jlong windowPtr = 0L;
 640 
 641 JNF_COCOA_ENTER(env);
 642 
 643     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 644     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 645         windowPtr = ptr_to_jlong([view window]);
 646     }];
 647 
 648 JNF_COCOA_EXIT(env);
 649 
 650     return windowPtr;
 651 }
 652 
 653 /*
 654  * Class:     sun_lwawt_macosx_CWrapper$NSView
 655  * Method:    setHidden
 656  * Signature: (JZ)V
 657  */
 658 JNIEXPORT jlong JNICALL
 659 Java_sun_lwawt_macosx_CWrapper_00024NSView_setHidden
 660 (JNIEnv *env, jclass cls, jlong viewPtr, jboolean toHide)
 661 {    
 662     JNF_COCOA_ENTER(env);
 663     
 664     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 665     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 666         [view setHidden:(BOOL)toHide];
 667     }];
 668     
 669     JNF_COCOA_EXIT(env);
 670 }
 671 
 672 
 673 /*
 674  * Class:     sun_lwawt_macosx_CWrapper$NSScreen
 675  * Method:    frame
 676  * Signature: (J)Ljava/awt/Rectangle;
 677  */
 678 JNIEXPORT jobject JNICALL
 679 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_frame
 680 (JNIEnv *env, jclass cls, jlong screenPtr)
 681 {
 682     jobject jRect = NULL;
 683 
 684 JNF_COCOA_ENTER(env);
 685 
 686     __block NSRect rect = NSZeroRect;
 687 
 688     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 689     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 690         rect = [screen frame];
 691     }];
 692 
 693     jRect = NSToJavaRect(env, rect);
 694 
 695 JNF_COCOA_EXIT(env);
 696 
 697     return jRect;
 698 }
 699 
 700 /*
 701  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 702  * Method:    visibleFrame
 703  * Signature: (J)Ljava/awt/geom/Rectangle2D;
 704  */
 705 JNIEXPORT jobject JNICALL
 706 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_visibleFrame
 707 (JNIEnv *env, jclass cls, jlong screenPtr)
 708 {
 709     jobject jRect = NULL;
 710 
 711 JNF_COCOA_ENTER(env);
 712 
 713     __block NSRect rect = NSZeroRect;
 714 
 715     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 716     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 717         rect = [screen visibleFrame];
 718     }];
 719 
 720     jRect = NSToJavaRect(env, rect);
 721 
 722 JNF_COCOA_EXIT(env);
 723 
 724     return jRect;
 725 }
 726 
 727 /*
 728  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 729  * Method:    screenByDisplayId
 730  * Signature: (J)J
 731  */
 732 JNIEXPORT jlong JNICALL
 733 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screenByDisplayId
 734 (JNIEnv *env, jclass cls, jint displayID)
 735 {
 736     __block jlong screenPtr = 0L;
 737 
 738 JNF_COCOA_ENTER(env);
 739 
 740     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 741         NSArray *screens = [NSScreen screens];
 742         for (NSScreen *screen in screens) {
 743             NSDictionary *screenInfo = [screen deviceDescription];
 744             NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
 745             if ([screenID intValue] == displayID){
 746                 CFRetain(screen); // GC
 747                 screenPtr = ptr_to_jlong(screen);
 748                 break;
 749             }
 750         }
 751     }];
 752 
 753 JNF_COCOA_EXIT(env);
 754 
 755     return screenPtr;
 756 }
 757 
 758 /*
 759  * Class:     sun_lwawt_macosx_CWrapper$NSColor
 760  * Method:    clearColor
 761  * Signature: ()J
 762  */
 763 JNIEXPORT jlong JNICALL
 764 Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor
 765 (JNIEnv *env, jclass cls)
 766 {
 767     __block jlong clearColorPtr = 0L;
 768 
 769 JNF_COCOA_ENTER(env);
 770 
 771     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 772         clearColorPtr = ptr_to_jlong([NSColor clearColor]);
 773     }];
 774 
 775 JNF_COCOA_EXIT(env);
 776 
 777     return clearColorPtr;
 778 }
 779