< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/awt/ApplicationDelegate.m
Print this page
rev 54094 : 8257853: Remove dependencies on JNF's JNI utility functions in AWT and 2D code
rev 54096 : 8259651: [macOS] Replace JNF_COCOA_ENTER/EXIT macros
rev 54098 : 8260616: Removing remaining JNF dependencies in the java.desktop module
8259729: Missed JNFInstanceOf -> IsInstanceOf conversion
@@ -30,15 +30,14 @@
#import "com_apple_eawt__AppEventHandler.h"
#import "com_apple_eawt__AppMenuBarHandler.h"
#import "com_apple_eawt__AppMenuBarHandler.h"
#import "com_apple_eawt__AppMiscHandlers.h"
-#import <JavaNativeFoundation/JavaNativeFoundation.h>
-
#import "CPopupMenu.h"
#import "ThreadUtilities.h"
#import "NSApplicationAWT.h"
+#import "JNIUtilities.h"
#pragma mark App Menu helpers
// The following is a AWT convention?
@@ -241,13 +240,15 @@
BOOL prefsAvailable = ([self.fPreferencesMenu menu] != nil);
BOOL prefsEnabled = (prefsAvailable && [self.fPreferencesMenu isEnabled] && ([self.fPreferencesMenu target] != nil));
JNIEnv *env = [ThreadUtilities getJNIEnv];
- static JNF_CLASS_CACHE(sjc_AppMenuBarHandler, "com/apple/eawt/_AppMenuBarHandler");
- static JNF_STATIC_MEMBER_CACHE(sjm_initMenuStates, sjc_AppMenuBarHandler, "initMenuStates", "(ZZZZ)V");
- JNFCallStaticVoidMethod(env, sjm_initMenuStates, aboutAvailable, aboutEnabled, prefsAvailable, prefsEnabled);
+ DECLARE_CLASS_RETURN(sjc_AppMenuBarHandler, "com/apple/eawt/_AppMenuBarHandler", NULL);
+ DECLARE_STATIC_METHOD_RETURN(sjm_initMenuStates, sjc_AppMenuBarHandler, "initMenuStates", "(ZZZZ)V", NULL);
+ (*env)->CallStaticVoidMethod(env, sjc_AppMenuBarHandler, sjm_initMenuStates,
+ aboutAvailable, aboutEnabled, prefsAvailable, prefsEnabled);
+ CHECK_EXCEPTION();
// register for the finish launching and system power off notifications by default
NSNotificationCenter *ctr = [NSNotificationCenter defaultCenter];
Class clz = [ApplicationDelegate class];
[ctr addObserver:clz selector:@selector(_willFinishLaunching) name:NSApplicationWillFinishLaunchingNotification object:nil];
@@ -270,39 +271,54 @@
[super dealloc];
}
#pragma mark Callbacks from AppKit
-static JNF_CLASS_CACHE(sjc_AppEventHandler, "com/apple/eawt/_AppEventHandler");
+static jclass sjc_AppEventHandler = NULL;
+#define GET_APPEVENTHANDLER_CLASS() \
+ GET_CLASS(sjc_AppEventHandler, "com/apple/eawt/_AppEventHandler");
+
+#define GET_APPEVENTHANDLER_CLASS_RETURN(ret) \
+ GET_CLASS_RETURN(sjc_AppEventHandler, "com/apple/eawt/_AppEventHandler", ret);
- (void)_handleOpenURLEvent:(NSAppleEventDescriptor *)openURLEvent withReplyEvent:(NSAppleEventDescriptor *)replyEvent {
AWT_ASSERT_APPKIT_THREAD;
if (!fHandlesURLTypes) return;
NSString *url = [[openURLEvent paramDescriptorForKeyword:keyDirectObject] stringValue];
//fprintf(stderr,"jm_handleOpenURL\n");
JNIEnv *env = [ThreadUtilities getJNIEnv];
- jstring jURL = JNFNSToJavaString(env, url);
- static JNF_STATIC_MEMBER_CACHE(jm_handleOpenURI, sjc_AppEventHandler, "handleOpenURI", "(Ljava/lang/String;)V");
- JNFCallStaticVoidMethod(env, jm_handleOpenURI, jURL); // AWT_THREADING Safe (event)
+ jstring jURL = NSStringToJavaString(env, url);
+ GET_APPEVENTHANDLER_CLASS();
+ DECLARE_STATIC_METHOD(jm_handleOpenURI, sjc_AppEventHandler, "handleOpenURI", "(Ljava/lang/String;)V");
+ (*env)->CallStaticVoidMethod(env, sjc_AppEventHandler, jm_handleOpenURI, jURL);
+ CHECK_EXCEPTION();
(*env)->DeleteLocalRef(env, jURL);
[replyEvent insertDescriptor:[NSAppleEventDescriptor nullDescriptor] atIndex:0];
}
// Helper for both open file and print file methods
// Creates a Java list of files from a native list of files
- (jobject)_createFilePathArrayFrom:(NSArray *)filenames withEnv:(JNIEnv *)env {
- static JNF_CLASS_CACHE(sjc_ArrayList, "java/util/ArrayList");
- static JNF_CTOR_CACHE(jm_ArrayList_ctor, sjc_ArrayList, "(I)V");
- static JNF_MEMBER_CACHE(jm_ArrayList_add, sjc_ArrayList, "add", "(Ljava/lang/Object;)Z");
+ static jclass sjc_ArrayList = NULL;
+ if (sjc_ArrayList == NULL) {
+ sjc_ArrayList = (*env)->FindClass(env, "java/util/ArrayList");
+ if (sjc_ArrayList != NULL) sjc_ArrayList = (*env)->NewGlobalRef(env, sjc_ArrayList); \
+ }
+ CHECK_NULL_RETURN(sjc_ArrayList, NULL);
+ DECLARE_METHOD_RETURN(jm_ArrayList_ctor, sjc_ArrayList, "<init>", "(I)V", NULL);
+ DECLARE_METHOD_RETURN(jm_ArrayList_add, sjc_ArrayList, "add", "(Ljava/lang/Object;)Z", NULL);
+
+ jobject jFileNamesArray = (*env)->NewObject(env, sjc_ArrayList, jm_ArrayList_ctor, (jint)[filenames count]);
+ CHECK_EXCEPTION_NULL_RETURN(jFileNamesArray, NULL);
- jobject jFileNamesArray = JNFNewObject(env, jm_ArrayList_ctor, (jint)[filenames count]); // AWT_THREADING Safe (known object)
for (NSString *filename in filenames) {
- jstring jFileName = JNFNormalizedJavaStringForPath(env, filename);
- JNFCallVoidMethod(env, jFileNamesArray, jm_ArrayList_add, jFileName);
+ jstring jFileName = NormalizedPathJavaStringFromNSString(env, filename);
+ (*env)->CallVoidMethod(env, jFileNamesArray, jm_ArrayList_add, jFileName);
+ CHECK_EXCEPTION();
}
return jFileNamesArray;
}
@@ -318,17 +334,20 @@
JNIEnv *env = [ThreadUtilities getJNIEnv];
// if these files were opened from a Spotlight query, try to get the search text from the current AppleEvent
NSAppleEventDescriptor *currentEvent = [[NSAppleEventManager sharedAppleEventManager] currentAppleEvent];
NSString *searchString = [[currentEvent paramDescriptorForKeyword:keyAESearchText] stringValue];
- jstring jSearchString = JNFNSToJavaString(env, searchString);
+ jstring jSearchString = NSStringToJavaString(env, searchString);
// convert the file names array
jobject jFileNamesArray = [self _createFilePathArrayFrom:fileNames withEnv:env];
- static JNF_STATIC_MEMBER_CACHE(jm_handleOpenFiles, sjc_AppEventHandler, "handleOpenFiles", "(Ljava/util/List;Ljava/lang/String;)V");
- JNFCallStaticVoidMethod(env, jm_handleOpenFiles, jFileNamesArray, jSearchString);
+ GET_APPEVENTHANDLER_CLASS();
+ DECLARE_STATIC_METHOD(jm_handleOpenFiles, sjc_AppEventHandler,
+ "handleOpenFiles", "(Ljava/util/List;Ljava/lang/String;)V");
+ (*env)->CallStaticVoidMethod(env, sjc_AppEventHandler, jm_handleOpenFiles, jFileNamesArray, jSearchString);
+ CHECK_EXCEPTION();
(*env)->DeleteLocalRef(env, jFileNamesArray);
(*env)->DeleteLocalRef(env, jSearchString);
[theApplication replyToOpenOrPrint:NSApplicationDelegateReplySuccess];
}
@@ -339,12 +358,15 @@
if (!fHandlesDocumentTypes) return NSPrintingCancelled;
//fprintf(stderr,"jm_handlePrintFile\n");
JNIEnv *env = [ThreadUtilities getJNIEnv];
jobject jFileNamesArray = [self _createFilePathArrayFrom:fileNames withEnv:env];
- static JNF_STATIC_MEMBER_CACHE(jm_handlePrintFile, sjc_AppEventHandler, "handlePrintFiles", "(Ljava/util/List;)V");
- JNFCallStaticVoidMethod(env, jm_handlePrintFile, jFileNamesArray); // AWT_THREADING Safe (event)
+ GET_APPEVENTHANDLER_CLASS_RETURN(NSPrintingCancelled);
+ DECLARE_STATIC_METHOD_RETURN(jm_handlePrintFile, sjc_AppEventHandler,
+ "handlePrintFiles", "(Ljava/util/List;)V", NSPrintingCancelled);
+ (*env)->CallStaticVoidMethod(env, sjc_AppEventHandler, jm_handlePrintFile, jFileNamesArray);
+ CHECK_EXCEPTION();
(*env)->DeleteLocalRef(env, jFileNamesArray);
return NSPrintingSuccess;
}
@@ -352,12 +374,14 @@
+ (void)_notifyJava:(jint)notificationType {
AWT_ASSERT_APPKIT_THREAD;
//fprintf(stderr,"jm_handleOpenApplication\n");
JNIEnv *env = [ThreadUtilities getJNIEnv];
- static JNF_STATIC_MEMBER_CACHE(jm_handleNativeNotification, sjc_AppEventHandler, "handleNativeNotification", "(I)V");
- JNFCallStaticVoidMethod(env, jm_handleNativeNotification, notificationType); // AWT_THREADING Safe (event)
+ GET_APPEVENTHANDLER_CLASS();
+ DECLARE_STATIC_METHOD(jm_handleNativeNotification, sjc_AppEventHandler, "handleNativeNotification", "(I)V");
+ (*env)->CallStaticVoidMethod(env, sjc_AppEventHandler, jm_handleNativeNotification, notificationType);
+ CHECK_EXCEPTION();
}
// About menu handler
- (void)_aboutMenuHandler {
[ApplicationDelegate _notifyJava:com_apple_eawt__AppEventHandler_NOTIFY_ABOUT];
@@ -542,121 +566,121 @@
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt_Application_nativeInitializeApplicationDelegate
(JNIEnv *env, jclass clz)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
// Force initialization to happen on AppKit thread!
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[ApplicationDelegate sharedDelegate];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppEventHandler
* Method: nativeOpenCocoaAboutWindow
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeOpenCocoaAboutWindow
(JNIEnv *env, jclass clz)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[NSApp orderFrontStandardAboutPanel:nil];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppEventHandler
* Method: nativeReplyToAppShouldTerminate
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeReplyToAppShouldTerminate
(JNIEnv *env, jclass clz, jboolean doTerminate)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[NSApp replyToApplicationShouldTerminate:doTerminate];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppEventHandler
* Method: nativeRegisterForNotification
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppEventHandler_nativeRegisterForNotification
(JNIEnv *env, jclass clz, jint notificationType)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThread:@selector(_registerForNotification:)
on:[ApplicationDelegate class]
withObject:[NSNumber numberWithInt:notificationType]
- waitUntilDone:NO]; // AWT_THREADING Safe (non-blocking)
-JNF_COCOA_EXIT(env);
+ waitUntilDone:NO];
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppDockIconHandler
* Method: nativeSetDockMenu
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockMenu
(JNIEnv *env, jclass clz, jlong nsMenuPtr)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
NSMenu *menu = (NSMenu *)jlong_to_ptr(nsMenuPtr);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
[ApplicationDelegate sharedDelegate].fDockMenu = menu;
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppDockIconHandler
* Method: nativeSetDockIconImage
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconImage
(JNIEnv *env, jclass clz, jlong nsImagePtr)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
NSImage *_image = (NSImage *)jlong_to_ptr(nsImagePtr);
[ThreadUtilities performOnMainThread:@selector(_setDockIconImage:)
on:[ApplicationDelegate class]
withObject:_image
waitUntilDone:NO];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppDockIconHandler
* Method: nativeSetDockIconProgress
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconProgress
(JNIEnv *env, jclass clz, jint value)
{
- JNF_COCOA_ENTER(env);
+ JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThread:@selector(_setDockIconProgress:)
on:[ApplicationDelegate class]
withObject:[NSNumber numberWithInt:value]
waitUntilDone:NO];
- JNF_COCOA_EXIT(env);
+ JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppDockIconHandler
* Method: nativeGetDockIconImage
@@ -665,17 +689,17 @@
JNIEXPORT jlong JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeGetDockIconImage
(JNIEnv *env, jclass clz)
{
__block NSImage *image = nil;
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){
image = [[ApplicationDelegate _dockIconImage] retain];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
return ptr_to_jlong(image);
}
/*
@@ -684,115 +708,115 @@
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppDockIconHandler_nativeSetDockIconBadge
(JNIEnv *env, jclass clz, jstring badge)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
- NSString *badgeString = JNFJavaToNSString(env, badge);
+ NSString *badgeString = JavaStringToNSString(env, badge);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
NSDockTile *dockTile = [NSApp dockTile];
[dockTile setBadgeLabel:badgeString];
[dockTile display];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMiscHandlers
* Method: nativeRequestActivation
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestActivation
(JNIEnv *env, jclass clz, jboolean allWindows)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
NSApplicationActivationOptions options = allWindows ? NSApplicationActivateAllWindows : 0;
options |= NSApplicationActivateIgnoringOtherApps; // without this, nothing happens!
[[NSRunningApplication currentApplication] activateWithOptions:options];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMiscHandlers
* Method: nativeRequestUserAttention
* Signature: (Z)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeRequestUserAttention
(JNIEnv *env, jclass clz, jboolean critical)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[NSApp requestUserAttention:critical ? NSCriticalRequest : NSInformationalRequest];
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMiscHandlers
* Method: nativeOpenHelpViewer
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeOpenHelpViewer
(JNIEnv *env, jclass clz)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThread:@selector(showHelp:)
on:NSApp
withObject:nil
waitUntilDone:NO];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMiscHandlers
* Method: nativeEnableSuddenTermination
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeEnableSuddenTermination
(JNIEnv *env, jclass clz)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[[NSProcessInfo processInfo] enableSuddenTermination]; // Foundation thread-safe
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMiscHandlers
* Method: nativeDisableSuddenTermination
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMiscHandlers_nativeDisableSuddenTermination
(JNIEnv *env, jclass clz)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[[NSProcessInfo processInfo] disableSuddenTermination]; // Foundation thread-safe
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMenuBarHandler
* Method: nativeSetMenuState
* Signature: (IZZ)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetMenuState
(JNIEnv *env, jclass clz, jint menuID, jboolean visible, jboolean enabled)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
ApplicationDelegate *delegate = [ApplicationDelegate sharedDelegate];
switch (menuID) {
case com_apple_eawt__AppMenuBarHandler_MENU_ABOUT:
@@ -802,25 +826,25 @@
[delegate _updatePreferencesMenu:visible enabled:enabled];
break;
}
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
/*
* Class: com_apple_eawt__AppMenuBarHandler
* Method: nativeSetDefaultMenuBar
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_com_apple_eawt__1AppMenuBarHandler_nativeSetDefaultMenuBar
(JNIEnv *env, jclass clz, jlong cMenuBarPtr)
{
-JNF_COCOA_ENTER(env);
+JNI_COCOA_ENTER(env);
CMenuBar *menu = (CMenuBar *)jlong_to_ptr(cMenuBarPtr);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
[ApplicationDelegate sharedDelegate].fDefaultMenuBar = menu;
}];
-JNF_COCOA_EXIT(env);
+JNI_COCOA_EXIT(env);
}
< prev index next >