/* * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Sun designates this * particular file as subject to the "Classpath" exception as provided * by Sun in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or * have any questions. */ #ifdef HEADLESS #error This file should not be included in headless library #endif #include "awt_p.h" #include "java_awt_Cursor.h" #include "awt_Cursor.h" #include "sun_awt_motif_MCustomCursor.h" #include "jni.h" #include "jni_util.h" extern struct CursorIDs cursorIDs; static jfieldID widthID; static jfieldID heightID; /* * Class: sun_awt_motif_MCustomCursor * Method: cacheInit * Signature: ()V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_cacheInit (JNIEnv *env, jclass cls) { jclass clsDimension = (*env)->FindClass(env, "java/awt/Dimension"); widthID = (*env)->GetFieldID(env, clsDimension, "width", "I"); heightID = (*env)->GetFieldID(env, clsDimension, "height", "I"); } /* * Class: sun_awt_motif_MCustomCursor * Method: queryBestCursor * Signature: (Ljava/awt/Dimension;)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_queryBestCursor (JNIEnv *env, jclass cls, jobject dimension) { Window root; uint32_t width, height; AWT_LOCK(); root = RootWindow(awt_display, DefaultScreen(awt_display)); XQueryBestCursor(awt_display, root, (*env)->GetIntField(env, dimension, widthID), (*env)->GetIntField(env, dimension, heightID), &width, &height); (*env)->SetIntField(env, dimension, widthID, (int32_t) width); (*env)->SetIntField(env, dimension, heightID, (int32_t) height); AWT_UNLOCK(); } /* * Class: sun_awt_motif_MCustomCursor * Method: createCursor * Signature: ([B[BIIII)V */ JNIEXPORT void JNICALL Java_sun_awt_motif_MCustomCursor_createCursor (JNIEnv *env , jobject this, jbyteArray xorMask, jbyteArray andMask, jint width, jint height, jint fc, jint bc, jint xHotSpot, jint yHotSpot) { Cursor cursor; char *sourceBits, *maskBits; Window root; Pixmap source, mask; XColor fcolor, bcolor; AwtGraphicsConfigDataPtr defaultConfig = getDefaultConfig(DefaultScreen(awt_display)); AWT_LOCK(); root = RootWindow(awt_display, DefaultScreen(awt_display)); fcolor.flags = DoRed | DoGreen | DoBlue; fcolor.red = ((fc >> 16) & 0x000000ff) << 8; fcolor.green = ((fc >> 8) & 0x000000ff) << 8; fcolor.blue = ((fc >> 0) & 0x000000ff) << 8; XAllocColor(awt_display, defaultConfig->awt_cmap, &fcolor); bcolor.flags = DoRed | DoGreen | DoBlue; bcolor.red = ((bc >> 16) & 0x000000ff) << 8; bcolor.green = ((bc >> 8) & 0x000000ff) << 8; bcolor.blue = ((bc >> 0) & 0x000000ff) << 8; XAllocColor(awt_display, defaultConfig->awt_cmap, &bcolor); /* Create source pixmap. */ sourceBits = (char *)(*env)->GetPrimitiveArrayCritical(env, xorMask, NULL); source = XCreateBitmapFromData(awt_display, root, sourceBits, width, height); /* Create mask pixmap */ maskBits = (char *)(*env)->GetPrimitiveArrayCritical(env, andMask, NULL); mask = XCreateBitmapFromData(awt_display, root, maskBits, width, height); /* Create cursor */ cursor = XCreatePixmapCursor(awt_display, source, mask, &fcolor, &bcolor, xHotSpot, yHotSpot); /* Free resources */ XFreePixmap(awt_display, source); XFreePixmap(awt_display, mask); (*env)->ReleasePrimitiveArrayCritical(env, xorMask, sourceBits, JNI_ABORT); (*env)->ReleasePrimitiveArrayCritical(env, andMask, maskBits, JNI_ABORT); JNU_SetLongFieldFromPtr(env, this, cursorIDs.pData, cursor); AWT_FLUSH_UNLOCK(); }