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 }
|