57 58 static SEL lookupCursorSelectorForName(NSString *name) { 59 if ([@"DnD.Cursor.CopyDrop" isEqual:name]) return @selector(dragCopyCursor); 60 if ([@"DnD.Cursor.LinkDrop" isEqual:name]) return @selector(dragLinkCursor); 61 if ([@"DnD.Cursor.MoveDrop" isEqual:name]) return @selector(_genericDragCursor); 62 if ([@"DnD.Cursor.CopyNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 63 if ([@"DnD.Cursor.LinkNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 64 if ([@"DnD.Cursor.MoveNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 65 return nil; 66 } 67 68 static void setCursorOnAppKitThread(NSCursor *cursor) { 69 [cursor set]; 70 } 71 72 JNIEXPORT void JNICALL 73 Java_sun_lwawt_macosx_CCursorManager_nativeSetBuiltInCursor 74 (JNIEnv *env, jclass class, jint type, jstring name) 75 { 76 JNF_COCOA_ENTER(env); 77 AWT_ASSERT_NOT_APPKIT_THREAD; 78 79 NSString *cursorName = JNFJavaToNSString(env, name); 80 SEL cursorSelector = (type == sun_lwawt_macosx_CCursorManager_NAMED_CURSOR) ? lookupCursorSelectorForName(cursorName) : lookupCursorSelectorForType(type); 81 if (cursorSelector == nil) { 82 NSString *reason = [NSString stringWithFormat:@"unimplemented built-in cursor type: %d / %@", type, cursorName]; 83 [JNFException raise:env as:kIllegalArgumentException reason:[reason UTF8String]]; 84 } 85 86 if (![[NSCursor class] respondsToSelector:cursorSelector]) { 87 [JNFException raise:env as:kNoSuchMethodException reason:"missing NSCursor selector"]; 88 } 89 90 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 91 AWT_ASSERT_APPKIT_THREAD; 92 93 setCursorOnAppKitThread([[NSCursor class] performSelector:cursorSelector]); 94 }]; 95 96 JNF_COCOA_EXIT(env); 97 } 98 99 JNIEXPORT void JNICALL 100 Java_sun_lwawt_macosx_CCursorManager_nativeSetCustomCursor 101 (JNIEnv *env, jclass class, jlong imgPtr, jdouble x, jdouble y) 102 { 103 JNF_COCOA_ENTER(env); 104 AWT_ASSERT_NOT_APPKIT_THREAD; 105 NSImage *image = (NSImage *)jlong_to_ptr(imgPtr); 106 107 [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ 108 AWT_ASSERT_APPKIT_THREAD; 109 110 NSCursor *cursor = [[NSCursor alloc] initWithImage:image 111 hotSpot:(NSPoint){ x, y }]; 112 setCursorOnAppKitThread(cursor); 113 [cursor release]; 114 }]; 115 116 JNF_COCOA_EXIT(env); 117 } 118 119 JNIEXPORT jobject JNICALL 120 Java_sun_lwawt_macosx_CCursorManager_nativeGetCursorPosition 121 (JNIEnv *env, jclass class) 122 { 123 jobject jpt = NULL; 124 125 JNF_COCOA_ENTER(env); 126 127 __block NSPoint pt = NSZeroPoint; 128 129 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 130 AWT_ASSERT_APPKIT_THREAD; 131 132 pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]); 133 }]; 134 135 jpt = NSToJavaPoint(env, pt); 136 137 JNF_COCOA_EXIT(env); 138 139 return jpt; 140 } 141 142 143 JNIEXPORT void JNICALL 144 Java_sun_lwawt_macosx_CCursorManager_nativeSetAllowsCursorSetInBackground 145 (JNIEnv *env, jclass class, jboolean allows) 146 { 147 148 JNF_COCOA_ENTER(env); 149 AWT_ASSERT_NOT_APPKIT_THREAD; 150 151 SEL allowsSetInBackground_SEL = @selector(javaSetAllowsCursorSetInBackground:); 152 if ([[NSCursor class] respondsToSelector:allowsSetInBackground_SEL]) { 153 [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^(){ 154 NSMethodSignature *allowsSetInBackground_sig = 155 [[NSCursor class] methodSignatureForSelector:allowsSetInBackground_SEL]; 156 NSInvocation *invocation = 157 [NSInvocation invocationWithMethodSignature:allowsSetInBackground_sig]; 158 BOOL arg = (BOOL)allows; 159 [invocation setSelector:allowsSetInBackground_SEL]; 160 [invocation setArgument:&arg atIndex:2]; 161 [invocation invokeWithTarget:[NSCursor class]]; 162 }]; 163 } 164 165 JNF_COCOA_EXIT(env); 166 167 } | 57 58 static SEL lookupCursorSelectorForName(NSString *name) { 59 if ([@"DnD.Cursor.CopyDrop" isEqual:name]) return @selector(dragCopyCursor); 60 if ([@"DnD.Cursor.LinkDrop" isEqual:name]) return @selector(dragLinkCursor); 61 if ([@"DnD.Cursor.MoveDrop" isEqual:name]) return @selector(_genericDragCursor); 62 if ([@"DnD.Cursor.CopyNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 63 if ([@"DnD.Cursor.LinkNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 64 if ([@"DnD.Cursor.MoveNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor); 65 return nil; 66 } 67 68 static void setCursorOnAppKitThread(NSCursor *cursor) { 69 [cursor set]; 70 } 71 72 JNIEXPORT void JNICALL 73 Java_sun_lwawt_macosx_CCursorManager_nativeSetBuiltInCursor 74 (JNIEnv *env, jclass class, jint type, jstring name) 75 { 76 JNF_COCOA_ENTER(env); 77 78 NSString *cursorName = JNFJavaToNSString(env, name); 79 SEL cursorSelector = (type == sun_lwawt_macosx_CCursorManager_NAMED_CURSOR) ? lookupCursorSelectorForName(cursorName) : lookupCursorSelectorForType(type); 80 if (cursorSelector == nil) { 81 NSString *reason = [NSString stringWithFormat:@"unimplemented built-in cursor type: %d / %@", type, cursorName]; 82 [JNFException raise:env as:kIllegalArgumentException reason:[reason UTF8String]]; 83 } 84 85 if (![[NSCursor class] respondsToSelector:cursorSelector]) { 86 [JNFException raise:env as:kNoSuchMethodException reason:"missing NSCursor selector"]; 87 } 88 89 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 90 setCursorOnAppKitThread([[NSCursor class] performSelector:cursorSelector]); 91 }]; 92 93 JNF_COCOA_EXIT(env); 94 } 95 96 JNIEXPORT void JNICALL 97 Java_sun_lwawt_macosx_CCursorManager_nativeSetCustomCursor 98 (JNIEnv *env, jclass class, jlong imgPtr, jdouble x, jdouble y) 99 { 100 JNF_COCOA_ENTER(env); 101 NSImage *image = (NSImage *)jlong_to_ptr(imgPtr); 102 103 [ThreadUtilities performOnMainThreadWaiting:NO block:^(){ 104 NSCursor *cursor = [[NSCursor alloc] initWithImage:image 105 hotSpot:(NSPoint){ x, y }]; 106 setCursorOnAppKitThread(cursor); 107 [cursor release]; 108 }]; 109 110 JNF_COCOA_EXIT(env); 111 } 112 113 JNIEXPORT jobject JNICALL 114 Java_sun_lwawt_macosx_CCursorManager_nativeGetCursorPosition 115 (JNIEnv *env, jclass class) 116 { 117 jobject jpt = NULL; 118 119 JNF_COCOA_ENTER(env); 120 121 __block NSPoint pt = NSZeroPoint; 122 123 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 124 pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]); 125 }]; 126 127 jpt = NSToJavaPoint(env, pt); 128 129 JNF_COCOA_EXIT(env); 130 131 return jpt; 132 } 133 134 135 JNIEXPORT void JNICALL 136 Java_sun_lwawt_macosx_CCursorManager_nativeSetAllowsCursorSetInBackground 137 (JNIEnv *env, jclass class, jboolean allows) 138 { 139 JNF_COCOA_ENTER(env); 140 141 SEL allowsSetInBackground_SEL = @selector(javaSetAllowsCursorSetInBackground:); 142 if ([[NSCursor class] respondsToSelector:allowsSetInBackground_SEL]) { 143 [ThreadUtilities performOnMainThreadWaiting:YES block:^(){ 144 NSMethodSignature *allowsSetInBackground_sig = 145 [[NSCursor class] methodSignatureForSelector:allowsSetInBackground_SEL]; 146 NSInvocation *invocation = 147 [NSInvocation invocationWithMethodSignature:allowsSetInBackground_sig]; 148 BOOL arg = (BOOL)allows; 149 [invocation setSelector:allowsSetInBackground_SEL]; 150 [invocation setArgument:&arg atIndex:2]; 151 [invocation invokeWithTarget:[NSCursor class]]; 152 }]; 153 } 154 155 JNF_COCOA_EXIT(env); 156 157 } |