Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/macosx/native_NOTIOS/sun/awt/CCursorManager.m
38829 views
/*1* Copyright (c) 2011, 2013, 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>28#include <JavaNativeFoundation/JavaNativeFoundation.h>2930#include "GeomUtilities.h"31#include "ThreadUtilities.h"3233#include "java_awt_Cursor.h"343536static SEL lookupCursorSelectorForType(jint type) {37switch (type) {38case java_awt_Cursor_DEFAULT_CURSOR: return @selector(arrowCursor);39case java_awt_Cursor_CROSSHAIR_CURSOR: return @selector(crosshairCursor);40case java_awt_Cursor_TEXT_CURSOR: return @selector(IBeamCursor);41case java_awt_Cursor_WAIT_CURSOR: return @selector(javaBusyButClickableCursor);42case java_awt_Cursor_SW_RESIZE_CURSOR: return @selector(javaResizeSWCursor);43case java_awt_Cursor_SE_RESIZE_CURSOR: return @selector(javaResizeSECursor);44case java_awt_Cursor_NW_RESIZE_CURSOR: return @selector(javaResizeNWCursor);45case java_awt_Cursor_NE_RESIZE_CURSOR: return @selector(javaResizeNECursor);46case java_awt_Cursor_N_RESIZE_CURSOR: return @selector(resizeUpDownCursor);47case java_awt_Cursor_S_RESIZE_CURSOR: return @selector(resizeUpDownCursor);48case java_awt_Cursor_W_RESIZE_CURSOR: return @selector(resizeLeftRightCursor);49case java_awt_Cursor_E_RESIZE_CURSOR: return @selector(resizeLeftRightCursor);50case java_awt_Cursor_HAND_CURSOR: return @selector(pointingHandCursor);51case java_awt_Cursor_MOVE_CURSOR: return @selector(javaMoveCursor);52}5354return nil;55}5657static SEL lookupCursorSelectorForName(NSString *name) {58if ([@"DnD.Cursor.CopyDrop" isEqual:name]) return @selector(dragCopyCursor);59if ([@"DnD.Cursor.LinkDrop" isEqual:name]) return @selector(dragLinkCursor);60if ([@"DnD.Cursor.MoveDrop" isEqual:name]) return @selector(_genericDragCursor);61if ([@"DnD.Cursor.CopyNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);62if ([@"DnD.Cursor.LinkNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);63if ([@"DnD.Cursor.MoveNoDrop" isEqual:name]) return @selector(operationNotAllowedCursor);64return nil;65}6667static void setCursorOnAppKitThread(NSCursor *cursor) {68[cursor set];69}7071JNIEXPORT void JNICALL72Java_sun_lwawt_macosx_CCursorManager_nativeSetBuiltInCursor73(JNIEnv *env, jclass class, jint type, jstring name)74{75JNF_COCOA_ENTER(env);7677NSString *cursorName = JNFJavaToNSString(env, name);78SEL cursorSelector = (type == sun_lwawt_macosx_CCursorManager_NAMED_CURSOR) ? lookupCursorSelectorForName(cursorName) : lookupCursorSelectorForType(type);79if (cursorSelector == nil) {80NSString *reason = [NSString stringWithFormat:@"unimplemented built-in cursor type: %d / %@", type, cursorName];81[JNFException raise:env as:kIllegalArgumentException reason:[reason UTF8String]];82}8384if (![[NSCursor class] respondsToSelector:cursorSelector]) {85[JNFException raise:env as:kNoSuchMethodException reason:"missing NSCursor selector"];86}8788[ThreadUtilities performOnMainThreadWaiting:NO block:^(){89setCursorOnAppKitThread([[NSCursor class] performSelector:cursorSelector]);90}];9192JNF_COCOA_EXIT(env);93}9495JNIEXPORT void JNICALL96Java_sun_lwawt_macosx_CCursorManager_nativeSetCustomCursor97(JNIEnv *env, jclass class, jlong imgPtr, jdouble x, jdouble y)98{99JNF_COCOA_ENTER(env);100NSImage *image = (NSImage *)jlong_to_ptr(imgPtr);101102[ThreadUtilities performOnMainThreadWaiting:NO block:^(){103NSCursor *cursor = [[NSCursor alloc] initWithImage:image104hotSpot:(NSPoint){ x, y }];105setCursorOnAppKitThread(cursor);106[cursor release];107}];108109JNF_COCOA_EXIT(env);110}111112JNIEXPORT jobject JNICALL113Java_sun_lwawt_macosx_CCursorManager_nativeGetCursorPosition114(JNIEnv *env, jclass class)115{116jobject jpt = NULL;117118JNF_COCOA_ENTER(env);119120CGEventRef event = CGEventCreate(NULL);121CGPoint globalPos = CGEventGetLocation(event);122CFRelease(event);123124jpt = NSToJavaPoint(env, globalPos);125126JNF_COCOA_EXIT(env);127128return jpt;129}130131132JNIEXPORT void JNICALL133Java_sun_lwawt_macosx_CCursorManager_nativeSetAllowsCursorSetInBackground134(JNIEnv *env, jclass class, jboolean allows)135{136JNF_COCOA_ENTER(env);137138SEL allowsSetInBackground_SEL = @selector(javaSetAllowsCursorSetInBackground:);139if ([[NSCursor class] respondsToSelector:allowsSetInBackground_SEL]) {140[ThreadUtilities performOnMainThreadWaiting:YES block:^(){141NSMethodSignature *allowsSetInBackground_sig =142[[NSCursor class] methodSignatureForSelector:allowsSetInBackground_SEL];143NSInvocation *invocation =144[NSInvocation invocationWithMethodSignature:allowsSetInBackground_sig];145BOOL arg = (BOOL)allows;146[invocation setSelector:allowsSetInBackground_SEL];147[invocation setArgument:&arg atIndex:2];148[invocation invokeWithTarget:[NSCursor class]];149}];150}151152JNF_COCOA_EXIT(env);153154}155156157