< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/awt/CCursorManager.m

Print this page
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


   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include "sun_lwawt_macosx_CCursorManager.h"
  27 
  28 #include <Cocoa/Cocoa.h>
  29 #include <JavaNativeFoundation/JavaNativeFoundation.h>
  30 
  31 #include "GeomUtilities.h"
  32 #include "ThreadUtilities.h"
  33 
  34 #include "java_awt_Cursor.h"
  35 
  36 
  37 static SEL lookupCursorSelectorForType(jint type) {
  38     switch (type) {
  39         case java_awt_Cursor_DEFAULT_CURSOR:        return @selector(arrowCursor);
  40         case java_awt_Cursor_CROSSHAIR_CURSOR:      return @selector(crosshairCursor);
  41         case java_awt_Cursor_TEXT_CURSOR:           return @selector(IBeamCursor);
  42         case java_awt_Cursor_WAIT_CURSOR:           return @selector(javaBusyButClickableCursor);
  43         case java_awt_Cursor_SW_RESIZE_CURSOR:      return @selector(javaResizeSWCursor);
  44         case java_awt_Cursor_SE_RESIZE_CURSOR:      return @selector(javaResizeSECursor);
  45         case java_awt_Cursor_NW_RESIZE_CURSOR:      return @selector(javaResizeNWCursor);
  46         case java_awt_Cursor_NE_RESIZE_CURSOR:      return @selector(javaResizeNECursor);
  47         case java_awt_Cursor_N_RESIZE_CURSOR:       return @selector(resizeUpDownCursor);
  48         case java_awt_Cursor_S_RESIZE_CURSOR:       return @selector(resizeUpDownCursor);
  49         case java_awt_Cursor_W_RESIZE_CURSOR:       return @selector(resizeLeftRightCursor);


  56 }
  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     CGEventRef event = CGEventCreate(NULL);
 122     CGPoint globalPos = CGEventGetLocation(event);
 123     CFRelease(event);
 124 
 125     jpt = NSToJavaPoint(env, globalPos);
 126 
 127 JNF_COCOA_EXIT(env);
 128 
 129     return jpt;
 130 }
 131 
 132 
 133 JNIEXPORT void JNICALL
 134 Java_sun_lwawt_macosx_CCursorManager_nativeSetAllowsCursorSetInBackground
 135 (JNIEnv *env, jclass class, jboolean allows)
 136 {
 137 JNF_COCOA_ENTER(env);
 138 
 139     SEL allowsSetInBackground_SEL = @selector(javaSetAllowsCursorSetInBackground:);
 140     if ([[NSCursor class] respondsToSelector:allowsSetInBackground_SEL]) {
 141         [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
 142             NSMethodSignature *allowsSetInBackground_sig =
 143                 [[NSCursor class] methodSignatureForSelector:allowsSetInBackground_SEL];
 144             NSInvocation *invocation =
 145                 [NSInvocation invocationWithMethodSignature:allowsSetInBackground_sig];
 146             BOOL arg = (BOOL)allows;
 147             [invocation setSelector:allowsSetInBackground_SEL];
 148             [invocation setArgument:&arg atIndex:2];
 149             [invocation invokeWithTarget:[NSCursor class]];
 150         }];
 151     }
 152 
 153 JNF_COCOA_EXIT(env);
 154 
 155 }


   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include "sun_lwawt_macosx_CCursorManager.h"
  27 
  28 #include <Cocoa/Cocoa.h>

  29 
  30 #include "GeomUtilities.h"
  31 #include "ThreadUtilities.h"
  32 
  33 #include "java_awt_Cursor.h"
  34 
  35 
  36 static SEL lookupCursorSelectorForType(jint type) {
  37     switch (type) {
  38         case java_awt_Cursor_DEFAULT_CURSOR:        return @selector(arrowCursor);
  39         case java_awt_Cursor_CROSSHAIR_CURSOR:      return @selector(crosshairCursor);
  40         case java_awt_Cursor_TEXT_CURSOR:           return @selector(IBeamCursor);
  41         case java_awt_Cursor_WAIT_CURSOR:           return @selector(javaBusyButClickableCursor);
  42         case java_awt_Cursor_SW_RESIZE_CURSOR:      return @selector(javaResizeSWCursor);
  43         case java_awt_Cursor_SE_RESIZE_CURSOR:      return @selector(javaResizeSECursor);
  44         case java_awt_Cursor_NW_RESIZE_CURSOR:      return @selector(javaResizeNWCursor);
  45         case java_awt_Cursor_NE_RESIZE_CURSOR:      return @selector(javaResizeNECursor);
  46         case java_awt_Cursor_N_RESIZE_CURSOR:       return @selector(resizeUpDownCursor);
  47         case java_awt_Cursor_S_RESIZE_CURSOR:       return @selector(resizeUpDownCursor);
  48         case java_awt_Cursor_W_RESIZE_CURSOR:       return @selector(resizeLeftRightCursor);


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