Path: blob/master/src/java.desktop/macosx/native/libawt_lwawt/awt/CCursorManager.m
41152 views
/*1* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#include "sun_lwawt_macosx_CCursorManager.h"2627#include <Cocoa/Cocoa.h>2829#include "GeomUtilities.h"30#include "ThreadUtilities.h"3132#include "java_awt_Cursor.h"333435static SEL lookupCursorSelectorForType(jint type) {36switch (type) {37case java_awt_Cursor_DEFAULT_CURSOR: return @selector(arrowCursor);38case java_awt_Cursor_CROSSHAIR_CURSOR: return @selector(crosshairCursor);39case java_awt_Cursor_TEXT_CURSOR: return @selector(IBeamCursor);40case java_awt_Cursor_WAIT_CURSOR: return @selector(javaBusyButClickableCursor);41case java_awt_Cursor_SW_RESIZE_CURSOR: return @selector(javaResizeSWCursor);42case java_awt_Cursor_SE_RESIZE_CURSOR: return @selector(javaResizeSECursor);43case java_awt_Cursor_NW_RESIZE_CURSOR: return @selector(javaResizeNWCursor);44case java_awt_Cursor_NE_RESIZE_CURSOR: return @selector(javaResizeNECursor);45case java_awt_Cursor_N_RESIZE_CURSOR: return @selector(resizeUpDownCursor);46case java_awt_Cursor_S_RESIZE_CURSOR: return @selector(resizeUpDownCursor);47case java_awt_Cursor_W_RESIZE_CURSOR: return @selector(resizeLeftRightCursor);48case java_awt_Cursor_E_RESIZE_CURSOR: return @selector(resizeLeftRightCursor);49case java_awt_Cursor_HAND_CURSOR: return @selector(pointingHandCursor);50case java_awt_Cursor_MOVE_CURSOR: return @selector(javaMoveCursor);51}5253return nil;54}5556static SEL lookupCursorSelectorForName(NSString *name) {57if ([@"DnD.Cursor.CopyDrop" isEqual:name]) return @selector(dragCopyCursor);58if ([@"DnD.Cursor.LinkDrop" isEqual:name]) return @selector(dragLinkCursor);59if ([@"DnD.Cursor.MoveDrop" isEqual:name]) return @selector(_genericDragCursor);60if ([@"DnD.Cursor.CopyNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);61if ([@"DnD.Cursor.LinkNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);62if ([@"DnD.Cursor.MoveNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);63return nil;64}6566static void setCursorOnAppKitThread(NSCursor *cursor) {67[cursor set];68}6970JNIEXPORT void JNICALL71Java_sun_lwawt_macosx_CCursorManager_nativeSetBuiltInCursor72(JNIEnv *env, jclass class, jint type, jstring name)73{74JNI_COCOA_ENTER(env);7576NSString *cursorName = JavaStringToNSString(env, name);77SEL cursorSelector = (type == sun_lwawt_macosx_CCursorManager_NAMED_CURSOR) ? lookupCursorSelectorForName(cursorName) : lookupCursorSelectorForType(type);78if (cursorSelector == nil) {79NSString *reason = [NSString stringWithFormat:@"unimplemented built-in cursor type: %d / %@", type, cursorName];80JNU_ThrowIllegalArgumentException(env, [reason UTF8String]);81return;82}8384if (![[NSCursor class] respondsToSelector:cursorSelector]) {85JNU_ThrowByName(env, "java/lang/NoSuchMethodException", "missing NSCursor selector");86return;87}8889[ThreadUtilities performOnMainThreadWaiting:NO block:^(){90setCursorOnAppKitThread([[NSCursor class] performSelector:cursorSelector]);91}];9293JNI_COCOA_EXIT(env);94}9596JNIEXPORT void JNICALL97Java_sun_lwawt_macosx_CCursorManager_nativeSetCustomCursor98(JNIEnv *env, jclass class, jlong imgPtr, jdouble x, jdouble y)99{100JNI_COCOA_ENTER(env);101NSImage *image = (NSImage *)jlong_to_ptr(imgPtr);102103[ThreadUtilities performOnMainThreadWaiting:NO block:^(){104NSCursor *cursor = [[NSCursor alloc] initWithImage:image105hotSpot:(NSPoint){ x, y }];106setCursorOnAppKitThread(cursor);107[cursor release];108}];109110JNI_COCOA_EXIT(env);111}112113JNIEXPORT jobject JNICALL114Java_sun_lwawt_macosx_CCursorManager_nativeGetCursorPosition115(JNIEnv *env, jclass class)116{117jobject jpt = NULL;118119JNI_COCOA_ENTER(env);120121CGEventRef event = CGEventCreate(NULL);122CGPoint globalPos = CGEventGetLocation(event);123CFRelease(event);124125jpt = NSToJavaPoint(env, globalPos);126127JNI_COCOA_EXIT(env);128129return jpt;130}131132133JNIEXPORT void JNICALL134Java_sun_lwawt_macosx_CCursorManager_nativeSetAllowsCursorSetInBackground135(JNIEnv *env, jclass class, jboolean allows)136{137JNI_COCOA_ENTER(env);138139SEL allowsSetInBackground_SEL = @selector(javaSetAllowsCursorSetInBackground:);140if ([[NSCursor class] respondsToSelector:allowsSetInBackground_SEL]) {141[ThreadUtilities performOnMainThreadWaiting:YES block:^(){142NSMethodSignature *allowsSetInBackground_sig =143[[NSCursor class] methodSignatureForSelector:allowsSetInBackground_SEL];144NSInvocation *invocation =145[NSInvocation invocationWithMethodSignature:allowsSetInBackground_sig];146BOOL arg = (BOOL)allows;147[invocation setSelector:allowsSetInBackground_SEL];148[invocation setArgument:&arg atIndex:2];149[invocation invokeWithTarget:[NSCursor class]];150}];151}152153JNI_COCOA_EXIT(env);154155}156157158