Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/solaris/native/sun/xawt/XlibWrapper.c
32287 views
/*1* Copyright (c) 2002, 2014, 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_awt_X11_XlibWrapper.h"26#include <X11/Xlib.h>27#include <X11/keysym.h>28#include <X11/Xutil.h>29#include <X11/Xos.h>30#include <X11/Xatom.h>31#include <X11/extensions/Xdbe.h>32#include <X11/extensions/shape.h>33#include <string.h>34#include <stdlib.h>35#include <X11/Sunkeysym.h>3637#include <jni.h>38#include <jni_util.h>39#include <jlong.h>40#include <sizecalc.h>4142#include <awt.h>43#include <awt_util.h>44#include <jvm.h>4546#include <Region.h>47#include "utility/rect.h"4849#include <X11/XKBlib.h>5051#if defined(DEBUG) || defined(INTERNAL_BUILD)52static jmethodID lockIsHeldMID = NULL;5354static void55CheckHaveAWTLock(JNIEnv *env)56{57if (lockIsHeldMID == NULL) {58if (tkClass == NULL) return;59lockIsHeldMID =60(*env)->GetStaticMethodID(env, tkClass,61"isAWTLockHeldByCurrentThread", "()Z");62if (lockIsHeldMID == NULL) return;63}64if (!(*env)->CallStaticBooleanMethod(env, tkClass, lockIsHeldMID)) {65JNU_ThrowInternalError(env, "Current thread does not hold AWT_LOCK!");66}67}6869#define AWT_CHECK_HAVE_LOCK() \70do { \71CheckHaveAWTLock(env); \72if ((*env)->ExceptionCheck(env)) { \73return; \74} \75} while (0); \7677#define AWT_CHECK_HAVE_LOCK_RETURN(ret) \78do { \79CheckHaveAWTLock(env); \80if ((*env)->ExceptionCheck(env)) { \81return (ret); \82} \83} while (0); \8485#else86#define AWT_CHECK_HAVE_LOCK()87#define AWT_CHECK_HAVE_LOCK_RETURN(ret)88#endif8990void freeNativeStringArray(char **array, jsize length) {91int i;92if (array == NULL) {93return;94}95for (i = 0; i < length; i++) {96free(array[i]);97}98free(array);99}100101char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length) {102Bool err = FALSE;103char ** strings;104int index, str_index = 0;105jsize length = (*env)->GetArrayLength(env, array);106107if (length == 0) {108return NULL;109}110111strings = (char**) calloc(length, sizeof (char*));112113if (strings == NULL) {114JNU_ThrowOutOfMemoryError(env, "");115return NULL;116}117118for (index = 0; index < length; index++) {119jstring str = (*env)->GetObjectArrayElement(env, array, index);120if (str != NULL) {121const char * str_char = JNU_GetStringPlatformChars(env, str, NULL);122if (str_char != NULL) {123char * dup_str = strdup(str_char);124if (dup_str != NULL) {125strings[str_index++] = dup_str;126} else {127JNU_ThrowOutOfMemoryError(env, "");128err = TRUE;129}130JNU_ReleaseStringPlatformChars(env, str, str_char);131} else {132err = TRUE;133}134(*env)->DeleteLocalRef(env, str);135if (err) {136break;137}138}139}140141if (err) {142freeNativeStringArray(strings, str_index);143strings = NULL;144str_index = -1;145}146*ret_length = str_index;147148return strings;149}150151/*152* Class: XlibWrapper153* Method: XOpenDisplay154* Signature: (J)J155*/156157JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XOpenDisplay158(JNIEnv *env, jclass clazz, jlong display_name)159{160Display *dp;161AWT_CHECK_HAVE_LOCK_RETURN(0);162dp = XOpenDisplay((char *) jlong_to_ptr(display_name));163164return ptr_to_jlong(dp);165}166167JNIEXPORT void JNICALL168Java_sun_awt_X11_XlibWrapper_XCloseDisplay(JNIEnv *env, jclass clazz,169jlong display) {170AWT_CHECK_HAVE_LOCK();171XCloseDisplay((Display*) jlong_to_ptr(display));172}173174JNIEXPORT jlong JNICALL175Java_sun_awt_X11_XlibWrapper_XDisplayString(JNIEnv *env, jclass clazz,176jlong display) {177AWT_CHECK_HAVE_LOCK_RETURN(0);178return ptr_to_jlong(XDisplayString((Display*) jlong_to_ptr(display)));179}180181JNIEXPORT void JNICALL182Java_sun_awt_X11_XlibWrapper_XSetCloseDownMode(JNIEnv *env, jclass clazz,183jlong display, jint mode) {184AWT_CHECK_HAVE_LOCK();185XSetCloseDownMode((Display*) jlong_to_ptr(display), (int)mode);186}187188/*189* Class: sun_awt_X11_XlibWrapper190* Method: DefaultScreen191* Signature: (J)J192*/193JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DefaultScreen (JNIEnv *env, jclass clazz, jlong display) {194195AWT_CHECK_HAVE_LOCK_RETURN(0);196return (jlong) DefaultScreen((Display *) jlong_to_ptr(display));197}198199/*200* Class: sun_awt_X11_XlibWrapper201* Method: ScreenOfDisplay202* Signature: (JJ)J203*/204JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_ScreenOfDisplay(JNIEnv *env, jclass clazz, jlong display, jlong screen_number) {205AWT_CHECK_HAVE_LOCK_RETURN(0);206return ptr_to_jlong(ScreenOfDisplay((Display *) jlong_to_ptr(display),207screen_number));208}209210/*211* Class: sun_awt_X11_XlibWrapper212* Method: DoesBackingStore213* Signature: (J)I214*/215JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DoesBackingStore(JNIEnv *env, jclass clazz, jlong screen) {216AWT_CHECK_HAVE_LOCK_RETURN(0);217return (jint) DoesBackingStore((Screen*) jlong_to_ptr(screen));218}219220/*221* Class: sun_awt_X11_XlibWrapper222* Method: DisplayWidth223* Signature: (JJ)J224*/225JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidth226(JNIEnv *env, jclass clazz, jlong display, jlong screen) {227228AWT_CHECK_HAVE_LOCK_RETURN(0);229return (jlong) DisplayWidth((Display *) jlong_to_ptr(display),screen);230231}232233/*234* Class: sun_awt_X11_XlibWrapper235* Method: DisplayWidthMM236* Signature: (JJ)J237*/238JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidthMM239(JNIEnv *env, jclass clazz, jlong display, jlong screen) {240AWT_CHECK_HAVE_LOCK_RETURN(0);241return (jlong) DisplayWidthMM((Display *) jlong_to_ptr(display),screen);242}243244/*245* Class: sun_awt_X11_XlibWrapper246* Method: DisplayHeight247* Signature: (JJ)J248*/249JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeight250(JNIEnv *env, jclass clazz, jlong display, jlong screen) {251252AWT_CHECK_HAVE_LOCK_RETURN(0);253return (jlong) DisplayHeight((Display *) jlong_to_ptr(display),screen);254}255/*256* Class: sun_awt_X11_XlibWrapper257* Method: DisplayHeightMM258* Signature: (JJ)J259*/260JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeightMM261(JNIEnv *env, jclass clazz, jlong display, jlong screen) {262AWT_CHECK_HAVE_LOCK_RETURN(0);263return (jlong) DisplayHeightMM((Display *) jlong_to_ptr(display),screen);264}265266/*267* Class: sun_awt_X11_XlibWrapper268* Method: RootWindow269* Signature: (JJ)J270*/271JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_RootWindow272(JNIEnv *env , jclass clazz, jlong display, jlong screen_number) {273AWT_CHECK_HAVE_LOCK_RETURN(0);274return (jlong) RootWindow((Display *) jlong_to_ptr(display), screen_number);275}276277/*278* Class: sun_awt_X11_XlibWrapper279* Method: ScreenCount280*/281JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_ScreenCount282(JNIEnv *env , jclass clazz, jlong display) {283AWT_CHECK_HAVE_LOCK_RETURN(0);284return ScreenCount((Display *) jlong_to_ptr(display));285}286287288/*289* Class: XlibWrapper290* Method: XCreateWindow291* Signature: (JJIIIIIIJJJJ)J292*/293JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateWindow294(JNIEnv *env, jclass clazz, jlong display, jlong window,295jint x, jint y, jint w, jint h , jint border_width, jint depth,296jlong wclass, jlong visual, jlong valuemask, jlong attributes)297{298AWT_CHECK_HAVE_LOCK_RETURN(0);299return XCreateWindow((Display *) jlong_to_ptr(display),(Window) window, x, y, w, h,300border_width, depth, wclass, (Visual *) jlong_to_ptr(visual),301valuemask, (XSetWindowAttributes *) jlong_to_ptr(attributes));302303}304305/*306* Class: XlibWrapper307* Method: XConvertCase308* Signature: (JJJ)V309*/310JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConvertCase311(JNIEnv *env, jclass clazz, jlong keysym,312jlong keysym_lowercase, jlong keysym_uppercase)313{314AWT_CHECK_HAVE_LOCK();315XConvertCase(keysym, (jlong_to_ptr(keysym_lowercase)),316(jlong_to_ptr(keysym_uppercase)));317}318319320/*321* Class: XlibWrapper322* Method: XMapWindow323* Signature: (JJ)V324*/325JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapWindow326(JNIEnv *env, jclass clazz, jlong display, jlong window)327{328AWT_CHECK_HAVE_LOCK();329XMapWindow( (Display *)jlong_to_ptr(display),(Window) window);330331}332333/*334* Class: XlibWrapper335* Method: XMapRaised336* Signature: (JJ)V337*/338JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapRaised339(JNIEnv *env, jclass clazz, jlong display, jlong window)340{341AWT_CHECK_HAVE_LOCK();342XMapRaised( (Display *)jlong_to_ptr(display),(Window) window);343344}345346/*347* Class: XlibWrapper348* Method: XRaiseWindow349* Signature: (JJ)V350*/351JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRaiseWindow352(JNIEnv *env, jclass clazz, jlong display, jlong window)353{354355AWT_CHECK_HAVE_LOCK();356XRaiseWindow( (Display *)jlong_to_ptr(display),(Window) window);357358}359360/*361* Class: XlibWrapper362* Method: XLowerWindow363* Signature: (JJ)V364*/365JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XLowerWindow366(JNIEnv *env, jclass clazz, jlong display, jlong window)367{368369AWT_CHECK_HAVE_LOCK();370XLowerWindow( (Display *)jlong_to_ptr(display),(Window) window);371372}373374/*375* Class: XlibWrapper376* Method: XRestackWindows377* Signature: (JJI)V378*/379JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows380(JNIEnv *env, jclass clazz, jlong display, jlong windows, jint length)381{382383AWT_CHECK_HAVE_LOCK();384XRestackWindows( (Display *) jlong_to_ptr(display), (Window *) jlong_to_ptr(windows), length);385386}387388/*389* Class: XlibWrapper390* Method: XConfigureWindow391* Signature: (JJJJ)V392*/393JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow394(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,395jlong values)396{397AWT_CHECK_HAVE_LOCK();398XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,399(unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));400}401402/*403* Class: XlibWrapper404* Method: XSetInputFocus405* Signature: (JJ)V406*/407JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus408(JNIEnv *env, jclass clazz, jlong display, jlong window)409{410411AWT_CHECK_HAVE_LOCK();412XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, CurrentTime);413414}415/*416* Class: XlibWrapper417* Method: XSetInputFocus2418* Signature: (JJJ)V419*/420JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus2421(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong time)422{423424AWT_CHECK_HAVE_LOCK();425XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, time);426427}428429/*430* Class: XlibWrapper431* Method: XGetInputFocus432* Signature: (JJ)V433*/434JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetInputFocus435(JNIEnv *env, jclass clazz, jlong display)436{437438Window focusOwner;439int revert_to;440AWT_CHECK_HAVE_LOCK_RETURN(0);441XGetInputFocus( (Display *)jlong_to_ptr(display), &focusOwner, &revert_to);442return focusOwner;443}444445446/*447* Class: XlibWrapper448* Method: XDestroyWindow449* Signature: (JJ)V450*/451JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDestroyWindow452(JNIEnv *env, jclass clazz, jlong display, jlong window)453{454AWT_CHECK_HAVE_LOCK();455XDestroyWindow( (Display *)jlong_to_ptr(display),(Window) window);456}457458JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabPointer459(JNIEnv *env, jclass clazz, jlong display, jlong window,460jint owner_events, jint event_mask, jint pointer_mode,461jint keyboard_mode, jlong confine_to, jlong cursor, jlong time)462{463AWT_CHECK_HAVE_LOCK_RETURN(0);464return XGrabPointer( (Display *)jlong_to_ptr(display), (Window) window,465(Bool) owner_events, (unsigned int) event_mask, (int) pointer_mode,466(int) keyboard_mode, (Window) confine_to, (Cursor) cursor, (Time) time);467}468469JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabPointer470(JNIEnv *env, jclass clazz, jlong display, jlong time)471{472AWT_CHECK_HAVE_LOCK();473XUngrabPointer( (Display *)jlong_to_ptr(display), (Time) time);474}475476JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabKeyboard477(JNIEnv *env, jclass clazz, jlong display, jlong window,478jint owner_events, jint pointer_mode,479jint keyboard_mode, jlong time)480{481AWT_CHECK_HAVE_LOCK_RETURN(0);482return XGrabKeyboard( (Display *)jlong_to_ptr(display), (Window) window,483(Bool) owner_events, (int) pointer_mode,484(int) keyboard_mode, (Time) time);485}486487JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabKeyboard488(JNIEnv *env, jclass clazz, jlong display, jlong time)489{490AWT_CHECK_HAVE_LOCK();491XUngrabKeyboard( (Display *)jlong_to_ptr(display), (Time) time);492}493494JNIEXPORT void JNICALL495Java_sun_awt_X11_XlibWrapper_XGrabServer(JNIEnv *env, jclass clazz,496jlong display) {497AWT_CHECK_HAVE_LOCK();498XGrabServer((Display*)jlong_to_ptr(display));499}500501JNIEXPORT void JNICALL502Java_sun_awt_X11_XlibWrapper_XUngrabServer(JNIEnv *env, jclass clazz,503jlong display) {504AWT_CHECK_HAVE_LOCK();505XUngrabServer((Display*)jlong_to_ptr(display));506/* Workaround for bug 5039226 */507XSync((Display*)jlong_to_ptr(display), False);508}509510/*511* Class: XlibWrapper512* Method: XUnmapWindow513* Signature: (JJ)V514*/515JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUnmapWindow516(JNIEnv *env, jclass clazz, jlong display, jlong window)517{518519AWT_CHECK_HAVE_LOCK();520XUnmapWindow( (Display *)jlong_to_ptr(display),(Window) window);521522}523524525526JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput527(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong mask)528{529AWT_CHECK_HAVE_LOCK();530XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);531}532533JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents534(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits)535{536AWT_CHECK_HAVE_LOCK();537XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,538(unsigned long)bits_to_change,539(unsigned long)values_for_bits);540}541JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails542(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits)543{544AWT_CHECK_HAVE_LOCK();545XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,546(unsigned int) event_type,547(unsigned long)bits_to_change,548(unsigned long)values_for_bits);549}550JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension551(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,552jlong error_rtrn, jlong major_in_out, jlong minor_in_out)553{554AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);555return XkbQueryExtension( (Display *) jlong_to_ptr(display),556(int *) jlong_to_ptr(opcode_rtrn),557(int *) jlong_to_ptr(event_rtrn),558(int *) jlong_to_ptr(error_rtrn),559(int *) jlong_to_ptr(major_in_out),560(int *) jlong_to_ptr(minor_in_out));561}562JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion563(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)564{565AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);566*((int *)jlong_to_ptr(lib_major_in_out)) = XkbMajorVersion;567*((int *)jlong_to_ptr(lib_minor_in_out)) = XkbMinorVersion;568return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out));569}570571JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap572(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec)573{574AWT_CHECK_HAVE_LOCK_RETURN(0);575return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display),576(unsigned int) which,577(unsigned int) device_spec);578}579JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap580(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)581{582AWT_CHECK_HAVE_LOCK_RETURN(0);583return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),584(unsigned int) which,585(XkbDescPtr) jlong_to_ptr(xkb));586}587JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard588(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)589{590AWT_CHECK_HAVE_LOCK();591XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);592}593JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode594(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)595{596AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);597Bool b;598b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,599(unsigned int *)jlong_to_ptr(mods_rtrn),600(KeySym *)jlong_to_ptr(keysym_rtrn));601//printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);602//printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn));603return b;604}605JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat606(JNIEnv *env, jclass clazz, jlong display, jboolean detectable)607{608AWT_CHECK_HAVE_LOCK();609XkbSetDetectableAutoRepeat((Display *) jlong_to_ptr(display), detectable, NULL);610}611/*612* Class: sun_awt_X11_XlibWrapper613* Method: XNextEvent614* Signature: (JJ)V615*/616617618JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XNextEvent619(JNIEnv *env, jclass clazz, jlong display, jlong ptr)620{621AWT_CHECK_HAVE_LOCK();622XNextEvent( (Display *) jlong_to_ptr(display), jlong_to_ptr(ptr));623}624625/*626* Class: sun_awt_X11_XlibWrapper627* Method: XMaskEvent628* Signature: (JJJ)V629*/630631JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMaskEvent632(JNIEnv *env, jclass clazz, jlong display, jlong event_mask, jlong event_return)633{634AWT_CHECK_HAVE_LOCK();635XMaskEvent( (Display *) jlong_to_ptr(display), event_mask, (XEvent *) jlong_to_ptr(event_return));636}637638/*639* Class: sun_awt_X11_XlibWrapper640* Method: XWindowEvent641* Signature: (JJJJ)V642*/643644JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XWindowEvent645(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong event_mask, jlong event_return)646{647AWT_CHECK_HAVE_LOCK();648XWindowEvent( (Display *) jlong_to_ptr(display), (Window)window, event_mask, (XEvent *) jlong_to_ptr(event_return));649}650651/*652* Class: sun_awt_X11_XlibWrapper653* Method: XFilterEvent654* Signature: (JJ)Z655*/656JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XFilterEvent657(JNIEnv *env, jclass clazz, jlong ptr, jlong window)658{659AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);660return (jboolean) XFilterEvent((XEvent *) jlong_to_ptr(ptr), (Window) window);661}662663/*664* Class: sun_awt_X11_XlibWrapper665* Method: XSupportsLocale666* Signature: ()Z667*/668JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XSupportsLocale669(JNIEnv *env, jclass clazz)670{671AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);672return (jboolean)XSupportsLocale();673}674675/*676* Class: sun_awt_X11_XlibWrapper677* Method: XSetLocaleModifiers678* Signature: (Ljava/lang/String;)Ljava/lang/String;679*/680JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XSetLocaleModifiers681(JNIEnv *env, jclass clazz, jstring jstr)682{683char * modifier_list = NULL;684char * ret = NULL;685686if (!JNU_IsNull(env, jstr)) {687modifier_list = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);688CHECK_NULL_RETURN(modifier_list, NULL);689}690691AWT_CHECK_HAVE_LOCK_RETURN(NULL);692if (modifier_list) {693ret = XSetLocaleModifiers(modifier_list);694JNU_ReleaseStringPlatformChars(env, jstr, (const char *) modifier_list);695} else {696ret = XSetLocaleModifiers("");697}698699return (ret != NULL ? JNU_NewStringPlatform(env, ret): NULL);700}701702703/*704* Class: sun_awt_X11_wrappers_XlibWrapper705* Method: XPeekEvent706* Signature: (JJ)V707*/708709710JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XPeekEvent711(JNIEnv *env, jclass clazz, jlong display, jlong ptr)712{713AWT_CHECK_HAVE_LOCK();714XPeekEvent((Display *) jlong_to_ptr(display),jlong_to_ptr(ptr));715}716717718/*719* Class: sun_awt_X11_XlibWrapper720* Method: XMoveResizeWindow721* Signature: (JJIIII)V722*/723724JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveResizeWindow725(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x , jint y , jint width, jint height) {726727AWT_CHECK_HAVE_LOCK();728XMoveResizeWindow( (Display *) jlong_to_ptr(display), (Window) window, x, y, width, height);729730}731732/*733* Class: sun_awt_X11_XlibWrapper734* Method: XResizeWindow735* Signature: (JJII)V736*/737738JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XResizeWindow739(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height)740{741AWT_CHECK_HAVE_LOCK();742XResizeWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);743}744745/*746* Class: sun_awt_X11_XlibWrapper747* Method: XMoveWindow748* Signature: (JJII)V749*/750751JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveWindow752(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height)753{754AWT_CHECK_HAVE_LOCK();755XMoveWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);756}757758759/*760* Class: sun_awt_X11_XlibWrapper761* Method: XSetWindowBackground762* Signature: (JJJ)V763*/764765JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWindowBackground766(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong background_pixel) {767768AWT_CHECK_HAVE_LOCK();769XSetWindowBackground((Display *) jlong_to_ptr(display),window,background_pixel);770771}772773774/*775* Class: sun_awt_X11_XlibWrapper776* Method: XFlush777* Signature: (J)V778*/779JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFlush780(JNIEnv *env, jclass clazz, jlong display) {781782AWT_CHECK_HAVE_LOCK();783XFlush((Display *)jlong_to_ptr(display));784}785786/*787* Class: sun_awt_X11_XlibWrapper788* Method: XSync789* Signature: (JI)V790*/791JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSync792(JNIEnv *env, jclass clazz, jlong display, jint discard) {793794AWT_CHECK_HAVE_LOCK();795XSync((Display *) jlong_to_ptr(display), discard);796797}798799JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XTranslateCoordinates800(JNIEnv *env, jclass clazz, jlong display, jlong src_w, jlong dest_w,801jlong src_x, jlong src_y, jlong dest_x_return, jlong dest_y_return,802jlong child_return)803{804AWT_CHECK_HAVE_LOCK_RETURN(0);805return XTranslateCoordinates( (Display *) jlong_to_ptr(display), src_w, dest_w,806src_x, src_y,807(int *) jlong_to_ptr(dest_x_return),808(int *) jlong_to_ptr(dest_y_return),809(Window *) jlong_to_ptr(child_return));810}811812JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XEventsQueued813(JNIEnv *env, jclass clazz, jlong display, jint mode) {814815AWT_CHECK_HAVE_LOCK_RETURN(0);816return XEventsQueued((Display *) jlong_to_ptr(display), mode);817818}819820/*821* Class: sun_awt_X11_XlibWrapper822* Method: SetProperty823* Signature: (JJJLjava/lang/String;)V824*/825JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_SetProperty826(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom, jstring jstr) {827char *cname;828XTextProperty tp;829int32_t status;830831/*832In case there are direct support of UTF-8 declared, use UTF-8 strings.833*/834if (!JNU_IsNull(env, jstr)) {835#ifdef X_HAVE_UTF8_STRING836cname = (char *) (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);837#else838cname = (char *) JNU_GetStringPlatformChars(env, jstr, NULL);839#endif840CHECK_NULL(cname);841} else {842cname = "";843}844845846AWT_CHECK_HAVE_LOCK();847848#ifdef X_HAVE_UTF8_STRING849status = Xutf8TextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,850XStdICCTextStyle, &tp);851#else852status = XmbTextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,853XStdICCTextStyle, &tp);854#endif855856857if (status == Success || status > 0) {858XChangeProperty((Display *)jlong_to_ptr(display), window, atom, tp.encoding, tp.format, PropModeReplace, tp.value, tp.nitems);859if (tp.value != NULL) {860XFree(tp.value);861}862}863864if (!JNU_IsNull(env, jstr)) {865#ifdef X_HAVE_UTF8_STRING866(*env)->ReleaseStringUTFChars(env, jstr, (const char *) cname);867#else868JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);869#endif870}871}872873/*874* Class: sun_awt_X11_XlibWrapper875* Method: XChangeProperty876* Signature: (JJJJJJJJJJJ)V877*/878JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyImpl(879JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,880jlong type, jint format, jint mode, jlong data, jint nelements)881{882AWT_CHECK_HAVE_LOCK();883XChangeProperty((Display*) jlong_to_ptr(display), (Window) window, (Atom) property,884(Atom) type, format, mode, (unsigned char*) jlong_to_ptr(data),885nelements);886}887/*888* Class: sun_awt_X11_XlibWrapper889* Method: XChangePropertyS890* Signature: (JJJJJJJJJLjava/lang/String;)V891*/892JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyS(893JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,894jlong type, jint format, jint mode, jstring value)895{896jboolean iscopy;897AWT_CHECK_HAVE_LOCK();898const char * chars = JNU_GetStringPlatformChars(env, value, &iscopy);899CHECK_NULL(chars);900XChangeProperty((Display*)jlong_to_ptr(display), window, (Atom)property,901(Atom)type, format, mode, (unsigned char*)chars, strlen(chars));902if (iscopy) {903JNU_ReleaseStringPlatformChars(env, value, chars);904}905}906907/*908* Class: sun_awt_X11_XlibWrapper909* Method: XGetWindowProperty910* Signature: (JJJJJJJJJJJ)J;911*/912JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowProperty913(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property, jlong long_offset,914jlong long_length, jlong delete, jlong req_type, jlong actual_type,915jlong actual_format, jlong nitems_ptr, jlong bytes_after, jlong data_ptr)916{917AWT_CHECK_HAVE_LOCK_RETURN(0);918return XGetWindowProperty((Display*) jlong_to_ptr(display), window, property, long_offset, long_length,919delete, (Atom) req_type, (Atom*) jlong_to_ptr(actual_type),920(int *) jlong_to_ptr(actual_format), (unsigned long *) jlong_to_ptr(nitems_ptr),921(unsigned long*) jlong_to_ptr(bytes_after), (unsigned char**) jlong_to_ptr(data_ptr));922}923924/*925* Class: sun_awt_X11_XlibWrapper926* Method: GetProperty927* Signature: (JJJ)Ljava/lang/String;928*/929JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_GetProperty930(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)931{932/* Request status */933int status;934935/* Returns of XGetWindowProperty */936Atom actual_type;937int actual_format;938unsigned long nitems;939unsigned long bytes_after;940unsigned char * string;941jstring res = NULL;942AWT_CHECK_HAVE_LOCK_RETURN(NULL);943status = XGetWindowProperty((Display*)jlong_to_ptr(display), window,944atom, 0, 0xFFFF, False, XA_STRING,945&actual_type, &actual_format, &nitems, &bytes_after,946&string);947948if (status != Success || string == NULL) {949return NULL;950}951952if (actual_type == XA_STRING && actual_format == 8) {953res = JNU_NewStringPlatform(env,(char*) string);954}955XFree(string);956return res;957}958959/*960* Class: sun_awt_X11_XlibWrapper961* Method: InternAtom962* Signature: (JLjava/lang/String;I)J963*/964JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_InternAtom965(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jint ife) {966967char *cname;968unsigned long atom;969970AWT_CHECK_HAVE_LOCK_RETURN(0);971972if (!JNU_IsNull(env, jstr)) {973cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);974CHECK_NULL_RETURN(cname, 0);975} else {976cname = "";977}978979atom = XInternAtom((Display *) jlong_to_ptr(display), cname, ife);980981if (!JNU_IsNull(env, jstr)) {982JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);983}984985return (jlong) atom;986987}988989JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor990(JNIEnv *env, jclass clazz, jlong display, jint shape) {991AWT_CHECK_HAVE_LOCK_RETURN(0);992return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);993}994995996/*997* Class: sun_awt_X11_XlibWrapper998* Method: XCreatePixmapCursor999* Signature: (JJJJJII)J1000*/1001JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreatePixmapCursor1002(JNIEnv *env , jclass clazz, jlong display, jlong source, jlong mask, jlong fore, jlong back, jint x , jint y) {10031004AWT_CHECK_HAVE_LOCK_RETURN(0);1005return (jlong) XCreatePixmapCursor((Display *) jlong_to_ptr(display), (Pixmap) source, (Pixmap) mask,1006(XColor *) jlong_to_ptr(fore), (XColor *) jlong_to_ptr(back), x, y);1007}100810091010/*1011* Class: sun_awt_X11_XlibWrapper1012* Method: XQueryBestCursor1013* Signature: (JJIIJJ)Z1014*/1015JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryBestCursor1016(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jlong width_return, jlong height_return) {10171018Status status;10191020AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1021status = XQueryBestCursor((Display *) jlong_to_ptr(display), (Drawable) drawable, width,height,1022(unsigned int *) jlong_to_ptr(width_return), (unsigned int *) jlong_to_ptr(height_return));10231024if (status == 0) return JNI_FALSE;1025else return JNI_TRUE;1026}102710281029/*1030* Class: sun_awt_X11_XlibWrapper1031* Method: XFreeCursor1032* Signature: (JJ)V1033*/1034JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreeCursor1035(JNIEnv *env, jclass clazz, jlong display, jlong cursor) {10361037AWT_CHECK_HAVE_LOCK();1038XFreeCursor( (Display *) jlong_to_ptr(display), (Cursor) cursor);1039}10401041/*1042* Class: sun_awt_X11_XlibWrapper1043* Method: XQueryPointer1044* Signature: (JJJJJJJJJ)Z1045*/1046JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryPointer1047(JNIEnv *env, jclass clazz, jlong display, jlong w, jlong root_return, jlong child_return, jlong root_x_return , jlong root_y_return, jlong win_x_return, jlong win_y_return, jlong mask_return) {10481049Bool b;10501051AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1052b = XQueryPointer((Display *) jlong_to_ptr(display),1053(Window) w, (Window *) jlong_to_ptr(root_return), (Window *) jlong_to_ptr(child_return),1054(int *) jlong_to_ptr(root_x_return), (int *) jlong_to_ptr(root_y_return),1055(int *) jlong_to_ptr(win_x_return), (int *) jlong_to_ptr(win_y_return),1056(unsigned int *) jlong_to_ptr(mask_return));10571058return b ? JNI_TRUE : JNI_FALSE;1059}10601061/*1062* Class: sun_awt_X11_XlibWrapper1063* Method: XChangeWindowAttributes1064* Signature: (JJJJ)V1065*/1066JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes1067(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong valuemask, jlong attributes) {10681069AWT_CHECK_HAVE_LOCK();1070XChangeWindowAttributes((Display *) jlong_to_ptr(display), (Window) window, (unsigned long) valuemask,1071(XSetWindowAttributes *) jlong_to_ptr(attributes));1072}107310741075/*1076* Class: sun_awt_X11_XlibWrapper1077* Method: XSetTransientFor1078* Signature: (JJJ)V1079*/1080JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetTransientFor1081(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong transient_for_window)1082{1083AWT_CHECK_HAVE_LOCK();1084XSetTransientForHint((Display *) jlong_to_ptr(display), window, transient_for_window);1085}10861087/*1088* Class: sun_awt_X11_XlibWrapper1089* Method: XSetWMHints1090* Signature: (JJJ)V1091*/1092JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMHints1093(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1094{1095AWT_CHECK_HAVE_LOCK();1096XSetWMHints((Display *) jlong_to_ptr(display), window, (XWMHints *) jlong_to_ptr(hints));1097}10981099/*1100* Class: sun_awt_X11_XlibWrapper1101* Method: XGetWMHints1102* Signature: (JJJ)V1103*/1104JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMHints1105(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1106{1107XWMHints * get_hints;1108AWT_CHECK_HAVE_LOCK();1109get_hints = XGetWMHints((Display*)jlong_to_ptr(display), window);1110if (get_hints != NULL) {1111memcpy(jlong_to_ptr(hints), get_hints, sizeof(XWMHints));1112XFree(get_hints);1113} else {1114memset(jlong_to_ptr(hints), 0, sizeof(XWMHints));1115}1116}11171118/*1119* Class: sun_awt_X11_XlibWrapper1120* Method: XGetPointerMapping1121* Signature: (JJI)I1122*/1123JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetPointerMapping1124(JNIEnv *env, jclass clazz, jlong display, jlong map, jint buttonNumber)1125{1126AWT_CHECK_HAVE_LOCK_RETURN(0);1127return XGetPointerMapping((Display*)jlong_to_ptr(display), (unsigned char*) jlong_to_ptr(map), buttonNumber);1128}11291130/*1131* Class: sun_awt_X11_XlibWrapper1132* Method: XGetDefault1133* Signature: (JJI)I1134*/1135JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XGetDefault1136(JNIEnv *env, jclass clazz, jlong display, jstring program, jstring option)1137{1138char * c_program = NULL;1139char * c_option = NULL;1140char * c_res = NULL;11411142if (!JNU_IsNull(env, program)) {1143c_program = (char *)JNU_GetStringPlatformChars(env, program, NULL);1144}1145CHECK_NULL_RETURN(c_program, NULL);11461147if (!JNU_IsNull(env, option)) {1148c_option = (char *)JNU_GetStringPlatformChars(env, option, NULL);1149}11501151if (c_option == NULL) {1152JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);1153return NULL;1154}11551156AWT_CHECK_HAVE_LOCK_RETURN(NULL);1157c_res = XGetDefault((Display*)jlong_to_ptr(display), c_program, c_option);1158// The strings returned by XGetDefault() are owned by Xlib and1159// should not be modified or freed by the client.11601161JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);1162JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option);11631164if (c_res != NULL) {1165return JNU_NewStringPlatform(env, c_res);1166} else {1167return NULL;1168}1169}117011711172/*1173* Class: sun_awt_X11_XlibWrapper1174* Method: getScreenOfWindow1175* Signature: (JJ)J1176*/1177JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_getScreenOfWindow1178(JNIEnv *env, jclass clazz, jlong display, jlong window)1179{1180XWindowAttributes attrs;1181memset(&attrs, 0, sizeof(attrs));1182AWT_CHECK_HAVE_LOCK_RETURN(0);1183XGetWindowAttributes((Display *) jlong_to_ptr(display), window, &attrs);1184return ptr_to_jlong(attrs.screen);1185}11861187/*1188* Class: sun_awt_X11_XlibWrapper1189* Method: XScreenNumberOfScreen1190* Signature: (J)J1191*/1192JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XScreenNumberOfScreen1193(JNIEnv *env, jclass clazz, jlong screen)1194{1195AWT_CHECK_HAVE_LOCK_RETURN(-1);1196if(jlong_to_ptr(screen) == NULL) {1197return -1;1198}1199return XScreenNumberOfScreen((Screen*) jlong_to_ptr(screen));1200}12011202/*1203* Class: sun_awt_X11_XlibWrapper1204* Method: XIconifyWindow1205* Signature: (JJJ)V1206*/1207JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XIconifyWindow1208(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong screenNumber)1209{1210AWT_CHECK_HAVE_LOCK_RETURN(0);1211return XIconifyWindow((Display*) jlong_to_ptr(display), window, screenNumber);1212}12131214/*1215* Class: sun_awt_X11_XlibWrapper1216* Method: XFree1217* Signature: (J)V1218*/1219JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFree1220(JNIEnv *env, jclass clazz, jlong ptr)1221{1222AWT_CHECK_HAVE_LOCK();1223XFree(jlong_to_ptr(ptr));1224}12251226/*1227* Class: sun_awt_X11_XlibWrapper1228* Method: XFree1229* Signature: (J)V1230*/1231JNIEXPORT jbyteArray JNICALL Java_sun_awt_X11_XlibWrapper_getStringBytes1232(JNIEnv *env, jclass clazz, jlong str_ptr)1233{1234unsigned char * str = (unsigned char*) jlong_to_ptr(str_ptr);1235long length = strlen((char*)str);1236jbyteArray res = (*env)->NewByteArray(env, length);1237CHECK_NULL_RETURN(res, NULL);1238(*env)->SetByteArrayRegion(env, res, 0, length,1239(const signed char*) str);1240return res;1241}124212431244/*1245* Class: sun_awt_X11_XlibWrapper1246* Method: ServerVendor1247* Signature: (J)Ljava/lang/String;1248*/1249JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_ServerVendor1250(JNIEnv *env, jclass clazz, jlong display)1251{1252AWT_CHECK_HAVE_LOCK_RETURN(NULL);1253return JNU_NewStringPlatform(env, ServerVendor((Display*)jlong_to_ptr(display)));1254}1255/*1256* Class: sun_awt_X11_XlibWrapper1257* Method: VendorRelease1258* Signature: (J)I;1259*/1260JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease1261(JNIEnv *env, jclass clazz, jlong display)1262{1263AWT_CHECK_HAVE_LOCK_RETURN(0);1264return VendorRelease((Display*)jlong_to_ptr(display));1265}1266/*1267* Class: sun_awt_X11_XlibWrapper1268* Method: IsXsunKPBehavior1269* Signature: (J)Z;1270*/1271JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior1272(JNIEnv *env, jclass clazz, jlong display)1273{1274// Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.1275// Otherwise, it is [1] or sometimes [0].1276// This sniffer first tries to determine what is a keycode for XK_KP_71277// using XKeysymToKeycode;1278// second, in which place in the keysymarray is XK_KP_71279// using XKeycodeToKeysym.1280int kc7;1281AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1282kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7);1283if( !kc7 ) {1284// keycode is not defined. Why, it's a reduced keyboard perhaps:1285// report arbitrarily false.1286return JNI_FALSE;1287} else {1288long ks2 = XKeycodeToKeysym((Display*)jlong_to_ptr(display), kc7, 2);1289if( ks2 == XK_KP_7 ) {1290//XXX If some Xorg server would put XK_KP_7 in keysymarray[2] as well,1291//XXX for yet unknown to me reason, the sniffer would lie.1292return JNI_TRUE;1293}else{1294return JNI_FALSE;1295}1296}1297}129812991300JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard1301(JNIEnv *env, jclass clazz, jlong display)1302{1303int xx;1304AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1305xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);1306return (!xx) ? JNI_FALSE : JNI_TRUE;1307}13081309JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard1310(JNIEnv *env, jclass clazz, jlong display)1311{1312int xx;1313static jboolean result = JNI_FALSE;13141315int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;1316KeySym *keySyms, *keySymsStart, keySym;1317int32_t i;1318int32_t kanaCount = 0;13191320AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);13211322// There's no direct way to determine whether the keyboard has1323// a kana lock key. From available keyboard mapping tables, it looks1324// like only keyboards with the kana lock key can produce keysyms1325// for kana characters. So, as an indirect test, we check for those.1326XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);1327keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);1328keySymsStart = keySyms;1329for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {1330keySym = *keySyms++;1331if ((keySym & 0xff00) == 0x0400) {1332kanaCount++;1333}1334}1335XFree(keySymsStart);13361337// use a (somewhat arbitrary) minimum so we don't get confused by a stray function key1338result = kanaCount > 10;1339return result ? JNI_TRUE : JNI_FALSE;1340}13411342JavaVM* jvm = NULL;1343static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {1344JNIEnv * env;1345// First call the native synthetic error handler declared in "awt_util.h" file.1346if (current_native_xerror_handler != NULL) {1347current_native_xerror_handler(dpy, event);1348}1349if (jvm != NULL) {1350env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);1351if (env) {1352return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil",1353"globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i;1354}1355}1356return 0;1357}13581359/*1360* Class: sun_awt_X11_XlibWrapper1361* Method: SetToolkitErrorHandler1362* Signature: ()J1363*/1364JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler1365(JNIEnv *env, jclass clazz)1366{1367if ((*env)->GetJavaVM(env, &jvm) < 0) {1368return 0;1369}1370AWT_CHECK_HAVE_LOCK_RETURN(0);1371return ptr_to_jlong(XSetErrorHandler(ToolkitErrorHandler));1372}13731374/*1375* Class: sun_awt_X11_XlibWrapper1376* Method: XSetErrorHandler1377* Signature: (J)V1378*/1379JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetErrorHandler1380(JNIEnv *env, jclass clazz, jlong handler)1381{1382AWT_CHECK_HAVE_LOCK();1383XSetErrorHandler((XErrorHandler) jlong_to_ptr(handler));1384}13851386/*1387* Class: sun_awt_X11_XlibWrapper1388* Method: CallErrorHandler1389* Signature: (JJJ)I1390*/1391JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler1392(JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)1393{1394return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));1395}139613971398/*1399* Class: sun_awt_X11_XlibWrapper1400* Method: PrintXErrorEvent1401* Signature: (JJ)V1402*/1403JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent1404(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)1405{1406char msg[128];1407char buf[128];14081409XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);14101411XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));1412jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);1413jio_snprintf(buf, sizeof(buf), "%d", err->request_code);1414XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));1415jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);1416if (err->request_code > 128) {1417jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);1418}1419}142014211422/*1423* Class: sun_awt_X11_XlibWrapper1424* Method: XInternAtoms1425* Signature: (J[Ljava/lang/String;ZJ)I1426*/1427JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XInternAtoms1428(JNIEnv *env, jclass clazz, jlong display, jobjectArray names_arr, jboolean only_if_exists, jlong atoms)1429{1430int status = 0;1431AWT_CHECK_HAVE_LOCK_RETURN(0);1432jsize length;1433char** names = stringArrayToNative(env, names_arr, &length);1434if (names) {1435status = XInternAtoms((Display*)jlong_to_ptr(display), names, length, only_if_exists, (Atom*) jlong_to_ptr(atoms));1436freeNativeStringArray(names, length);1437}1438return status;1439}1440144114421443/*1444* Class: sun_awt_X11_XlibWrapper1445* Method: XGetWindowAttributes1446* Signature: (JJJ)I1447*/1448JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowAttributes1449(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong attr_ptr)1450{1451jint status;1452AWT_CHECK_HAVE_LOCK_RETURN(0);1453memset((XWindowAttributes*) jlong_to_ptr(attr_ptr), 0, sizeof(XWindowAttributes));1454status = XGetWindowAttributes((Display*)jlong_to_ptr(display), window, (XWindowAttributes*) jlong_to_ptr(attr_ptr));1455return status;1456}145714581459/*1460* Class: sun_awt_X11_XlibWrapper1461* Method: XGetGeometry1462* Signature: (JJJJJJJJJ)I1463*/1464JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetGeometry1465(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong root_return,1466jlong x_return, jlong y_return, jlong width_return, jlong height_return,1467jlong border_width_return, jlong depth_return)1468{1469jint status;1470AWT_CHECK_HAVE_LOCK_RETURN(0);1471status = XGetGeometry((Display *)jlong_to_ptr(display),1472(Drawable)drawable, (Window *)jlong_to_ptr(root_return),1473(int *)jlong_to_ptr(x_return), (int *)jlong_to_ptr(y_return),1474(unsigned int *)jlong_to_ptr(width_return), (unsigned int *)jlong_to_ptr(height_return),1475(unsigned int *)jlong_to_ptr(border_width_return),1476(unsigned int *)jlong_to_ptr(depth_return));1477return status;1478}147914801481/*1482* Class: sun_awt_X11_XlibWrapper1483* Method: XGetWMNormalHints1484* Signature: (JJJJ)I1485*/1486JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMNormalHints1487(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints, jlong supplied_return)1488{1489AWT_CHECK_HAVE_LOCK_RETURN(0);1490return XGetWMNormalHints((Display*) jlong_to_ptr(display),1491window,1492(XSizeHints*) jlong_to_ptr(hints),1493(long*) jlong_to_ptr(supplied_return));1494}14951496/*1497* Class: sun_awt_X11_XlibWrapper1498* Method: XSetWMNormalHints1499* Signature: (JJJ)V1500*/1501JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMNormalHints1502(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1503{1504AWT_CHECK_HAVE_LOCK();1505XSetWMNormalHints((Display*) jlong_to_ptr(display), window, (XSizeHints*) jlong_to_ptr(hints));1506}15071508/*1509* Class: sun_awt_X11_XlibWrapper1510* Method: XDeleteProperty1511* Signature: (JJJ)V1512*/1513JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDeleteProperty1514(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)1515{1516AWT_CHECK_HAVE_LOCK();1517XDeleteProperty((Display*) jlong_to_ptr(display), window, (Atom)atom);1518}15191520/*1521* Class: sun_awt_X11_XlibWrapper1522* Method: XSendEvent1523* Signature: (JJZJJ)V1524*/1525JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XSendEvent1526(JNIEnv *env, jclass clazz, jlong display, jlong window, jboolean propagate, jlong event_mask, jlong event)1527{1528AWT_CHECK_HAVE_LOCK_RETURN(0);1529return XSendEvent((Display*) jlong_to_ptr(display),1530window,1531propagate==JNI_TRUE?True:False,1532(long) event_mask,1533(XEvent*) jlong_to_ptr(event));1534}153515361537/*1538* Class: sun_awt_X11_XlibWrapper1539* Method: XQueryTree1540* Signature: (JJJJJJ)I1541*/1542JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XQueryTree1543(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong root_return, jlong parent_return, jlong children_return, jlong nchildren_return)1544{1545AWT_CHECK_HAVE_LOCK_RETURN(0);1546return XQueryTree((Display*) jlong_to_ptr(display),1547window,1548(Window *) jlong_to_ptr(root_return),1549(Window*) jlong_to_ptr(parent_return),1550(Window**) jlong_to_ptr(children_return),1551(unsigned int*) jlong_to_ptr(nchildren_return));1552}155315541555/*1556* Class: sun_awt_X11_XlibWrapper1557* Method: memcpy1558* Signature: (JJJ)V1559*/1560JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_memcpy1561(JNIEnv *env, jclass clazz, jlong dest_ptr, jlong src_ptr, jlong length)1562{1563memcpy(jlong_to_ptr(dest_ptr), jlong_to_ptr(src_ptr), length);1564}156515661567JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetMinMaxHints1568(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x, jint y, jint width, jint height, jlong flags) {1569XSizeHints * hints;1570AWT_CHECK_HAVE_LOCK();1571hints = XAllocSizeHints();1572hints->flags = flags;1573hints->width = width;1574hints->min_width = width;1575hints->max_width = width;1576hints->height = height;1577hints->min_height = height;1578hints->max_height = height;1579hints->x = x;1580hints->y = y;1581XSetWMNormalHints((Display*) jlong_to_ptr(display), window, hints);1582XFree(hints);1583}158415851586JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetVisualInfo1587(JNIEnv *env, jclass clazz, jlong display, jlong vinfo_mask, jlong vinfo_template,1588jlong nitems_return)1589{1590AWT_CHECK_HAVE_LOCK_RETURN(0);1591return ptr_to_jlong(XGetVisualInfo((Display*) jlong_to_ptr(display),1592(long) vinfo_mask,1593(XVisualInfo*) jlong_to_ptr(vinfo_template),1594(int*) jlong_to_ptr(nitems_return)));1595}15961597JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XAllocSizeHints1598(JNIEnv *env, jclass clazz)1599{1600AWT_CHECK_HAVE_LOCK_RETURN(0);1601return ptr_to_jlong(XAllocSizeHints());1602}16031604/*1605* Class: sun_awt_X11_XlibWrapper1606* Method: XIconifyWindow1607* Signature: (JJJ)V1608*/1609JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XBell1610(JNIEnv *env, jclass clazz, jlong display, jint percent)1611{1612AWT_CHECK_HAVE_LOCK();1613XBell((Display*)jlong_to_ptr(display), percent);1614}161516161617/*1618* Class: sun_awt_X11_XlibWrapper1619* Method: XAllocColor1620* Signature: (JJJ)Z1621*/1622JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XAllocColor1623(JNIEnv *env, jclass clazz, jlong display , jlong colormap, jlong xcolor) {16241625Status status;1626AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1627status = XAllocColor((Display *) jlong_to_ptr(display), (Colormap) colormap, (XColor *) jlong_to_ptr(xcolor));16281629if (status == 0) return JNI_FALSE;1630else return JNI_TRUE;1631}163216331634/*1635* Class: sun_awt_X11_XlibWrapper1636* Method: XCreateBitmapFromData1637* Signature: (JJJII)J1638*/1639JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData1640(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong data, jint width, jint height) {1641AWT_CHECK_HAVE_LOCK_RETURN(0);16421643return (jlong) XCreateBitmapFromData((Display *) jlong_to_ptr(display), (Drawable) drawable,1644(char *) jlong_to_ptr(data), width, height);1645}164616471648/*1649* Class: sun_awt_X11_XlibWrapper1650* Method: XFreePixmap1651* Signature: (JJ)V1652*/1653JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreePixmap1654(JNIEnv *env, jclass clazz, jlong display, jlong pixmap) {1655AWT_CHECK_HAVE_LOCK();1656XFreePixmap((Display *)jlong_to_ptr(display), (Pixmap) pixmap);1657}16581659/*1660* Class: sun_awt_X11_XlibWrapper1661* Method: XReparentWindow1662* Signature: (JJJII)V1663*/1664JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XReparentWindow1665(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong parent, jint x, jint y) {1666AWT_CHECK_HAVE_LOCK();1667XReparentWindow((Display*)jlong_to_ptr(display), window, parent, x, y);1668}16691670/*1671* Class: sun_awt_X11_XlibWrapper1672* Method: XConvertSelection1673* Signature: (JJJJJJ)V1674*/1675JNIEXPORT void JNICALL1676Java_sun_awt_X11_XlibWrapper_XConvertSelection(JNIEnv *env, jclass clazz,1677jlong display, jlong selection,1678jlong target, jlong property,1679jlong requestor, jlong time) {1680AWT_CHECK_HAVE_LOCK();1681XConvertSelection((Display*)jlong_to_ptr(display), selection, target, property, requestor,1682time);1683}16841685/*1686* Class: sun_awt_X11_XlibWrapper1687* Method: XSetSelectionOwner1688* Signature: (JJJJ)V1689*/1690JNIEXPORT void JNICALL1691Java_sun_awt_X11_XlibWrapper_XSetSelectionOwner(JNIEnv *env, jclass clazz,1692jlong display, jlong selection,1693jlong owner, jlong time) {1694AWT_CHECK_HAVE_LOCK();1695XSetSelectionOwner((Display*)jlong_to_ptr(display), selection, owner, time);1696}16971698/*1699* Class: sun_awt_X11_XlibWrapper1700* Method: XGetSelectionOwner1701* Signature: (JJ)J1702*/1703JNIEXPORT jlong JNICALL1704Java_sun_awt_X11_XlibWrapper_XGetSelectionOwner(JNIEnv *env, jclass clazz,1705jlong display, jlong selection) {1706AWT_CHECK_HAVE_LOCK_RETURN(0);1707return (jlong)XGetSelectionOwner((Display*)jlong_to_ptr(display), selection);1708}17091710/*1711* Class: sun_awt_X11_XlibWrapper1712* Method: XGetAtomName1713* Signature: (JJ)Ljava/lang/String;1714*/1715JNIEXPORT jstring JNICALL1716Java_sun_awt_X11_XlibWrapper_XGetAtomName(JNIEnv *env, jclass clazz,1717jlong display, jlong atom)1718{1719jstring string = NULL;1720char* name;1721AWT_CHECK_HAVE_LOCK_RETURN(NULL);1722name = (char*) XGetAtomName((Display*)jlong_to_ptr(display), atom);17231724if (name == NULL) {1725fprintf(stderr, "Atom was %d\n", (int)atom);1726JNU_ThrowNullPointerException(env, "Failed to retrieve atom name.");1727return NULL;1728}17291730string = (*env)->NewStringUTF(env, (const char *)name);17311732XFree(name);17331734return string;1735}17361737/*1738* Class: sun_awt_X11_XlibWrapper1739* Method: XMaxRequestSize1740* Signature: (J)J1741*/1742JNIEXPORT jlong JNICALL1743Java_sun_awt_X11_XlibWrapper_XMaxRequestSize(JNIEnv *env, jclass clazz,1744jlong display) {1745AWT_CHECK_HAVE_LOCK_RETURN(0);1746return XMaxRequestSize((Display*) jlong_to_ptr(display));1747}17481749JNIEXPORT jlong JNICALL1750Java_sun_awt_X11_XlibWrapper_XAllocWMHints(JNIEnv *env, jclass clazz)1751{1752AWT_CHECK_HAVE_LOCK_RETURN(0);1753return ptr_to_jlong(XAllocWMHints());1754}17551756JNIEXPORT jlong JNICALL1757Java_sun_awt_X11_XlibWrapper_XCreatePixmap(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jint depth)1758{1759AWT_CHECK_HAVE_LOCK_RETURN(0);1760return XCreatePixmap((Display*)jlong_to_ptr(display), (Drawable)drawable, width, height, depth);1761}1762JNIEXPORT jlong JNICALL1763Java_sun_awt_X11_XlibWrapper_XCreateImage1764(JNIEnv *env, jclass clazz, jlong display, jlong visual_ptr,1765jint depth, jint format, jint offset, jlong data, jint width,1766jint height, jint bitmap_pad, jint bytes_per_line)1767{1768AWT_CHECK_HAVE_LOCK_RETURN(0);1769return ptr_to_jlong(XCreateImage((Display*) jlong_to_ptr(display), (Visual*) jlong_to_ptr(visual_ptr),1770depth, format, offset, (char*) jlong_to_ptr(data),1771width, height, bitmap_pad, bytes_per_line));1772}1773JNIEXPORT jlong JNICALL1774Java_sun_awt_X11_XlibWrapper_XCreateGC1775(JNIEnv *env, jclass clazz, jlong display, jlong drawable,1776jlong valuemask, jlong values)1777{1778AWT_CHECK_HAVE_LOCK_RETURN(0);1779return ptr_to_jlong(XCreateGC((Display*) jlong_to_ptr(display), (Drawable)drawable, valuemask, (XGCValues*) jlong_to_ptr(values)));1780}17811782JNIEXPORT void JNICALL1783Java_sun_awt_X11_XlibWrapper_XDestroyImage(JNIEnv *env, jclass clazz, jlong image)1784{1785XImage *img = (XImage*) jlong_to_ptr(image);1786AWT_CHECK_HAVE_LOCK();17871788// Fix for bug 4903671 :1789// We should be careful to not double free the memory pointed to data1790// Since we use unsafe to allocate it, we should use unsafe to free it.1791// So we should NULL the data pointer before calling XDestroyImage so1792// that X does not free the pointer for us.1793img->data = NULL;1794XDestroyImage(img);1795}1796JNIEXPORT void JNICALL1797Java_sun_awt_X11_XlibWrapper_XPutImage(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong gc, jlong image, jint src_x, jint src_y, jint dest_x, jint dest_y, jint width, jint height)1798{1799AWT_CHECK_HAVE_LOCK();1800XPutImage((Display*)jlong_to_ptr(display), (Drawable)drawable, (GC) jlong_to_ptr(gc), (XImage*) jlong_to_ptr(image), src_x, src_y,1801dest_x, dest_y, width, height);1802}1803JNIEXPORT void JNICALL1804Java_sun_awt_X11_XlibWrapper_XFreeGC(JNIEnv *env, jclass clazz, jlong display, jlong gc)1805{1806AWT_CHECK_HAVE_LOCK();1807XFreeGC((Display*) jlong_to_ptr(display), (GC) jlong_to_ptr(gc));1808}1809JNIEXPORT void JNICALL1810Java_sun_awt_X11_XlibWrapper_XSetWindowBackgroundPixmap(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong pixmap)1811{1812AWT_CHECK_HAVE_LOCK();1813XSetWindowBackgroundPixmap((Display*) jlong_to_ptr(display), (Window)window, (Pixmap)pixmap);1814}1815JNIEXPORT void JNICALL1816Java_sun_awt_X11_XlibWrapper_XClearWindow(JNIEnv *env, jclass clazz, jlong display, jlong window)1817{1818AWT_CHECK_HAVE_LOCK();1819XClearWindow((Display*) jlong_to_ptr(display), (Window)window);1820}18211822JNIEXPORT jint JNICALL1823Java_sun_awt_X11_XlibWrapper_XGetIconSizes(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong ret_sizes, jlong ret_count)1824{1825XIconSize** psize = (XIconSize**) jlong_to_ptr(ret_sizes);1826int * pcount = (int *) jlong_to_ptr(ret_count);1827Status res;1828AWT_CHECK_HAVE_LOCK_RETURN(0);1829res = XGetIconSizes((Display*) jlong_to_ptr(display), (Window)window, psize, pcount);1830return res;1831}18321833JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeQueryExtension1834(JNIEnv *env, jclass clazz, jlong display, jlong major_version_return,1835jlong minor_version_return)1836{1837AWT_CHECK_HAVE_LOCK_RETURN(0);1838return XdbeQueryExtension((Display*) jlong_to_ptr(display), (int *) jlong_to_ptr(major_version_return),1839(int *) jlong_to_ptr(minor_version_return));1840}18411842JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryExtension1843(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jlong mop_return,1844jlong feve_return, jlong err_return)1845{1846char *cname;1847Boolean bu;1848if (!JNU_IsNull(env, jstr)) {1849cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);1850CHECK_NULL_RETURN(cname, JNI_FALSE);1851} else {1852cname = "";1853}18541855AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1856bu = XQueryExtension((Display*) jlong_to_ptr(display), cname, (int *) jlong_to_ptr(mop_return),1857(int *) jlong_to_ptr(feve_return), (int *) jlong_to_ptr(err_return));1858if (!JNU_IsNull(env, jstr)) {1859JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);1860}1861return bu ? JNI_TRUE : JNI_FALSE;1862}18631864JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKeypadKey1865(JNIEnv *env, jclass clazz, jlong keysym)1866{1867AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1868if(IsKeypadKey(keysym)) {1869return JNI_TRUE;1870}1871return JNI_FALSE;1872}18731874JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XdbeAllocateBackBufferName1875(JNIEnv *env, jclass clazz, jlong display, jlong window, jint swap_action)1876{1877AWT_CHECK_HAVE_LOCK_RETURN(0);1878return XdbeAllocateBackBufferName((Display*) jlong_to_ptr(display), (Window) window,1879(XdbeSwapAction) swap_action);1880}18811882JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeDeallocateBackBufferName1883(JNIEnv *env, jclass clazz, jlong display, jlong buffer)1884{1885AWT_CHECK_HAVE_LOCK_RETURN(0);1886return XdbeDeallocateBackBufferName((Display*) jlong_to_ptr(display), (XdbeBackBuffer) buffer);1887}18881889JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeBeginIdiom1890(JNIEnv *env, jclass clazz, jlong display)1891{1892AWT_CHECK_HAVE_LOCK_RETURN(0);1893return XdbeBeginIdiom((Display*) jlong_to_ptr(display));1894}18951896JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeEndIdiom1897(JNIEnv *env, jclass clazz, jlong display)1898{1899AWT_CHECK_HAVE_LOCK_RETURN(0);1900return XdbeEndIdiom((Display*) jlong_to_ptr(display));1901}19021903JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers1904(JNIEnv *env, jclass clazz, jlong display, jlong swap_info, jint num_windows)1905{1906AWT_CHECK_HAVE_LOCK_RETURN(0);1907return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows);1908}1909JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap1910(JNIEnv *env, jclass clazz, jlong display, jlong vector)1911{19121913AWT_CHECK_HAVE_LOCK();1914XQueryKeymap( (Display *) jlong_to_ptr(display), (char *) jlong_to_ptr(vector));1915}19161917JNIEXPORT jlong JNICALL1918Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz,1919jlong display, jint keycode,1920jint index) {1921AWT_CHECK_HAVE_LOCK_RETURN(0);1922return XKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (int)index);1923}19241925JNIEXPORT jint JNICALL1926Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,1927jlong display) {1928XkbStateRec sr;1929AWT_CHECK_HAVE_LOCK_RETURN(0);1930memset(&sr, 0, sizeof(XkbStateRec));1931XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);1932// printf("-------------------------------------VVVV\n");1933// printf(" group:0x%0X\n",sr.group);1934// printf(" base_group:0x%0X\n",sr.base_group);1935// printf(" latched_group:0x%0X\n",sr.latched_group);1936// printf(" locked_group:0x%0X\n",sr.locked_group);1937// printf(" mods:0x%0X\n",sr.mods);1938// printf(" base_mods:0x%0X\n",sr.base_mods);1939// printf(" latched_mods:0x%0X\n",sr.latched_mods);1940// printf(" locked_mods:0x%0X\n",sr.locked_mods);1941// printf(" compat_state:0x%0X\n",sr.compat_state);1942// printf(" grab_mods:0x%0X\n",sr.grab_mods);1943// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods);1944// printf(" lookup_mods:0x%0X\n",sr.lookup_mods);1945// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);1946// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons);1947// printf("-------------------------------------^^^^\n");1948return (jint)(sr.group);1949}1950JNIEXPORT jlong JNICALL1951Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,1952jlong display, jint keycode,1953jint group, jint level) {1954AWT_CHECK_HAVE_LOCK_RETURN(0);1955return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);1956}19571958JNIEXPORT jint JNICALL1959Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,1960jlong display, jlong keysym) {1961AWT_CHECK_HAVE_LOCK_RETURN(0);1962return XKeysymToKeycode((Display*) jlong_to_ptr(display), (KeySym)keysym);1963}19641965JNIEXPORT jlong JNICALL1966Java_sun_awt_X11_XlibWrapper_XGetModifierMapping(JNIEnv *env, jclass clazz,1967jlong display) {1968AWT_CHECK_HAVE_LOCK_RETURN(0);1969return ptr_to_jlong(XGetModifierMapping((Display*) jlong_to_ptr(display)));1970}19711972JNIEXPORT void JNICALL1973Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,1974jlong keymap) {1975AWT_CHECK_HAVE_LOCK();1976XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));1977}1978/*1979* Class: sun_awt_X11_XlibWrapper1980* Method: XRefreshKeyboardMapping1981* Signature: (J)V1982*/1983JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping1984(JNIEnv *env, jclass clazz, jlong event_ptr)1985{1986AWT_CHECK_HAVE_LOCK();1987XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));1988}19891990JNIEXPORT void JNICALL1991Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,1992jlong display, jint mask,1993jlong cursor, jlong time) {1994AWT_CHECK_HAVE_LOCK();1995XChangeActivePointerGrab((Display*)jlong_to_ptr(display), (unsigned int)mask,1996(Cursor)cursor, (Time)time);1997}19981999/******************* Secondary loop support ************************************/2000#define AWT_SECONDARY_LOOP_TIMEOUT 25020012002static Bool exitSecondaryLoop = True;20032004/*2005* This predicate procedure allows the Toolkit thread to process specific events2006* while it is blocked waiting for the event dispatch thread to process2007* a SunDropTargetEvent. We need this to prevent deadlock when the client code2008* processing SunDropTargetEvent sets or gets the contents of the system2009* clipboard/selection. In this case the event dispatch thread waits for the2010* Toolkit thread to process PropertyNotify or SelectionNotify events.2011*/2012static Bool2013secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {2014return (2015event->type == SelectionNotify ||2016event->type == SelectionClear ||2017event->type == PropertyNotify ||2018(event->type == ConfigureNotify2019&& event->xany.window == *(Window*) xawt_root_window)2020) ? True : False;2021}202220232024JNIEXPORT jboolean JNICALL2025Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz,2026jlong display, jlong ptr) {2027uint32_t timeout = 1;20282029AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);2030exitSecondaryLoop = False;2031Window xawt_root_window = get_xawt_root_shell(env);20322033while (!exitSecondaryLoop) {2034if (XCheckIfEvent((Display*) jlong_to_ptr(display),2035(XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {2036return JNI_TRUE;2037}2038timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;2039AWT_WAIT(timeout);2040}2041return JNI_FALSE;2042}20432044JNIEXPORT void JNICALL2045Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop(JNIEnv *env, jclass clazz) {2046DASSERT(!exitSecondaryLoop);2047AWT_CHECK_HAVE_LOCK();2048exitSecondaryLoop = True;2049AWT_NOTIFY_ALL();2050}2051/*******************************************************************************/20522053JNIEXPORT jobjectArray JNICALL2054Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList(JNIEnv *env,2055jclass clazz,2056jbyteArray bytes,2057jlong encodingAtom) {2058XTextProperty tp;2059jbyte *value;20602061char** strings = (char **)NULL;2062int32_t nstrings = 0;2063jobjectArray ret = NULL;2064int32_t i;2065jsize len;2066jboolean isCopy = JNI_FALSE;2067static jclass stringClass = NULL;2068jclass stringClassLocal = NULL;20692070AWT_CHECK_HAVE_LOCK_RETURN(NULL);20712072if (JNU_IsNull(env, stringClass)) {2073stringClassLocal = (*env)->FindClass(env, "java/lang/String");20742075if ((*env)->ExceptionCheck(env)) {2076(*env)->ExceptionDescribe(env);2077(*env)->ExceptionClear(env);2078DASSERT(False);2079}20802081if (JNU_IsNull(env, stringClassLocal)) {2082return NULL;2083}20842085stringClass = (*env)->NewGlobalRef(env, stringClassLocal); /* never freed! */2086(*env)->DeleteLocalRef(env, stringClassLocal);20872088if (JNU_IsNull(env, stringClass)) {2089JNU_ThrowOutOfMemoryError(env, "");2090return NULL;2091}2092}20932094/*2095* If the length of the byte array is 0 just return a null2096*/2097len = (*env)->GetArrayLength(env, bytes);2098if (len == 0) {2099return (*env)->NewObjectArray(env, 0, stringClass, NULL);2100}21012102value = (*env)->GetByteArrayElements(env, bytes, &isCopy);2103if (JNU_IsNull(env, value)) {2104return NULL;2105}21062107tp.encoding = encodingAtom;2108tp.value = (unsigned char *)value;2109tp.nitems = len;2110tp.format = 8;21112112/*2113* Convert the byte stream into a list of X11 strings2114*/2115if (XTextPropertyToStringList(&tp, &strings, &nstrings) == 0) {2116(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);2117return NULL;2118}21192120(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);21212122if (nstrings == 0) {2123return (*env)->NewObjectArray(env, 0, stringClass, NULL);2124}21252126ret = (*env)->NewObjectArray(env, nstrings, stringClass, NULL);21272128if ((*env)->ExceptionCheck(env)) {2129(*env)->ExceptionDescribe(env);2130(*env)->ExceptionClear(env);2131goto wayout;2132}21332134if (JNU_IsNull(env, ret)) {2135goto wayout;2136}21372138for (i = 0; i < nstrings; i++) {2139jstring string = (*env)->NewStringUTF(env,2140(const char *)strings[i]);2141if ((*env)->ExceptionCheck(env)) {2142(*env)->ExceptionDescribe(env);2143(*env)->ExceptionClear(env);2144goto wayout;2145}21462147if (JNU_IsNull(env, string)) {2148goto wayout;2149}21502151(*env)->SetObjectArrayElement(env, ret, i, string);21522153if ((*env)->ExceptionCheck(env)) {2154(*env)->ExceptionDescribe(env);2155(*env)->ExceptionClear(env);2156goto wayout;2157}21582159(*env)->DeleteLocalRef(env, string);2160}21612162wayout:2163/*2164* Clean up and return2165*/2166XFreeStringList(strings);2167return ret;2168}216921702171JNIEXPORT void JNICALL2172Java_sun_awt_X11_XlibWrapper_XPutBackEvent(JNIEnv *env,2173jclass clazz,2174jlong display,2175jlong event) {2176XPutBackEvent((Display*)jlong_to_ptr(display), (XEvent*) jlong_to_ptr(event));2177}21782179JNIEXPORT jlong JNICALL2180Java_sun_awt_X11_XlibWrapper_getAddress(JNIEnv *env,2181jclass clazz,2182jobject o) {2183return ptr_to_jlong(o);2184}21852186JNIEXPORT void JNICALL2187Java_sun_awt_X11_XlibWrapper_copyIntArray(JNIEnv *env,2188jclass clazz,2189jlong dest, jobject array, jint size) {2190jboolean isCopy = JNI_FALSE;2191jint * ints = (*env)->GetIntArrayElements(env, array, &isCopy);2192memcpy(jlong_to_ptr(dest), ints, size);2193if (isCopy) {2194(*env)->ReleaseIntArrayElements(env, array, ints, JNI_ABORT);2195}2196}21972198JNIEXPORT void JNICALL2199Java_sun_awt_X11_XlibWrapper_copyLongArray(JNIEnv *env,2200jclass clazz,2201jlong dest, jobject array, jint size) {2202jboolean isCopy = JNI_FALSE;2203jlong * longs = (*env)->GetLongArrayElements(env, array, &isCopy);2204memcpy(jlong_to_ptr(dest), longs, size);2205if (isCopy) {2206(*env)->ReleaseLongArrayElements(env, array, longs, JNI_ABORT);2207}2208}22092210JNIEXPORT jint JNICALL2211Java_sun_awt_X11_XlibWrapper_XSynchronize(JNIEnv *env, jclass clazz, jlong display, jboolean onoff)2212{2213return (jint) XSynchronize((Display*)jlong_to_ptr(display), (onoff == JNI_TRUE ? True : False));2214}22152216JNIEXPORT jboolean JNICALL2217Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension2218(JNIEnv *env, jclass clazz, jlong display, jlong event_base_return, jlong error_base_return)2219{2220jboolean status;22212222AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);22232224status = XShapeQueryExtension((Display *)jlong_to_ptr(display),2225(int *)jlong_to_ptr(event_base_return), (int *)jlong_to_ptr(error_base_return));2226return status;2227}22282229/*2230* Class: XlibWrapper2231* Method: SetRectangularShape2232*/22332234JNIEXPORT void JNICALL2235Java_sun_awt_X11_XlibWrapper_SetRectangularShape2236(JNIEnv *env, jclass clazz, jlong display, jlong window,2237jint x1, jint y1, jint x2, jint y2,2238jobject region)2239{2240AWT_CHECK_HAVE_LOCK();22412242// If all the params are zeros, the shape must be simply reset.2243// Otherwise, the shape may be not rectangular.2244if (region || x1 || x2 || y1 || y2) {2245XRectangle rects[256];2246XRectangle *pRect = rects;22472248int numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region,2249&pRect, 256);22502251XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2252ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);2253XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2254ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);22552256if (pRect != rects) {2257free(pRect);2258}2259} else {2260// Reset the shape to a rectangular form.2261XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2262ShapeClip, 0, 0, None, ShapeSet);2263XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2264ShapeBounding, 0, 0, None, ShapeSet);2265}2266}22672268/*2269* Class: XlibWrapper2270* Method: SetZOrder2271*/22722273JNIEXPORT void JNICALL2274Java_sun_awt_X11_XlibWrapper_SetZOrder2275(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)2276{2277unsigned int value_mask = CWStackMode;22782279XWindowChanges wc;2280wc.sibling = (Window)jlong_to_ptr(above);22812282AWT_CHECK_HAVE_LOCK();22832284if (above == 0) {2285wc.stack_mode = Above;2286} else {2287wc.stack_mode = Below;2288value_mask |= CWSibling;2289}22902291XConfigureWindow((Display *)jlong_to_ptr(display),2292(Window)jlong_to_ptr(window),2293value_mask, &wc );2294}22952296/*2297* Class: XlibWrapper2298* Method: SetBitmapShape2299*/2300JNIEXPORT void JNICALL2301Java_sun_awt_X11_XlibWrapper_SetBitmapShape2302(JNIEnv *env, jclass clazz, jlong display, jlong window,2303jint width, jint height, jintArray bitmap)2304{2305jsize len;2306jint *values;2307jboolean isCopy = JNI_FALSE;2308size_t worstBufferSize = (size_t)((width / 2 + 1) * height);2309RECT_T * pRect;2310int numrects;23112312if (!IS_SAFE_SIZE_MUL(width / 2 + 1, height)) {2313return;2314}23152316AWT_CHECK_HAVE_LOCK();23172318len = (*env)->GetArrayLength(env, bitmap);2319if (len == 0 || len < width * height) {2320return;2321}23222323values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);2324if (JNU_IsNull(env, values)) {2325return;2326}23272328pRect = (RECT_T *)SAFE_SIZE_ARRAY_ALLOC(malloc, worstBufferSize, sizeof(RECT_T));2329if (!pRect) {2330return;2331}23322333/* Note: the values[0] and values[1] are supposed to contain the width2334* and height (see XIconInfo.getIntData() for details). So, we do +2.2335*/2336numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,2337(unsigned char *)(values + 2), pRect);23382339XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2340ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);2341XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2342ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);23432344free(pRect);23452346(*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);2347}2348234923502351