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:YES 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:YES 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$NSWindow
 486  * Method:    toggleFullScreen
 487  * Signature: (JJ)V
 488  */
 489 JNIEXPORT void JNICALL
 490 Java_sun_lwawt_macosx_CWrapper_00024NSWindow_toggleFullScreen
 491 (JNIEnv *env, jclass cls, jlong windowPtr, jlong senderPtr)
 492 {
 493 JNF_COCOA_ENTER(env);
 494 
 495     NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
 496     SEL toggleFullScreenSelector = @selector(toggleFullScreen:);
 497 
 498     if ([window respondsToSelector:toggleFullScreenSelector]) {
 499         id sender = (id)jlong_to_ptr(senderPtr);
 500 
 501         [JNFRunLoop performOnMainThread:toggleFullScreenSelector
 502                                      on:window
 503                              withObject:sender
 504                           waitUntilDone:NO];
 505     }
 506 
 507 JNF_COCOA_EXIT(env);
 508 }
 509 
 510 /*
 511  * Class:     sun_lwawt_macosx_CWrapper$NSView
 512  * Method:    addSubview
 513  * Signature: (JJ)V
 514  */
 515 JNIEXPORT void JNICALL
 516 Java_sun_lwawt_macosx_CWrapper_00024NSView_addSubview
 517 (JNIEnv *env, jclass cls, jlong viewPtr, jlong subviewPtr)
 518 {
 519 JNF_COCOA_ENTER(env);
 520 
 521     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 522     NSView *subview = (NSView *)jlong_to_ptr(subviewPtr);
 523     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 524         [view addSubview:subview];
 525     }];
 526 
 527 JNF_COCOA_EXIT(env);
 528 }
 529 
 530 /*
 531  * Class:     sun_lwawt_macosx_CWrapper$NSView
 532  * Method:    removeFromSuperview
 533  * Signature: (J)V
 534  */
 535 JNIEXPORT void JNICALL
 536 Java_sun_lwawt_macosx_CWrapper_00024NSView_removeFromSuperview
 537 (JNIEnv *env, jclass cls, jlong viewPtr)
 538 {
 539 JNF_COCOA_ENTER(env);
 540 
 541     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 542     [JNFRunLoop performOnMainThread:@selector(removeFromSuperview)
 543                                  on:view
 544                          withObject:nil
 545                       waitUntilDone:NO];
 546 
 547 JNF_COCOA_EXIT(env);
 548 }
 549 
 550 /*
 551  * Class:     sun_lwawt_macosx_CWrapper$NSView
 552  * Method:    setFrame
 553  * Signature: (JIIII)V
 554  */
 555 JNIEXPORT void JNICALL
 556 Java_sun_lwawt_macosx_CWrapper_00024NSView_setFrame
 557 (JNIEnv *env, jclass cls, jlong viewPtr, jint x, jint y, jint w, jint h)
 558 {
 559 JNF_COCOA_ENTER(env);
 560 
 561     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 562     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 563         [view setFrame:NSMakeRect(x, y, w, h)];
 564     }];
 565 
 566 JNF_COCOA_EXIT(env);
 567 }
 568 
 569 /*
 570  * Class:     sun_lwawt_macosx_CWrapper$NSView
 571  * Method:    frame
 572  * Signature: (J)Ljava/awt/Rectangle;
 573  */
 574 JNIEXPORT jobject JNICALL
 575 Java_sun_lwawt_macosx_CWrapper_00024NSView_frame
 576 (JNIEnv *env, jclass cls, jlong viewPtr)
 577 {
 578     jobject jRect = NULL;
 579 
 580 JNF_COCOA_ENTER(env);
 581 
 582     __block NSRect rect = NSZeroRect;
 583 
 584     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 585     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 586         rect = [view frame];
 587     }];
 588 
 589     jRect = NSToJavaRect(env, rect);
 590 
 591 JNF_COCOA_EXIT(env);
 592 
 593     return jRect;
 594 }
 595 
 596 /*
 597  * Class:     sun_lwawt_macosx_CWrapper$NSView
 598  * Method:    window
 599  * Signature: (J)J
 600  */
 601 JNIEXPORT jlong JNICALL
 602 Java_sun_lwawt_macosx_CWrapper_00024NSView_window
 603 (JNIEnv *env, jclass cls, jlong viewPtr)
 604 {
 605     __block jlong windowPtr = 0L;
 606 
 607 JNF_COCOA_ENTER(env);
 608 
 609     NSView *view = (NSView *)jlong_to_ptr(viewPtr);
 610     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 611         windowPtr = ptr_to_jlong([view window]);
 612     }];
 613 
 614 JNF_COCOA_EXIT(env);
 615 
 616     return windowPtr;
 617 }
 618 
 619 /*
 620  * Class:     sun_lwawt_macosx_CWrapper$NSScreen
 621  * Method:    frame
 622  * Signature: (J)Ljava/awt/Rectangle;
 623  */
 624 JNIEXPORT jobject JNICALL
 625 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_frame
 626 (JNIEnv *env, jclass cls, jlong screenPtr)
 627 {
 628     jobject jRect = NULL;
 629 
 630 JNF_COCOA_ENTER(env);
 631 
 632     __block NSRect rect = NSZeroRect;
 633 
 634     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 635     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 636         rect = [screen frame];
 637     }];
 638 
 639     jRect = NSToJavaRect(env, rect);
 640 
 641 JNF_COCOA_EXIT(env);
 642 
 643     return jRect;
 644 }
 645 
 646 /*
 647  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 648  * Method:    visibleFrame
 649  * Signature: (J)Ljava/awt/geom/Rectangle2D;
 650  */
 651 JNIEXPORT jobject JNICALL
 652 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_visibleFrame
 653 (JNIEnv *env, jclass cls, jlong screenPtr)
 654 {
 655     jobject jRect = NULL;
 656 
 657 JNF_COCOA_ENTER(env);
 658 
 659     __block NSRect rect = NSZeroRect;
 660 
 661     NSScreen *screen = (NSScreen *)jlong_to_ptr(screenPtr);
 662     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 663         rect = [screen visibleFrame];
 664     }];
 665 
 666     jRect = NSToJavaRect(env, rect);
 667 
 668 JNF_COCOA_EXIT(env);
 669 
 670     return jRect;
 671 }
 672 
 673 /*
 674  * Class:     sun_lwawt_macosx_CWrapper_NSScreen
 675  * Method:    screenByDisplayId
 676  * Signature: (J)J
 677  */
 678 JNIEXPORT jlong JNICALL
 679 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screenByDisplayId
 680 (JNIEnv *env, jclass cls, jint displayID)
 681 {
 682     __block jlong screenPtr = 0L;
 683 
 684 JNF_COCOA_ENTER(env);
 685 
 686     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 687         NSArray *screens = [NSScreen screens];
 688         for (NSScreen *screen in screens) {
 689             NSDictionary *screenInfo = [screen deviceDescription];
 690             NSNumber *screenID = [screenInfo objectForKey:@"NSScreenNumber"];
 691             if ([screenID intValue] == displayID){
 692                 CFRetain(screen); // GC
 693                 screenPtr = ptr_to_jlong(screen);
 694                 break;
 695             }
 696         }
 697     }];
 698 
 699 JNF_COCOA_EXIT(env);
 700 
 701     return screenPtr;
 702 }
 703 
 704 /*
 705  * Class:     sun_lwawt_macosx_CWrapper$NSScreen
 706  * Method:    screens
 707  * Signature: (I)J
 708  */
 709 JNIEXPORT jlong JNICALL
 710 Java_sun_lwawt_macosx_CWrapper_00024NSScreen_screens
 711 (JNIEnv *env, jclass cls, jint i)
 712 {
 713     __block jlong screenPtr = 0L;
 714 
 715 JNF_COCOA_ENTER(env);
 716 
 717     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 718         screenPtr = ptr_to_jlong([[[NSScreen screens] objectAtIndex:i] retain]);
 719     }];
 720 
 721 JNF_COCOA_EXIT(env);
 722 
 723     return screenPtr;
 724 }
 725 
 726 /*
 727  * Class:     sun_lwawt_macosx_CWrapper$NSMenu
 728  * Method:    setMenuBarVisible
 729  * Signature: (Z)V
 730  */
 731 JNIEXPORT jlong JNICALL
 732 Java_sun_lwawt_macosx_CWrapper_00024NSMenu_setMenuBarVisible
 733 (JNIEnv *env, jclass cls, jboolean visible)
 734 {
 735 JNF_COCOA_ENTER(env);
 736 
 737     [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){
 738         [NSMenu setMenuBarVisible: visible];
 739     }];
 740 
 741 JNF_COCOA_EXIT(env);
 742 }
 743 
 744 /*
 745  * Class:     sun_lwawt_macosx_CWrapper$NSColor
 746  * Method:    clearColor
 747  * Signature: ()J
 748  */
 749 JNIEXPORT jlong JNICALL
 750 Java_sun_lwawt_macosx_CWrapper_00024NSColor_clearColor
 751 (JNIEnv *env, jclass cls)
 752 {
 753     __block jlong clearColorPtr = 0L;
 754 
 755 JNF_COCOA_ENTER(env);
 756 
 757     [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
 758         clearColorPtr = ptr_to_jlong([NSColor clearColor]);
 759     }];
 760 
 761 JNF_COCOA_EXIT(env);
 762 
 763     return clearColorPtr;
 764 }
 765