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