src/macosx/native/sun/awt/CCursorManager.m

Print this page




  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 }