498 [image lockFocus]; 499 [view drawRect:frame]; 500 [image unlockFocus]; 501 [image autorelease]; 502 return image; 503 } 504 505 @end 506 507 508 #pragma mark Native JNI calls 509 510 /* 511 * Class: com_apple_eawt_Application 512 * Method: nativeInitializeApplicationDelegate 513 * Signature: ()V 514 */ 515 JNIEXPORT void JNICALL Java_com_apple_eawt_Application_nativeInitializeApplicationDelegate 516 (JNIEnv *env, jclass clz) 517 { 518 AWT_ASSERT_NOT_APPKIT_THREAD; 519 JNF_COCOA_ENTER(env); 520 // Force initialization to happen on AppKit thread! 521 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 522 [ApplicationDelegate sharedDelegate]; 523 }]; 524 JNF_COCOA_EXIT(env); 525 } 526 527 /* 528 * Class: com_apple_eawt__AppEventHandler 529 * Method: nativeOpenCocoaAboutWindow 530 * Signature: ()V 531 */ 532 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeOpenCocoaAboutWindow 533 (JNIEnv *env, jclass clz) 534 { 535 AWT_ASSERT_NOT_APPKIT_THREAD; 536 JNF_COCOA_ENTER(env); 537 538 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 539 [NSApp orderFrontStandardAboutPanel:nil]; 540 }]; 541 542 JNF_COCOA_EXIT(env); 543 } 544 545 /* 546 * Class: com_apple_eawt__AppEventHandler 547 * Method: nativeReplyToAppShouldTerminate 548 * Signature: (Z)V 549 */ 550 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeReplyToAppShouldTerminate 551 (JNIEnv *env, jclass clz, jboolean doTerminate) 552 { 553 AWT_ASSERT_NOT_APPKIT_THREAD; 554 JNF_COCOA_ENTER(env); 555 556 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 557 [NSApp replyToApplicationShouldTerminate:doTerminate]; 558 }]; 559 560 JNF_COCOA_EXIT(env); 561 } 562 563 /* 564 * Class: com_apple_eawt__AppEventHandler 565 * Method: nativeRegisterForNotification 566 * Signature: (I)V 567 */ 568 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeRegisterForNotification 569 (JNIEnv *env, jclass clz, jint notificationType) 570 { 571 AWT_ASSERT_NOT_APPKIT_THREAD; 572 JNF_COCOA_ENTER(env); 573 [ThreadUtilities performOnMainThread:@selector(_registerForNotification:) 574 onObject:[ApplicationDelegate class] 575 withObject:[NSNumber numberWithInt:notificationType] 576 waitUntilDone:NO 577 awtMode:NO]; // AWT_THREADING Safe (non-blocking) 578 JNF_COCOA_EXIT(env); 579 } 580 581 /* 582 * Class: com_apple_eawt__AppDockIconHandler 583 * Method: nativeSetDockMenu 584 * Signature: (J)V 585 */ 586 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockMenu 587 (JNIEnv *env, jclass clz, jlong nsMenuPtr) 588 { 589 AWT_ASSERT_NOT_APPKIT_THREAD; 590 JNF_COCOA_ENTER(env); 591 592 NSMenu *menu = (NSMenu *)jlong_to_ptr(nsMenuPtr); 593 [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ 594 AWT_ASSERT_APPKIT_THREAD; 595 596 [ApplicationDelegate sharedDelegate].fDockMenu = menu; 597 }]; 598 599 JNF_COCOA_EXIT(env); 600 } 601 602 /* 603 * Class: com_apple_eawt__AppDockIconHandler 604 * Method: nativeSetDockIconImage 605 * Signature: (J)V 606 */ 607 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconImage 608 (JNIEnv *env, jclass clz, jlong nsImagePtr) 609 { 610 AWT_ASSERT_NOT_APPKIT_THREAD; 611 JNF_COCOA_ENTER(env); 612 613 NSImage *_image = (NSImage *)jlong_to_ptr(nsImagePtr); 614 [JNFRunLoop performOnMainThread:@selector(_setDockIconImage:) 615 on:[ApplicationDelegate class] 616 withObject:_image 617 waitUntilDone:NO]; 618 619 JNF_COCOA_EXIT(env); 620 } 621 622 /* 623 * Class: com_apple_eawt__AppDockIconHandler 624 * Method: nativeGetDockIconImage 625 * Signature: ()J 626 */ 627 JNIEXPORT jlong JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeGetDockIconImage 628 (JNIEnv *env, jclass clz) 629 { 630 __block NSImage *image = nil; 631 632 AWT_ASSERT_NOT_APPKIT_THREAD; 633 JNF_COCOA_ENTER(env); 634 635 [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ 636 AWT_ASSERT_APPKIT_THREAD; 637 638 image = [ApplicationDelegate _dockIconImage]; 639 CFRetain(image); 640 }]; 641 642 JNF_COCOA_EXIT(env); 643 644 return ptr_to_jlong(image); 645 } 646 647 /* 648 * Class: com_apple_eawt__AppDockIconHandler 649 * Method: nativeSetDockIconBadge 650 * Signature: (Ljava/lang/String;)V 651 */ 652 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconBadge 653 (JNIEnv *env, jclass clz, jstring badge) 654 { 655 AWT_ASSERT_NOT_APPKIT_THREAD; 656 JNF_COCOA_ENTER(env); 657 658 NSString *badgeString = JNFJavaToNSString(env, badge); 659 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 660 AWT_ASSERT_APPKIT_THREAD; 661 662 NSDockTile *dockTile = [NSApp dockTile]; 663 [dockTile setBadgeLabel:badgeString]; 664 [dockTile display]; 665 }]; 666 667 JNF_COCOA_EXIT(env); 668 } 669 670 /* 671 * Class: com_apple_eawt__AppMiscHandlers 672 * Method: nativeRequestActivation 673 * Signature: (Z)V 674 */ 675 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestActivation 676 (JNIEnv *env, jclass clz, jboolean allWindows) 677 { 678 AWT_ASSERT_NOT_APPKIT_THREAD; 679 JNF_COCOA_ENTER(env); 680 681 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 682 AWT_ASSERT_APPKIT_THREAD; 683 684 NSApplicationActivationOptions options = allWindows ? NSApplicationActivateAllWindows : 0; 685 options |= NSApplicationActivateIgnoringOtherApps; // without this, nothing happens! 686 [[NSRunningApplication currentApplication] activateWithOptions:options]; 687 }]; 688 689 JNF_COCOA_EXIT(env); 690 } 691 692 /* 693 * Class: com_apple_eawt__AppMiscHandlers 694 * Method: nativeRequestUserAttention 695 * Signature: (Z)V 696 */ 697 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestUserAttention 698 (JNIEnv *env, jclass clz, jboolean critical) 699 { 700 AWT_ASSERT_NOT_APPKIT_THREAD; 701 JNF_COCOA_ENTER(env); 702 703 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 704 AWT_ASSERT_APPKIT_THREAD; 705 706 [NSApp requestUserAttention:critical ? NSCriticalRequest : NSInformationalRequest]; 707 }]; 708 709 JNF_COCOA_EXIT(env); 710 } 711 712 /* 713 * Class: com_apple_eawt__AppMiscHandlers 714 * Method: nativeOpenHelpViewer 715 * Signature: ()V 716 */ 717 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeOpenHelpViewer 718 (JNIEnv *env, jclass clz) 719 { 720 AWT_ASSERT_NOT_APPKIT_THREAD; 721 JNF_COCOA_ENTER(env); 722 723 [JNFRunLoop performOnMainThread:@selector(showHelp:) 724 on:NSApp 725 withObject:nil 726 waitUntilDone:NO]; 727 728 JNF_COCOA_EXIT(env); 729 } 730 731 /* 732 * Class: com_apple_eawt__AppMiscHandlers 733 * Method: nativeEnableSuddenTermination 734 * Signature: ()V 735 */ 736 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeEnableSuddenTermination 737 (JNIEnv *env, jclass clz) 738 { 739 AWT_ASSERT_NOT_APPKIT_THREAD; 740 JNF_COCOA_ENTER(env); 741 742 [[NSProcessInfo processInfo] enableSuddenTermination]; // Foundation thread-safe 743 744 JNF_COCOA_EXIT(env); 745 } 746 747 /* 748 * Class: com_apple_eawt__AppMiscHandlers 749 * Method: nativeDisableSuddenTermination 750 * Signature: ()V 751 */ 752 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeDisableSuddenTermination 753 (JNIEnv *env, jclass clz) 754 { 755 AWT_ASSERT_NOT_APPKIT_THREAD; 756 JNF_COCOA_ENTER(env); 757 758 [[NSProcessInfo processInfo] disableSuddenTermination]; // Foundation thread-safe 759 760 JNF_COCOA_EXIT(env); 761 } 762 763 /* 764 * Class: com_apple_eawt__AppMenuBarHandler 765 * Method: nativeSetMenuState 766 * Signature: (IZZ)V 767 */ 768 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetMenuState 769 (JNIEnv *env, jclass clz, jint menuID, jboolean visible, jboolean enabled) 770 { 771 AWT_ASSERT_NOT_APPKIT_THREAD; 772 JNF_COCOA_ENTER(env); 773 774 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 775 AWT_ASSERT_APPKIT_THREAD; 776 777 ApplicationDelegate *delegate = [ApplicationDelegate sharedDelegate]; 778 switch (menuID) { 779 case com_apple_eawt__AppMenuBarHandler_MENU_ABOUT: 780 [delegate _updateAboutMenu:visible enabled:enabled]; 781 break; 782 case com_apple_eawt__AppMenuBarHandler_MENU_PREFS: 783 [delegate _updatePreferencesMenu:visible enabled:enabled]; 784 break; 785 } 786 }]; 787 788 JNF_COCOA_EXIT(env); 789 } 790 791 /* 792 * Class: com_apple_eawt__AppMenuBarHandler 793 * Method: nativeSetDefaultMenuBar 794 * Signature: (J)V 795 */ 796 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetDefaultMenuBar 797 (JNIEnv *env, jclass clz, jlong cMenuBarPtr) 798 { 799 AWT_ASSERT_NOT_APPKIT_THREAD; 800 JNF_COCOA_ENTER(env); 801 802 CMenuBar *menu = (CMenuBar *)jlong_to_ptr(cMenuBarPtr); 803 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 804 AWT_ASSERT_APPKIT_THREAD; 805 [ApplicationDelegate sharedDelegate].fDefaultMenuBar = menu; 806 }]; 807 808 JNF_COCOA_EXIT(env); 809 } | 498 [image lockFocus]; 499 [view drawRect:frame]; 500 [image unlockFocus]; 501 [image autorelease]; 502 return image; 503 } 504 505 @end 506 507 508 #pragma mark Native JNI calls 509 510 /* 511 * Class: com_apple_eawt_Application 512 * Method: nativeInitializeApplicationDelegate 513 * Signature: ()V 514 */ 515 JNIEXPORT void JNICALL Java_com_apple_eawt_Application_nativeInitializeApplicationDelegate 516 (JNIEnv *env, jclass clz) 517 { 518 JNF_COCOA_ENTER(env); 519 // Force initialization to happen on AppKit thread! 520 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 521 [ApplicationDelegate sharedDelegate]; 522 }]; 523 JNF_COCOA_EXIT(env); 524 } 525 526 /* 527 * Class: com_apple_eawt__AppEventHandler 528 * Method: nativeOpenCocoaAboutWindow 529 * Signature: ()V 530 */ 531 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeOpenCocoaAboutWindow 532 (JNIEnv *env, jclass clz) 533 { 534 JNF_COCOA_ENTER(env); 535 536 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 537 [NSApp orderFrontStandardAboutPanel:nil]; 538 }]; 539 540 JNF_COCOA_EXIT(env); 541 } 542 543 /* 544 * Class: com_apple_eawt__AppEventHandler 545 * Method: nativeReplyToAppShouldTerminate 546 * Signature: (Z)V 547 */ 548 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeReplyToAppShouldTerminate 549 (JNIEnv *env, jclass clz, jboolean doTerminate) 550 { 551 JNF_COCOA_ENTER(env); 552 553 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 554 [NSApp replyToApplicationShouldTerminate:doTerminate]; 555 }]; 556 557 JNF_COCOA_EXIT(env); 558 } 559 560 /* 561 * Class: com_apple_eawt__AppEventHandler 562 * Method: nativeRegisterForNotification 563 * Signature: (I)V 564 */ 565 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeRegisterForNotification 566 (JNIEnv *env, jclass clz, jint notificationType) 567 { 568 JNF_COCOA_ENTER(env); 569 [ThreadUtilities performOnMainThread:@selector(_registerForNotification:) 570 onObject:[ApplicationDelegate class] 571 withObject:[NSNumber numberWithInt:notificationType] 572 waitUntilDone:NO 573 awtMode:NO]; // AWT_THREADING Safe (non-blocking) 574 JNF_COCOA_EXIT(env); 575 } 576 577 /* 578 * Class: com_apple_eawt__AppDockIconHandler 579 * Method: nativeSetDockMenu 580 * Signature: (J)V 581 */ 582 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockMenu 583 (JNIEnv *env, jclass clz, jlong nsMenuPtr) 584 { 585 JNF_COCOA_ENTER(env); 586 587 NSMenu *menu = (NSMenu *)jlong_to_ptr(nsMenuPtr); 588 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 589 [ApplicationDelegate sharedDelegate].fDockMenu = menu; 590 }]; 591 592 JNF_COCOA_EXIT(env); 593 } 594 595 /* 596 * Class: com_apple_eawt__AppDockIconHandler 597 * Method: nativeSetDockIconImage 598 * Signature: (J)V 599 */ 600 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconImage 601 (JNIEnv *env, jclass clz, jlong nsImagePtr) 602 { 603 JNF_COCOA_ENTER(env); 604 605 NSImage *_image = (NSImage *)jlong_to_ptr(nsImagePtr); 606 [ThreadUtilities performOnMainThread:@selector(_setDockIconImage:) 607 on:[ApplicationDelegate class] 608 withObject:_image 609 waitUntilDone:NO]; 610 611 JNF_COCOA_EXIT(env); 612 } 613 614 /* 615 * Class: com_apple_eawt__AppDockIconHandler 616 * Method: nativeGetDockIconImage 617 * Signature: ()J 618 */ 619 JNIEXPORT jlong JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeGetDockIconImage 620 (JNIEnv *env, jclass clz) 621 { 622 __block NSImage *image = nil; 623 624 JNF_COCOA_ENTER(env); 625 626 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 627 image = [ApplicationDelegate _dockIconImage]; 628 CFRetain(image); 629 }]; 630 631 JNF_COCOA_EXIT(env); 632 633 return ptr_to_jlong(image); 634 } 635 636 /* 637 * Class: com_apple_eawt__AppDockIconHandler 638 * Method: nativeSetDockIconBadge 639 * Signature: (Ljava/lang/String;)V 640 */ 641 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconBadge 642 (JNIEnv *env, jclass clz, jstring badge) 643 { 644 JNF_COCOA_ENTER(env); 645 646 NSString *badgeString = JNFJavaToNSString(env, badge); 647 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 648 NSDockTile *dockTile = [NSApp dockTile]; 649 [dockTile setBadgeLabel:badgeString]; 650 [dockTile display]; 651 }]; 652 653 JNF_COCOA_EXIT(env); 654 } 655 656 /* 657 * Class: com_apple_eawt__AppMiscHandlers 658 * Method: nativeRequestActivation 659 * Signature: (Z)V 660 */ 661 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestActivation 662 (JNIEnv *env, jclass clz, jboolean allWindows) 663 { 664 JNF_COCOA_ENTER(env); 665 666 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 667 NSApplicationActivationOptions options = allWindows ? NSApplicationActivateAllWindows : 0; 668 options |= NSApplicationActivateIgnoringOtherApps; // without this, nothing happens! 669 [[NSRunningApplication currentApplication] activateWithOptions:options]; 670 }]; 671 672 JNF_COCOA_EXIT(env); 673 } 674 675 /* 676 * Class: com_apple_eawt__AppMiscHandlers 677 * Method: nativeRequestUserAttention 678 * Signature: (Z)V 679 */ 680 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestUserAttention 681 (JNIEnv *env, jclass clz, jboolean critical) 682 { 683 JNF_COCOA_ENTER(env); 684 685 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 686 [NSApp requestUserAttention:critical ? NSCriticalRequest : NSInformationalRequest]; 687 }]; 688 689 JNF_COCOA_EXIT(env); 690 } 691 692 /* 693 * Class: com_apple_eawt__AppMiscHandlers 694 * Method: nativeOpenHelpViewer 695 * Signature: ()V 696 */ 697 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeOpenHelpViewer 698 (JNIEnv *env, jclass clz) 699 { 700 JNF_COCOA_ENTER(env); 701 702 [ThreadUtilities performOnMainThread:@selector(showHelp:) 703 on:NSApp 704 withObject:nil 705 waitUntilDone:NO]; 706 707 JNF_COCOA_EXIT(env); 708 } 709 710 /* 711 * Class: com_apple_eawt__AppMiscHandlers 712 * Method: nativeEnableSuddenTermination 713 * Signature: ()V 714 */ 715 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeEnableSuddenTermination 716 (JNIEnv *env, jclass clz) 717 { 718 JNF_COCOA_ENTER(env); 719 720 [[NSProcessInfo processInfo] enableSuddenTermination]; // Foundation thread-safe 721 722 JNF_COCOA_EXIT(env); 723 } 724 725 /* 726 * Class: com_apple_eawt__AppMiscHandlers 727 * Method: nativeDisableSuddenTermination 728 * Signature: ()V 729 */ 730 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeDisableSuddenTermination 731 (JNIEnv *env, jclass clz) 732 { 733 JNF_COCOA_ENTER(env); 734 735 [[NSProcessInfo processInfo] disableSuddenTermination]; // Foundation thread-safe 736 737 JNF_COCOA_EXIT(env); 738 } 739 740 /* 741 * Class: com_apple_eawt__AppMenuBarHandler 742 * Method: nativeSetMenuState 743 * Signature: (IZZ)V 744 */ 745 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetMenuState 746 (JNIEnv *env, jclass clz, jint menuID, jboolean visible, jboolean enabled) 747 { 748 JNF_COCOA_ENTER(env); 749 750 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 751 ApplicationDelegate *delegate = [ApplicationDelegate sharedDelegate]; 752 switch (menuID) { 753 case com_apple_eawt__AppMenuBarHandler_MENU_ABOUT: 754 [delegate _updateAboutMenu:visible enabled:enabled]; 755 break; 756 case com_apple_eawt__AppMenuBarHandler_MENU_PREFS: 757 [delegate _updatePreferencesMenu:visible enabled:enabled]; 758 break; 759 } 760 }]; 761 762 JNF_COCOA_EXIT(env); 763 } 764 765 /* 766 * Class: com_apple_eawt__AppMenuBarHandler 767 * Method: nativeSetDefaultMenuBar 768 * Signature: (J)V 769 */ 770 JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetDefaultMenuBar 771 (JNIEnv *env, jclass clz, jlong cMenuBarPtr) 772 { 773 JNF_COCOA_ENTER(env); 774 775 CMenuBar *menu = (CMenuBar *)jlong_to_ptr(cMenuBarPtr); 776 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 777 [ApplicationDelegate sharedDelegate].fDefaultMenuBar = menu; 778 }]; 779 780 JNF_COCOA_EXIT(env); 781 } |