< prev index next >
src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.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
*** 27,37 ****
#import <pthread.h>
#import <objc/runtime.h>
#import <Cocoa/Cocoa.h>
#import <Security/AuthSession.h>
! #include "jni_util.h"
#import "LWCToolkit.h"
#import "ThreadUtilities.h"
#import "CSystemColors.h"
#import "NSApplicationAWT.h"
#import "PropertiesUtilities.h"
--- 27,37 ----
#import <pthread.h>
#import <objc/runtime.h>
#import <Cocoa/Cocoa.h>
#import <Security/AuthSession.h>
! #import "JNIUtilities.h"
#import "LWCToolkit.h"
#import "ThreadUtilities.h"
#import "CSystemColors.h"
#import "NSApplicationAWT.h"
#import "PropertiesUtilities.h"
*** 182,211 ****
[super dealloc];
}
- (void)perform {
JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
! static JNF_CLASS_CACHE(sjc_Runnable, "java/lang/Runnable");
! static JNF_MEMBER_CACHE(jm_Runnable_run, sjc_Runnable, "run", "()V");
! JNFCallVoidMethod(env, self.runnable, jm_Runnable_run);
[self release];
}
@end
void setBusy(BOOL busy) {
AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnv];
! static JNF_CLASS_CACHE(jc_AWTAutoShutdown, "sun/awt/AWTAutoShutdown");
if (busy) {
! static JNF_STATIC_MEMBER_CACHE(jm_notifyBusyMethod, jc_AWTAutoShutdown, "notifyToolkitThreadBusy", "()V");
! JNFCallStaticVoidMethod(env, jm_notifyBusyMethod);
} else {
! static JNF_STATIC_MEMBER_CACHE(jm_notifyFreeMethod, jc_AWTAutoShutdown, "notifyToolkitThreadFree", "()V");
! JNFCallStaticVoidMethod(env, jm_notifyFreeMethod);
}
}
static void setUpAWTAppKit(BOOL installObservers)
{
if (installObservers) {
--- 182,213 ----
[super dealloc];
}
- (void)perform {
JNIEnv* env = [ThreadUtilities getJNIEnvUncached];
! DECLARE_CLASS(sjc_Runnable, "java/lang/Runnable");
! DECLARE_METHOD(jm_Runnable_run, sjc_Runnable, "run", "()V");
! (*env)->CallVoidMethod(env, self.runnable, jm_Runnable_run);
! CHECK_EXCEPTION();
[self release];
}
@end
void setBusy(BOOL busy) {
AWT_ASSERT_APPKIT_THREAD;
JNIEnv *env = [ThreadUtilities getJNIEnv];
! DECLARE_CLASS(jc_AWTAutoShutdown, "sun/awt/AWTAutoShutdown");
if (busy) {
! DECLARE_STATIC_METHOD(jm_notifyBusyMethod, jc_AWTAutoShutdown, "notifyToolkitThreadBusy", "()V");
! (*env)->CallStaticVoidMethod(env, jc_AWTAutoShutdown, jm_notifyBusyMethod);
} else {
! DECLARE_STATIC_METHOD(jm_notifyFreeMethod, jc_AWTAutoShutdown, "notifyToolkitThreadFree", "()V");
! (*env)->CallStaticVoidMethod(env, jc_AWTAutoShutdown, jm_notifyFreeMethod);
}
+ CHECK_EXCEPTION();
}
static void setUpAWTAppKit(BOOL installObservers)
{
if (installObservers) {
*** 241,253 ****
setBusy(YES);
}
JNIEnv* env = [ThreadUtilities getJNIEnv];
! static JNF_CLASS_CACHE(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
! static JNF_STATIC_MEMBER_CACHE(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
! JNFCallStaticVoidMethod(env, jsm_installToolkitThreadInJava);
}
BOOL isSWTInWebStart(JNIEnv* env) {
NSString *swtWebStart = [PropertiesUtilities javaSystemPropertyForKey:@"com.apple.javaws.usingSWT" withEnv:env];
return [@"true" isCaseInsensitiveLike:swtWebStart];
--- 243,257 ----
setBusy(YES);
}
JNIEnv* env = [ThreadUtilities getJNIEnv];
! DECLARE_CLASS(jc_LWCToolkit, "sun/lwawt/macosx/LWCToolkit");
! DECLARE_STATIC_METHOD(jsm_installToolkitThreadInJava, jc_LWCToolkit, "installToolkitThreadInJava", "()V");
! (*env)->CallStaticVoidMethod(env, jc_LWCToolkit, jsm_installToolkitThreadInJava);
! CHECK_EXCEPTION();
!
}
BOOL isSWTInWebStart(JNIEnv* env) {
NSString *swtWebStart = [PropertiesUtilities javaSystemPropertyForKey:@"com.apple.javaws.usingSWT" withEnv:env];
return [@"true" isCaseInsensitiveLike:swtWebStart];
*** 450,460 ****
} else {
// could happen if we are embedded inside SWT application,
// in this case just spin a single empty block through
// the event loop to give it a chance to process pending events
! [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){}];
}
if (([AWTToolkit getEventCount] - currentEventNum) != 0) {
return JNI_TRUE;
}
--- 454,464 ----
} else {
// could happen if we are embedded inside SWT application,
// in this case just spin a single empty block through
// the event loop to give it a chance to process pending events
! [ThreadUtilities performOnMainThreadWaiting:YES block:^(){}];
}
if (([AWTToolkit getEventCount] - currentEventNum) != 0) {
return JNI_TRUE;
}
*** 468,480 ****
* Signature: ()J
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_flushNativeSelectors
(JNIEnv *env, jclass clz)
{
! JNF_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){}];
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: beep
--- 472,484 ----
* Signature: ()J
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_flushNativeSelectors
(JNIEnv *env, jclass clz)
{
! JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:YES block:^(){}];
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: beep
*** 511,521 ****
jint len = (*env)->GetArrayLength(env, jColors);
UInt32 colorsArray[len];
UInt32 *colors = colorsArray;
! [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
NSUInteger i;
for (i = 0; i < len; i++) {
colors[i] = RGB([CSystemColors getColor:i useAppleColor:useAppleColors]);
}
}];
--- 515,525 ----
jint len = (*env)->GetArrayLength(env, jColors);
UInt32 colorsArray[len];
UInt32 *colors = colorsArray;
! [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
NSUInteger i;
for (i = 0; i < len; i++) {
colors[i] = RGB([CSystemColors getColor:i useAppleColor:useAppleColors]);
}
}];
*** 535,549 ****
* Signature: ([I[I)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_loadNativeColors
(JNIEnv *env, jobject peer, jintArray jSystemColors, jintArray jAppleColors)
{
! JNF_COCOA_ENTER(env);
if (doLoadNativeColors(env, jSystemColors, NO)) {
doLoadNativeColors(env, jAppleColors, YES);
}
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: createAWTRunLoopMediator
--- 539,553 ----
* Signature: ([I[I)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_loadNativeColors
(JNIEnv *env, jobject peer, jintArray jSystemColors, jintArray jAppleColors)
{
! JNI_COCOA_ENTER(env);
if (doLoadNativeColors(env, jSystemColors, NO)) {
doLoadNativeColors(env, jAppleColors, YES);
}
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: createAWTRunLoopMediator
*** 554,568 ****
{
AWT_ASSERT_APPKIT_THREAD;
jlong result;
! JNF_COCOA_ENTER(env);
// We double retain because this object is owned by both main thread and "other" thread
// We release in both doAWTRunLoop and stopAWTRunLoop
result = ptr_to_jlong([[[AWTRunLoopObject alloc] init] retain]);
! JNF_COCOA_EXIT(env);
return result;
}
/*
--- 558,572 ----
{
AWT_ASSERT_APPKIT_THREAD;
jlong result;
! JNI_COCOA_ENTER(env);
// We double retain because this object is owned by both main thread and "other" thread
// We release in both doAWTRunLoop and stopAWTRunLoop
result = ptr_to_jlong([[[AWTRunLoopObject alloc] init] retain]);
! JNI_COCOA_EXIT(env);
return result;
}
/*
*** 572,591 ****
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoopImpl
(JNIEnv *env, jclass clz, jlong mediator, jboolean processEvents, jboolean inAWT)
{
AWT_ASSERT_APPKIT_THREAD;
! JNF_COCOA_ENTER(env);
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
if (mediatorObject == nil) return;
// Don't use acceptInputForMode because that doesn't setup autorelease pools properly
BOOL isRunning = true;
while (![mediatorObject shouldEndRunLoop] && isRunning) {
! isRunning = [[NSRunLoop currentRunLoop] runMode:(inAWT ? [JNFRunLoop javaRunLoopMode] : NSDefaultRunLoopMode)
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]];
if (processEvents) {
//We do not spin a runloop here as date is nil, so does not matter which mode to use
// Processing all events excluding NSApplicationDefined which need to be processed
// on the main loop only (those events are intended for disposing resources)
--- 576,595 ----
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_doAWTRunLoopImpl
(JNIEnv *env, jclass clz, jlong mediator, jboolean processEvents, jboolean inAWT)
{
AWT_ASSERT_APPKIT_THREAD;
! JNI_COCOA_ENTER(env);
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
if (mediatorObject == nil) return;
// Don't use acceptInputForMode because that doesn't setup autorelease pools properly
BOOL isRunning = true;
while (![mediatorObject shouldEndRunLoop] && isRunning) {
! isRunning = [[NSRunLoop currentRunLoop] runMode:(inAWT ? [ThreadUtilities javaRunLoopMode] : NSDefaultRunLoopMode)
beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]];
if (processEvents) {
//We do not spin a runloop here as date is nil, so does not matter which mode to use
// Processing all events excluding NSApplicationDefined which need to be processed
// on the main loop only (those events are intended for disposing resources)
*** 598,645 ****
}
}
}
[mediatorObject release];
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: stopAWTRunLoop
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopAWTRunLoop
(JNIEnv *env, jclass clz, jlong mediator)
{
! JNF_COCOA_ENTER(env);
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
[ThreadUtilities performOnMainThread:@selector(endRunLoop) on:mediatorObject withObject:nil waitUntilDone:NO];
[mediatorObject release];
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: performOnMainThreadAfterDelay
* Signature: (Ljava/lang/Runnable;J)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_performOnMainThreadAfterDelay
(JNIEnv *env, jclass clz, jobject runnable, jlong delay)
{
! JNF_COCOA_ENTER(env);
jobject gRunnable = (*env)->NewGlobalRef(env, runnable);
CHECK_NULL(gRunnable);
[ThreadUtilities performOnMainThreadWaiting:NO block:^() {
JavaRunnable* performer = [[JavaRunnable alloc] initWithRunnable:gRunnable];
[performer performSelector:@selector(perform) withObject:nil afterDelay:(delay/1000.0)];
}];
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
--- 602,649 ----
}
}
}
[mediatorObject release];
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: stopAWTRunLoop
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_stopAWTRunLoop
(JNIEnv *env, jclass clz, jlong mediator)
{
! JNI_COCOA_ENTER(env);
AWTRunLoopObject* mediatorObject = (AWTRunLoopObject*)jlong_to_ptr(mediator);
[ThreadUtilities performOnMainThread:@selector(endRunLoop) on:mediatorObject withObject:nil waitUntilDone:NO];
[mediatorObject release];
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: performOnMainThreadAfterDelay
* Signature: (Ljava/lang/Runnable;J)V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_performOnMainThreadAfterDelay
(JNIEnv *env, jclass clz, jobject runnable, jlong delay)
{
! JNI_COCOA_ENTER(env);
jobject gRunnable = (*env)->NewGlobalRef(env, runnable);
CHECK_NULL(gRunnable);
[ThreadUtilities performOnMainThreadWaiting:NO block:^() {
JavaRunnable* performer = [[JavaRunnable alloc] initWithRunnable:gRunnable];
[performer performSelector:@selector(perform) withObject:nil afterDelay:(delay/1000.0)];
}];
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
*** 648,658 ****
*/
JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn
(JNIEnv *env, jobject self)
{
__block jboolean isOn = JNI_FALSE;
! [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){
NSUInteger modifiers = [NSEvent modifierFlags];
isOn = (modifiers & NSAlphaShiftKeyMask) != 0;
}];
return isOn;
--- 652,662 ----
*/
JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn
(JNIEnv *env, jobject self)
{
__block jboolean isOn = JNI_FALSE;
! [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
NSUInteger modifiers = [NSEvent modifierFlags];
isOn = (modifiers & NSAlphaShiftKeyMask) != 0;
}];
return isOn;
*** 666,682 ****
JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isApplicationActive
(JNIEnv *env, jclass clazz)
{
__block jboolean active = JNI_FALSE;
! JNF_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:YES block:^() {
active = (jboolean)[NSRunningApplication currentApplication].active;
}];
! JNF_COCOA_EXIT(env);
return active;
}
/*
--- 670,686 ----
JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isApplicationActive
(JNIEnv *env, jclass clazz)
{
__block jboolean active = JNI_FALSE;
! JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:YES block:^() {
active = (jboolean)[NSRunningApplication currentApplication].active;
}];
! JNI_COCOA_EXIT(env);
return active;
}
/*
*** 685,701 ****
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_activateApplicationIgnoringOtherApps
(JNIEnv *env, jclass clazz)
{
! JNF_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
if(![NSApp isActive]){
[NSApp activateIgnoringOtherApps:YES];
}
}];
! JNF_COCOA_EXIT(env);
}
/*
* Class: sun_awt_SunToolkit
--- 689,705 ----
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_sun_lwawt_macosx_LWCToolkit_activateApplicationIgnoringOtherApps
(JNIEnv *env, jclass clazz)
{
! JNI_COCOA_ENTER(env);
[ThreadUtilities performOnMainThreadWaiting:NO block:^(){
if(![NSApp isActive]){
[NSApp activateIgnoringOtherApps:YES];
}
}];
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_awt_SunToolkit
*** 721,731 ****
JNIEXPORT jstring JNICALL
Java_sun_font_FontManager_getFontPath
(JNIEnv *env, jclass obj, jboolean noType1)
{
! return JNFNSToJavaString(env, @"/Library/Fonts");
}
// This isn't yet used on unix, the implementation is added since shared
// code calls this method in preparation for future use.
JNIEXPORT void JNICALL
--- 725,735 ----
JNIEXPORT jstring JNICALL
Java_sun_font_FontManager_getFontPath
(JNIEnv *env, jclass obj, jboolean noType1)
{
! return NSStringToJavaString(env, @"/Library/Fonts");
}
// This isn't yet used on unix, the implementation is added since shared
// code calls this method in preparation for future use.
JNIEXPORT void JNICALL
*** 742,760 ****
*/
JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_LWCToolkit_initIDs
(JNIEnv *env, jclass klass) {
! JNF_COCOA_ENTER(env)
gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
jclass inputEventClazz = (*env)->FindClass(env, "java/awt/event/InputEvent");
CHECK_NULL(inputEventClazz);
jmethodID getButtonDownMasksID = (*env)->GetStaticMethodID(env, inputEventClazz, "getButtonDownMasks", "()[I");
CHECK_NULL(getButtonDownMasksID);
jintArray obj = (jintArray)(*env)->CallStaticObjectMethod(env, inputEventClazz, getButtonDownMasksID);
jint * tmp = (*env)->GetIntArrayElements(env, obj, JNI_FALSE);
CHECK_NULL(tmp);
gButtonDownMasks = (jint*)SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(jint), gNumberOfButtons);
if (gButtonDownMasks == NULL) {
--- 746,765 ----
*/
JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_LWCToolkit_initIDs
(JNIEnv *env, jclass klass) {
! JNI_COCOA_ENTER(env);
gNumberOfButtons = sun_lwawt_macosx_LWCToolkit_BUTTONS;
jclass inputEventClazz = (*env)->FindClass(env, "java/awt/event/InputEvent");
CHECK_NULL(inputEventClazz);
jmethodID getButtonDownMasksID = (*env)->GetStaticMethodID(env, inputEventClazz, "getButtonDownMasks", "()[I");
CHECK_NULL(getButtonDownMasksID);
jintArray obj = (jintArray)(*env)->CallStaticObjectMethod(env, inputEventClazz, getButtonDownMasksID);
+ CHECK_EXCEPTION();
jint * tmp = (*env)->GetIntArrayElements(env, obj, JNI_FALSE);
CHECK_NULL(tmp);
gButtonDownMasks = (jint*)SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(jint), gNumberOfButtons);
if (gButtonDownMasks == NULL) {
*** 770,791 ****
}
(*env)->ReleaseIntArrayElements(env, obj, tmp, 0);
(*env)->DeleteLocalRef(env, obj);
! JNF_COCOA_EXIT(env)
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: initAppkit
* Signature: (Ljava/lang/ThreadGroup;)V
*/
JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_LWCToolkit_initAppkit
(JNIEnv *env, jclass klass, jobject appkitThreadGroup, jboolean headless) {
! JNF_COCOA_ENTER(env)
[ThreadUtilities setAppkitThreadGroup:(*env)->NewGlobalRef(env, appkitThreadGroup)];
// Launcher sets this env variable if -XstartOnFirstThread is specified
char envVar[80];
--- 775,796 ----
}
(*env)->ReleaseIntArrayElements(env, obj, tmp, 0);
(*env)->DeleteLocalRef(env, obj);
! JNI_COCOA_EXIT(env);
}
/*
* Class: sun_lwawt_macosx_LWCToolkit
* Method: initAppkit
* Signature: (Ljava/lang/ThreadGroup;)V
*/
JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_LWCToolkit_initAppkit
(JNIEnv *env, jclass klass, jobject appkitThreadGroup, jboolean headless) {
! JNI_COCOA_ENTER(env);
[ThreadUtilities setAppkitThreadGroup:(*env)->NewGlobalRef(env, appkitThreadGroup)];
// Launcher sets this env variable if -XstartOnFirstThread is specified
char envVar[80];
*** 799,809 ****
forceEmbeddedMode = YES;
}
[AWTStarter start:headless ? YES : NO];
! JNF_COCOA_EXIT(env)
}
JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
OSXAPP_SetJavaVM(vm);
--- 804,814 ----
forceEmbeddedMode = YES;
}
[AWTStarter start:headless ? YES : NO];
! JNI_COCOA_EXIT(env);
}
JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved) {
OSXAPP_SetJavaVM(vm);
< prev index next >