Path: blob/master/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c
41153 views
/*1* Copyright (c) 2002, 2020, 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#ifdef HEADLESS26#error This file should not be included in headless library27#endif2829#include "awt.h"30#include "awt_util.h"31#include "jni.h"32#include "jlong.h"33#include "Region.h"34#include "sizecalc.h"35#include "utility/rect.h"3637#include "sun_awt_X11_XlibWrapper.h"3839#include <stdlib.h>40#include <string.h>41#include <X11/extensions/Xdbe.h>42#include <X11/extensions/shape.h>43#include <X11/keysym.h>44#include <X11/Sunkeysym.h>45#include <X11/Xlib.h>46#include <X11/Xatom.h>47#include <X11/XKBlib.h>48#include <X11/Xos.h>49#include <X11/Xutil.h>5051#if defined(AIX)52#undef X_HAVE_UTF8_STRING53extern Bool statusWindowEventHandler(XEvent event);54#endif5556// From XWindow.c57extern KeySym keycodeToKeysym(Display *display, KeyCode keycode, int index);5859#if defined(DEBUG)60static jmethodID lockIsHeldMID = NULL;6162static void63CheckHaveAWTLock(JNIEnv *env)64{65if (lockIsHeldMID == NULL) {66if (tkClass == NULL) return;67lockIsHeldMID =68(*env)->GetStaticMethodID(env, tkClass,69"isAWTLockHeldByCurrentThread", "()Z");70if (lockIsHeldMID == NULL) return;71}72if (!(*env)->CallStaticBooleanMethod(env, tkClass, lockIsHeldMID)) {73JNU_ThrowInternalError(env, "Current thread does not hold AWT_LOCK!");74}75}7677#define AWT_CHECK_HAVE_LOCK() \78do { \79CheckHaveAWTLock(env); \80if ((*env)->ExceptionCheck(env)) { \81return; \82} \83} while (0); \8485#define AWT_CHECK_HAVE_LOCK_RETURN(ret) \86do { \87CheckHaveAWTLock(env); \88if ((*env)->ExceptionCheck(env)) { \89return (ret); \90} \91} while (0); \9293#else94#define AWT_CHECK_HAVE_LOCK()95#define AWT_CHECK_HAVE_LOCK_RETURN(ret)96#endif9798void freeNativeStringArray(char **array, jsize length) {99int i;100if (array == NULL) {101return;102}103for (i = 0; i < length; i++) {104free(array[i]);105}106free(array);107}108109char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length) {110Bool err = FALSE;111char ** strings;112int index, str_index = 0;113jsize length = (*env)->GetArrayLength(env, array);114115if (length == 0) {116return NULL;117}118119strings = (char**) calloc(length, sizeof (char*));120121if (strings == NULL) {122JNU_ThrowOutOfMemoryError(env, "");123return NULL;124}125126for (index = 0; index < length; index++) {127jstring str = (*env)->GetObjectArrayElement(env, array, index);128if (str != NULL) {129const char * str_char = JNU_GetStringPlatformChars(env, str, NULL);130if (str_char != NULL) {131char * dup_str = strdup(str_char);132if (dup_str != NULL) {133strings[str_index++] = dup_str;134} else {135JNU_ThrowOutOfMemoryError(env, "");136err = TRUE;137}138JNU_ReleaseStringPlatformChars(env, str, str_char);139} else {140err = TRUE;141}142(*env)->DeleteLocalRef(env, str);143if (err) {144break;145}146}147}148149if (err) {150freeNativeStringArray(strings, str_index);151strings = NULL;152str_index = -1;153}154*ret_length = str_index;155156return strings;157}158159/*160* Class: XlibWrapper161* Method: XOpenDisplay162* Signature: (J)J163*/164165JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XOpenDisplay166(JNIEnv *env, jclass clazz, jlong display_name)167{168Display *dp;169AWT_CHECK_HAVE_LOCK_RETURN(0);170dp = XOpenDisplay((char *) jlong_to_ptr(display_name));171172return ptr_to_jlong(dp);173}174175JNIEXPORT void JNICALL176Java_sun_awt_X11_XlibWrapper_XCloseDisplay(JNIEnv *env, jclass clazz,177jlong display) {178AWT_CHECK_HAVE_LOCK();179XCloseDisplay((Display*) jlong_to_ptr(display));180}181182JNIEXPORT jlong JNICALL183Java_sun_awt_X11_XlibWrapper_XDisplayString(JNIEnv *env, jclass clazz,184jlong display) {185AWT_CHECK_HAVE_LOCK_RETURN(0);186return ptr_to_jlong(XDisplayString((Display*) jlong_to_ptr(display)));187}188189JNIEXPORT void JNICALL190Java_sun_awt_X11_XlibWrapper_XSetCloseDownMode(JNIEnv *env, jclass clazz,191jlong display, jint mode) {192AWT_CHECK_HAVE_LOCK();193XSetCloseDownMode((Display*) jlong_to_ptr(display), (int)mode);194}195196/*197* Class: sun_awt_X11_XlibWrapper198* Method: DefaultScreen199* Signature: (J)J200*/201JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DefaultScreen (JNIEnv *env, jclass clazz, jlong display) {202203AWT_CHECK_HAVE_LOCK_RETURN(0);204return (jlong) DefaultScreen((Display *) jlong_to_ptr(display));205}206207/*208* Class: sun_awt_X11_XlibWrapper209* Method: ScreenOfDisplay210* Signature: (JJ)J211*/212JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_ScreenOfDisplay(JNIEnv *env, jclass clazz, jlong display, jlong screen_number) {213AWT_CHECK_HAVE_LOCK_RETURN(0);214return ptr_to_jlong(ScreenOfDisplay((Display *) jlong_to_ptr(display),215screen_number));216}217218/*219* Class: sun_awt_X11_XlibWrapper220* Method: DoesBackingStore221* Signature: (J)I222*/223JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DoesBackingStore(JNIEnv *env, jclass clazz, jlong screen) {224AWT_CHECK_HAVE_LOCK_RETURN(0);225return (jint) DoesBackingStore((Screen*) jlong_to_ptr(screen));226}227228/*229* Class: sun_awt_X11_XlibWrapper230* Method: DisplayWidth231* Signature: (JJ)J232*/233JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidth234(JNIEnv *env, jclass clazz, jlong display, jlong screen) {235236AWT_CHECK_HAVE_LOCK_RETURN(0);237return (jlong) DisplayWidth((Display *) jlong_to_ptr(display),screen);238239}240241/*242* Class: sun_awt_X11_XlibWrapper243* Method: DisplayWidthMM244* Signature: (JJ)J245*/246JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidthMM247(JNIEnv *env, jclass clazz, jlong display, jlong screen) {248AWT_CHECK_HAVE_LOCK_RETURN(0);249return (jlong) DisplayWidthMM((Display *) jlong_to_ptr(display),screen);250}251252/*253* Class: sun_awt_X11_XlibWrapper254* Method: DisplayHeight255* Signature: (JJ)J256*/257JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeight258(JNIEnv *env, jclass clazz, jlong display, jlong screen) {259260AWT_CHECK_HAVE_LOCK_RETURN(0);261return (jlong) DisplayHeight((Display *) jlong_to_ptr(display),screen);262}263/*264* Class: sun_awt_X11_XlibWrapper265* Method: DisplayHeightMM266* Signature: (JJ)J267*/268JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeightMM269(JNIEnv *env, jclass clazz, jlong display, jlong screen) {270AWT_CHECK_HAVE_LOCK_RETURN(0);271return (jlong) DisplayHeightMM((Display *) jlong_to_ptr(display),screen);272}273274/*275* Class: sun_awt_X11_XlibWrapper276* Method: RootWindow277* Signature: (JJ)J278*/279JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_RootWindow280(JNIEnv *env , jclass clazz, jlong display, jlong screen_number) {281AWT_CHECK_HAVE_LOCK_RETURN(0);282return (jlong) RootWindow((Display *) jlong_to_ptr(display), screen_number);283}284285/*286* Class: sun_awt_X11_XlibWrapper287* Method: ScreenCount288*/289JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_ScreenCount290(JNIEnv *env , jclass clazz, jlong display) {291AWT_CHECK_HAVE_LOCK_RETURN(0);292return ScreenCount((Display *) jlong_to_ptr(display));293}294295/*296* Class: XlibWrapper297* Method: XCreateWindow298* Signature: (JJIIIIIIJJJJ)J299*/300JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateWindow301(JNIEnv *env, jclass clazz, jlong display, jlong window,302jint x, jint y, jint w, jint h , jint border_width, jint depth,303jlong wclass, jlong visual, jlong valuemask, jlong attributes)304{305AWT_CHECK_HAVE_LOCK_RETURN(0);306return XCreateWindow((Display *) jlong_to_ptr(display),(Window) window, x, y, w, h,307border_width, depth, wclass, (Visual *) jlong_to_ptr(visual),308valuemask, (XSetWindowAttributes *) jlong_to_ptr(attributes));309}310311/*312* Class: XlibWrapper313* Method: XConvertCase314* Signature: (JJJ)V315*/316JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConvertCase317(JNIEnv *env, jclass clazz, jlong keysym,318jlong keysym_lowercase, jlong keysym_uppercase)319{320AWT_CHECK_HAVE_LOCK();321XConvertCase(keysym, (jlong_to_ptr(keysym_lowercase)),322(jlong_to_ptr(keysym_uppercase)));323}324325/*326* Class: XlibWrapper327* Method: XMapWindow328* Signature: (JJ)V329*/330JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapWindow331(JNIEnv *env, jclass clazz, jlong display, jlong window)332{333AWT_CHECK_HAVE_LOCK();334XMapWindow( (Display *)jlong_to_ptr(display),(Window) window);335}336337/*338* Class: XlibWrapper339* Method: XMapRaised340* Signature: (JJ)V341*/342JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapRaised343(JNIEnv *env, jclass clazz, jlong display, jlong window)344{345AWT_CHECK_HAVE_LOCK();346XMapRaised( (Display *)jlong_to_ptr(display),(Window) window);347}348349/*350* Class: XlibWrapper351* Method: XRaiseWindow352* Signature: (JJ)V353*/354JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRaiseWindow355(JNIEnv *env, jclass clazz, jlong display, jlong window)356{357AWT_CHECK_HAVE_LOCK();358XRaiseWindow( (Display *)jlong_to_ptr(display),(Window) window);359}360361/*362* Class: XlibWrapper363* Method: XLowerWindow364* Signature: (JJ)V365*/366JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XLowerWindow367(JNIEnv *env, jclass clazz, jlong display, jlong window)368{369AWT_CHECK_HAVE_LOCK();370XLowerWindow( (Display *)jlong_to_ptr(display),(Window) window);371}372373/*374* Class: XlibWrapper375* Method: XRestackWindows376* Signature: (JJI)V377*/378JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows379(JNIEnv *env, jclass clazz, jlong display, jlong windows, jint length)380{381AWT_CHECK_HAVE_LOCK();382XRestackWindows( (Display *) jlong_to_ptr(display), (Window *) jlong_to_ptr(windows), length);383}384385/*386* Class: XlibWrapper387* Method: XConfigureWindow388* Signature: (JJJJ)V389*/390JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow391(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,392jlong values)393{394AWT_CHECK_HAVE_LOCK();395XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,396(unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));397}398399/*400* Class: XlibWrapper401* Method: XSetInputFocus402* Signature: (JJ)V403*/404JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus405(JNIEnv *env, jclass clazz, jlong display, jlong window)406{407AWT_CHECK_HAVE_LOCK();408XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, CurrentTime);409}410411/*412* Class: XlibWrapper413* Method: XSetInputFocus2414* Signature: (JJJ)V415*/416JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus2417(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong time)418{419AWT_CHECK_HAVE_LOCK();420XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, time);421}422423/*424* Class: XlibWrapper425* Method: XGetInputFocus426* Signature: (JJ)V427*/428JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetInputFocus429(JNIEnv *env, jclass clazz, jlong display)430{431Window focusOwner;432int revert_to;433AWT_CHECK_HAVE_LOCK_RETURN(0);434XGetInputFocus( (Display *)jlong_to_ptr(display), &focusOwner, &revert_to);435return focusOwner;436}437438/*439* Class: XlibWrapper440* Method: XDestroyWindow441* Signature: (JJ)V442*/443JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDestroyWindow444(JNIEnv *env, jclass clazz, jlong display, jlong window)445{446AWT_CHECK_HAVE_LOCK();447XDestroyWindow( (Display *)jlong_to_ptr(display),(Window) window);448}449450JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabPointer451(JNIEnv *env, jclass clazz, jlong display, jlong window,452jint owner_events, jint event_mask, jint pointer_mode,453jint keyboard_mode, jlong confine_to, jlong cursor, jlong time)454{455AWT_CHECK_HAVE_LOCK_RETURN(0);456return XGrabPointer( (Display *)jlong_to_ptr(display), (Window) window,457(Bool) owner_events, (unsigned int) event_mask, (int) pointer_mode,458(int) keyboard_mode, (Window) confine_to, (Cursor) cursor, (Time) time);459}460461JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabPointer462(JNIEnv *env, jclass clazz, jlong display, jlong time)463{464AWT_CHECK_HAVE_LOCK();465XUngrabPointer( (Display *)jlong_to_ptr(display), (Time) time);466}467468JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabKeyboard469(JNIEnv *env, jclass clazz, jlong display, jlong window,470jint owner_events, jint pointer_mode,471jint keyboard_mode, jlong time)472{473AWT_CHECK_HAVE_LOCK_RETURN(0);474return XGrabKeyboard( (Display *)jlong_to_ptr(display), (Window) window,475(Bool) owner_events, (int) pointer_mode,476(int) keyboard_mode, (Time) time);477}478479JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabKeyboard480(JNIEnv *env, jclass clazz, jlong display, jlong time)481{482AWT_CHECK_HAVE_LOCK();483XUngrabKeyboard( (Display *)jlong_to_ptr(display), (Time) time);484}485486JNIEXPORT void JNICALL487Java_sun_awt_X11_XlibWrapper_XGrabServer(JNIEnv *env, jclass clazz,488jlong display) {489AWT_CHECK_HAVE_LOCK();490XGrabServer((Display*)jlong_to_ptr(display));491}492493JNIEXPORT void JNICALL494Java_sun_awt_X11_XlibWrapper_XUngrabServer(JNIEnv *env, jclass clazz,495jlong display) {496AWT_CHECK_HAVE_LOCK();497XUngrabServer((Display*)jlong_to_ptr(display));498/* Workaround for bug 5039226 */499XSync((Display*)jlong_to_ptr(display), False);500}501502/*503* Class: XlibWrapper504* Method: XUnmapWindow505* Signature: (JJ)V506*/507JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUnmapWindow508(JNIEnv *env, jclass clazz, jlong display, jlong window)509{510511AWT_CHECK_HAVE_LOCK();512XUnmapWindow( (Display *)jlong_to_ptr(display),(Window) window);513514}515516JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput517(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong mask)518{519AWT_CHECK_HAVE_LOCK();520XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);521}522523JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents524(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change,525jlong values_for_bits)526{527AWT_CHECK_HAVE_LOCK();528XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,529(unsigned long)bits_to_change,530(unsigned long)values_for_bits);531}532533JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails534(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type,535jlong bits_to_change, jlong values_for_bits)536{537AWT_CHECK_HAVE_LOCK();538XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,539(unsigned int) event_type,540(unsigned long)bits_to_change,541(unsigned long)values_for_bits);542}543544JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension545(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,546jlong error_rtrn, jlong major_in_out, jlong minor_in_out)547{548Bool status;549AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);550status = XkbQueryExtension((Display *) jlong_to_ptr(display),551(int *) jlong_to_ptr(opcode_rtrn),552(int *) jlong_to_ptr(event_rtrn),553(int *) jlong_to_ptr(error_rtrn),554(int *) jlong_to_ptr(major_in_out),555(int *) jlong_to_ptr(minor_in_out));556return status ? JNI_TRUE : JNI_FALSE;557}558559JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion560(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)561{562Bool status;563AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);564*((int *)jlong_to_ptr(lib_major_in_out)) = XkbMajorVersion;565*((int *)jlong_to_ptr(lib_minor_in_out)) = XkbMinorVersion;566status = XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out),567(int *)jlong_to_ptr(lib_minor_in_out));568return status ? JNI_TRUE : JNI_FALSE;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}579580JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap581(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)582{583AWT_CHECK_HAVE_LOCK_RETURN(0);584return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),585(unsigned int) which,586(XkbDescPtr) jlong_to_ptr(xkb));587}588JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard589(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)590{591AWT_CHECK_HAVE_LOCK();592XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);593}594JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode595(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)596{597AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);598Bool b;599b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,600(unsigned int *)jlong_to_ptr(mods_rtrn),601(KeySym *)jlong_to_ptr(keysym_rtrn));602//printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);603//printf("native, output: keysym:0x%0X; mods:0x%0X\n",604// *(unsigned int *)jlong_to_ptr(keysym_rtrn),605// *(unsigned int *)jlong_to_ptr(mods_rtrn));606return b ? JNI_TRUE : JNI_FALSE;607}608JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat609(JNIEnv *env, jclass clazz, jlong display, jboolean detectable)610{611AWT_CHECK_HAVE_LOCK();612XkbSetDetectableAutoRepeat((Display *) jlong_to_ptr(display), detectable, NULL);613}614/*615* Class: sun_awt_X11_XlibWrapper616* Method: XNextEvent617* Signature: (JJ)V618*/619JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XNextEvent620(JNIEnv *env, jclass clazz, jlong display, jlong ptr)621{622AWT_CHECK_HAVE_LOCK();623XNextEvent( (Display *) jlong_to_ptr(display), jlong_to_ptr(ptr));624}625626/*627* Class: sun_awt_X11_XlibWrapper628* Method: XMaskEvent629* Signature: (JJJ)V630*/631JNIEXPORT 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*/643JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XWindowEvent644(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong event_mask, jlong event_return)645{646AWT_CHECK_HAVE_LOCK();647XWindowEvent( (Display *) jlong_to_ptr(display), (Window)window, event_mask, (XEvent *) jlong_to_ptr(event_return));648}649650/*651* Class: sun_awt_X11_XlibWrapper652* Method: XFilterEvent653* Signature: (JJ)Z654*/655JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XFilterEvent656(JNIEnv *env, jclass clazz, jlong ptr, jlong window)657{658AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);659#if defined(AIX)660if (True == statusWindowEventHandler(*((XEvent *)(uintptr_t)ptr))) {661return (jboolean)True;662}663#endif664return (jboolean) XFilterEvent((XEvent *) jlong_to_ptr(ptr), (Window) window);665}666667/*668* Class: sun_awt_X11_XlibWrapper669* Method: XSupportsLocale670* Signature: ()Z671*/672JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XSupportsLocale673(JNIEnv *env, jclass clazz)674{675AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);676return (jboolean)XSupportsLocale();677}678679/*680* Class: sun_awt_X11_XlibWrapper681* Method: XSetLocaleModifiers682* Signature: (Ljava/lang/String;)Ljava/lang/String;683*/684JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XSetLocaleModifiers685(JNIEnv *env, jclass clazz, jstring jstr)686{687char * modifier_list = NULL;688char * ret = NULL;689690if (!JNU_IsNull(env, jstr)) {691modifier_list = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);692CHECK_NULL_RETURN(modifier_list, NULL);693}694695AWT_CHECK_HAVE_LOCK_RETURN(NULL);696if (modifier_list) {697ret = XSetLocaleModifiers(modifier_list);698JNU_ReleaseStringPlatformChars(env, jstr, (const char *) modifier_list);699} else {700ret = XSetLocaleModifiers("");701}702703return (ret != NULL ? JNU_NewStringPlatform(env, ret): NULL);704}705706707/*708* Class: sun_awt_X11_wrappers_XlibWrapper709* Method: XPeekEvent710* Signature: (JJ)V711*/712713714JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XPeekEvent715(JNIEnv *env, jclass clazz, jlong display, jlong ptr)716{717AWT_CHECK_HAVE_LOCK();718XPeekEvent((Display *) jlong_to_ptr(display),jlong_to_ptr(ptr));719}720721/*722* Class: sun_awt_X11_XlibWrapper723* Method: XMoveResizeWindow724* Signature: (JJIIII)V725*/726JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveResizeWindow727(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x , jint y , jint width, jint height) {728AWT_CHECK_HAVE_LOCK();729XMoveResizeWindow( (Display *) jlong_to_ptr(display), (Window) window, x, y, width, height);730}731732/*733* Class: sun_awt_X11_XlibWrapper734* Method: XResizeWindow735* Signature: (JJII)V736*/737JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XResizeWindow738(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height) {739AWT_CHECK_HAVE_LOCK();740XResizeWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);741}742743/*744* Class: sun_awt_X11_XlibWrapper745* Method: XMoveWindow746* Signature: (JJII)V747*/748JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMoveWindow749(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height) {750AWT_CHECK_HAVE_LOCK();751XMoveWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);752}753754755/*756* Class: sun_awt_X11_XlibWrapper757* Method: XSetWindowBackground758* Signature: (JJJ)V759*/760JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWindowBackground761(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong background_pixel) {762AWT_CHECK_HAVE_LOCK();763XSetWindowBackground((Display *) jlong_to_ptr(display),window,background_pixel);764}765766767/*768* Class: sun_awt_X11_XlibWrapper769* Method: XFlush770* Signature: (J)V771*/772JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFlush773(JNIEnv *env, jclass clazz, jlong display) {774775AWT_CHECK_HAVE_LOCK();776XFlush((Display *)jlong_to_ptr(display));777}778779/*780* Class: sun_awt_X11_XlibWrapper781* Method: XSync782* Signature: (JI)V783*/784JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSync785(JNIEnv *env, jclass clazz, jlong display, jint discard) {786AWT_CHECK_HAVE_LOCK();787XSync((Display *) jlong_to_ptr(display), discard);788}789790JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XTranslateCoordinates791(JNIEnv *env, jclass clazz, jlong display, jlong src_w, jlong dest_w,792jlong src_x, jlong src_y, jlong dest_x_return, jlong dest_y_return,793jlong child_return)794{795AWT_CHECK_HAVE_LOCK_RETURN(0);796return XTranslateCoordinates( (Display *) jlong_to_ptr(display), src_w, dest_w,797src_x, src_y,798(int *) jlong_to_ptr(dest_x_return),799(int *) jlong_to_ptr(dest_y_return),800(Window *) jlong_to_ptr(child_return));801}802803JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XEventsQueued804(JNIEnv *env, jclass clazz, jlong display, jint mode) {805806AWT_CHECK_HAVE_LOCK_RETURN(0);807return XEventsQueued((Display *) jlong_to_ptr(display), mode);808809}810811/*812* Class: sun_awt_X11_XlibWrapper813* Method: SetProperty814* Signature: (JJJLjava/lang/String;)V815*/816JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_SetProperty817(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom, jstring jstr) {818char *cname;819XTextProperty tp;820int32_t status;821822/*823In case there are direct support of UTF-8 declared, use UTF-8 strings.824*/825if (!JNU_IsNull(env, jstr)) {826#ifdef X_HAVE_UTF8_STRING827cname = (char *) (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);828#else829cname = (char *) JNU_GetStringPlatformChars(env, jstr, NULL);830#endif831CHECK_NULL(cname);832} else {833cname = "";834}835836AWT_CHECK_HAVE_LOCK();837838#ifdef X_HAVE_UTF8_STRING839status = Xutf8TextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,840XStdICCTextStyle, &tp);841#else842status = XmbTextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,843XStdICCTextStyle, &tp);844#endif845846if (status == Success || status > 0) {847XChangeProperty((Display *)jlong_to_ptr(display), window, atom, tp.encoding, tp.format, PropModeReplace, tp.value, tp.nitems);848if (tp.value != NULL) {849XFree(tp.value);850}851}852853if (!JNU_IsNull(env, jstr)) {854#ifdef X_HAVE_UTF8_STRING855(*env)->ReleaseStringUTFChars(env, jstr, (const char *) cname);856#else857JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);858#endif859}860}861862/*863* Class: sun_awt_X11_XlibWrapper864* Method: XChangeProperty865* Signature: (JJJJJJJJJJJ)V866*/867JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyImpl(868JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,869jlong type, jint format, jint mode, jlong data, jint nelements)870{871AWT_CHECK_HAVE_LOCK();872XChangeProperty((Display*) jlong_to_ptr(display), (Window) window, (Atom) property,873(Atom) type, format, mode, (unsigned char*) jlong_to_ptr(data),874nelements);875}876/*877* Class: sun_awt_X11_XlibWrapper878* Method: XChangePropertyS879* Signature: (JJJJJJJJJLjava/lang/String;)V880*/881JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyS(882JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,883jlong type, jint format, jint mode, jstring value)884{885jboolean iscopy;886AWT_CHECK_HAVE_LOCK();887const char * chars = JNU_GetStringPlatformChars(env, value, &iscopy);888CHECK_NULL(chars);889XChangeProperty((Display*)jlong_to_ptr(display), window, (Atom)property,890(Atom)type, format, mode, (unsigned char*)chars, strlen(chars));891if (iscopy) {892JNU_ReleaseStringPlatformChars(env, value, chars);893}894}895896/*897* Class: sun_awt_X11_XlibWrapper898* Method: XGetWindowProperty899* Signature: (JJJJJJJJJJJ)J;900*/901JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowProperty902(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property, jlong long_offset,903jlong long_length, jlong delete, jlong req_type, jlong actual_type,904jlong actual_format, jlong nitems_ptr, jlong bytes_after, jlong data_ptr)905{906AWT_CHECK_HAVE_LOCK_RETURN(0);907return XGetWindowProperty((Display*) jlong_to_ptr(display), window, property, long_offset, long_length,908delete, (Atom) req_type, (Atom*) jlong_to_ptr(actual_type),909(int *) jlong_to_ptr(actual_format), (unsigned long *) jlong_to_ptr(nitems_ptr),910(unsigned long*) jlong_to_ptr(bytes_after), (unsigned char**) jlong_to_ptr(data_ptr));911}912913/*914* Class: sun_awt_X11_XlibWrapper915* Method: GetProperty916* Signature: (JJJ)Ljava/lang/String;917*/918JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_GetProperty919(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)920{921/* Request status */922int status;923924/* Returns of XGetWindowProperty */925Atom actual_type;926int actual_format;927unsigned long nitems;928unsigned long bytes_after;929unsigned char * string;930jstring res = NULL;931AWT_CHECK_HAVE_LOCK_RETURN(NULL);932status = XGetWindowProperty((Display*)jlong_to_ptr(display), window,933atom, 0, 0xFFFF, False, XA_STRING,934&actual_type, &actual_format, &nitems, &bytes_after,935&string);936937if (status != Success || string == NULL) {938return NULL;939}940941if (actual_type == XA_STRING && actual_format == 8) {942res = JNU_NewStringPlatform(env,(char*) string);943}944XFree(string);945return res;946}947948/*949* Class: sun_awt_X11_XlibWrapper950* Method: InternAtom951* Signature: (JLjava/lang/String;I)J952*/953JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_InternAtom954(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jint ife) {955956char *cname;957unsigned long atom;958959AWT_CHECK_HAVE_LOCK_RETURN(0);960961if (!JNU_IsNull(env, jstr)) {962cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);963CHECK_NULL_RETURN(cname, 0);964} else {965cname = "";966}967968atom = XInternAtom((Display *) jlong_to_ptr(display), cname, ife);969970if (!JNU_IsNull(env, jstr)) {971JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);972}973974return (jlong) atom;975976}977978JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor979(JNIEnv *env, jclass clazz, jlong display, jint shape) {980AWT_CHECK_HAVE_LOCK_RETURN(0);981return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);982}983984/*985* Class: sun_awt_X11_XlibWrapper986* Method: XCreatePixmapCursor987* Signature: (JJJJJII)J988*/989JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreatePixmapCursor990(JNIEnv *env , jclass clazz, jlong display, jlong source, jlong mask, jlong fore, jlong back, jint x , jint y) {991992AWT_CHECK_HAVE_LOCK_RETURN(0);993return (jlong) XCreatePixmapCursor((Display *) jlong_to_ptr(display), (Pixmap) source, (Pixmap) mask,994(XColor *) jlong_to_ptr(fore), (XColor *) jlong_to_ptr(back), x, y);995}996997/*998* Class: sun_awt_X11_XlibWrapper999* Method: XQueryBestCursor1000* Signature: (JJIIJJ)Z1001*/1002JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryBestCursor1003(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jlong width_return, jlong height_return) {10041005Status status;10061007AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1008status = XQueryBestCursor((Display *) jlong_to_ptr(display), (Drawable) drawable, width,height,1009(unsigned int *) jlong_to_ptr(width_return), (unsigned int *) jlong_to_ptr(height_return));10101011if (status == 0) return JNI_FALSE;1012else return JNI_TRUE;1013}10141015/*1016* Class: sun_awt_X11_XlibWrapper1017* Method: XFreeCursor1018* Signature: (JJ)V1019*/1020JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreeCursor1021(JNIEnv *env, jclass clazz, jlong display, jlong cursor) {10221023AWT_CHECK_HAVE_LOCK();1024XFreeCursor( (Display *) jlong_to_ptr(display), (Cursor) cursor);1025}10261027/*1028* Class: sun_awt_X11_XlibWrapper1029* Method: XQueryPointer1030* Signature: (JJJJJJJJJ)Z1031*/1032JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryPointer1033(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) {10341035Bool b;10361037AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1038b = XQueryPointer((Display *) jlong_to_ptr(display),1039(Window) w, (Window *) jlong_to_ptr(root_return), (Window *) jlong_to_ptr(child_return),1040(int *) jlong_to_ptr(root_x_return), (int *) jlong_to_ptr(root_y_return),1041(int *) jlong_to_ptr(win_x_return), (int *) jlong_to_ptr(win_y_return),1042(unsigned int *) jlong_to_ptr(mask_return));10431044return b ? JNI_TRUE : JNI_FALSE;1045}10461047/*1048* Class: sun_awt_X11_XlibWrapper1049* Method: XChangeWindowAttributes1050* Signature: (JJJJ)V1051*/1052JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes1053(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong valuemask, jlong attributes) {10541055AWT_CHECK_HAVE_LOCK();1056XChangeWindowAttributes((Display *) jlong_to_ptr(display), (Window) window, (unsigned long) valuemask,1057(XSetWindowAttributes *) jlong_to_ptr(attributes));1058}10591060/*1061* Class: sun_awt_X11_XlibWrapper1062* Method: XSetTransientFor1063* Signature: (JJJ)V1064*/1065JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetTransientFor1066(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong transient_for_window)1067{1068AWT_CHECK_HAVE_LOCK();1069XSetTransientForHint((Display *) jlong_to_ptr(display), window, transient_for_window);1070}10711072/*1073* Class: sun_awt_X11_XlibWrapper1074* Method: XSetWMHints1075* Signature: (JJJ)V1076*/1077JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMHints1078(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1079{1080AWT_CHECK_HAVE_LOCK();1081XSetWMHints((Display *) jlong_to_ptr(display), window, (XWMHints *) jlong_to_ptr(hints));1082}10831084/*1085* Class: sun_awt_X11_XlibWrapper1086* Method: XGetWMHints1087* Signature: (JJJ)V1088*/1089JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMHints1090(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1091{1092XWMHints * get_hints;1093AWT_CHECK_HAVE_LOCK();1094get_hints = XGetWMHints((Display*)jlong_to_ptr(display), window);1095if (get_hints != NULL) {1096memcpy(jlong_to_ptr(hints), get_hints, sizeof(XWMHints));1097XFree(get_hints);1098} else {1099memset(jlong_to_ptr(hints), 0, sizeof(XWMHints));1100}1101}11021103/*1104* Class: sun_awt_X11_XlibWrapper1105* Method: XGetPointerMapping1106* Signature: (JJI)I1107*/1108JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetPointerMapping1109(JNIEnv *env, jclass clazz, jlong display, jlong map, jint buttonNumber)1110{1111AWT_CHECK_HAVE_LOCK_RETURN(0);1112return XGetPointerMapping((Display*)jlong_to_ptr(display), (unsigned char*) jlong_to_ptr(map), buttonNumber);1113}11141115/*1116* Class: sun_awt_X11_XlibWrapper1117* Method: XGetDefault1118* Signature: (JJI)I1119*/1120JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XGetDefault1121(JNIEnv *env, jclass clazz, jlong display, jstring program, jstring option)1122{1123char * c_program = NULL;1124char * c_option = NULL;1125char * c_res = NULL;11261127if (!JNU_IsNull(env, program)) {1128c_program = (char *)JNU_GetStringPlatformChars(env, program, NULL);1129}1130CHECK_NULL_RETURN(c_program, NULL);11311132if (!JNU_IsNull(env, option)) {1133c_option = (char *)JNU_GetStringPlatformChars(env, option, NULL);1134}11351136if (c_option == NULL) {1137JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);1138return NULL;1139}11401141AWT_CHECK_HAVE_LOCK_RETURN(NULL);1142c_res = XGetDefault((Display*)jlong_to_ptr(display), c_program, c_option);1143// The strings returned by XGetDefault() are owned by Xlib and1144// should not be modified or freed by the client.11451146JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);1147JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option);11481149if (c_res != NULL) {1150return JNU_NewStringPlatform(env, c_res);1151} else {1152return NULL;1153}1154}11551156/*1157* Class: sun_awt_X11_XlibWrapper1158* Method: getScreenOfWindow1159* Signature: (JJ)J1160*/1161JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_getScreenOfWindow1162(JNIEnv *env, jclass clazz, jlong display, jlong window)1163{1164XWindowAttributes attrs;1165memset(&attrs, 0, sizeof(attrs));1166AWT_CHECK_HAVE_LOCK_RETURN(0);1167XGetWindowAttributes((Display *) jlong_to_ptr(display), window, &attrs);1168return ptr_to_jlong(attrs.screen);1169}11701171/*1172* Class: sun_awt_X11_XlibWrapper1173* Method: XScreenNumberOfScreen1174* Signature: (J)J1175*/1176JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XScreenNumberOfScreen1177(JNIEnv *env, jclass clazz, jlong screen)1178{1179AWT_CHECK_HAVE_LOCK_RETURN(-1);1180if(jlong_to_ptr(screen) == NULL) {1181return -1;1182}1183return XScreenNumberOfScreen((Screen*) jlong_to_ptr(screen));1184}11851186/*1187* Class: sun_awt_X11_XlibWrapper1188* Method: XIconifyWindow1189* Signature: (JJJ)V1190*/1191JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XIconifyWindow1192(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong screenNumber)1193{1194AWT_CHECK_HAVE_LOCK_RETURN(0);1195return XIconifyWindow((Display*) jlong_to_ptr(display), window, screenNumber);1196}11971198/*1199* Class: sun_awt_X11_XlibWrapper1200* Method: XFree1201* Signature: (J)V1202*/1203JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFree1204(JNIEnv *env, jclass clazz, jlong ptr)1205{1206AWT_CHECK_HAVE_LOCK();1207XFree(jlong_to_ptr(ptr));1208}12091210/*1211* Class: sun_awt_X11_XlibWrapper1212* Method: XFree1213* Signature: (J)V1214*/1215JNIEXPORT jbyteArray JNICALL Java_sun_awt_X11_XlibWrapper_getStringBytes1216(JNIEnv *env, jclass clazz, jlong str_ptr)1217{1218unsigned char * str = (unsigned char*) jlong_to_ptr(str_ptr);1219long length = strlen((char*)str);1220jbyteArray res = (*env)->NewByteArray(env, length);1221CHECK_NULL_RETURN(res, NULL);1222(*env)->SetByteArrayRegion(env, res, 0, length,1223(const signed char*) str);1224return res;1225}12261227/*1228* Class: sun_awt_X11_XlibWrapper1229* Method: ServerVendor1230* Signature: (J)Ljava/lang/String;1231*/1232JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_ServerVendor1233(JNIEnv *env, jclass clazz, jlong display)1234{1235AWT_CHECK_HAVE_LOCK_RETURN(NULL);1236return JNU_NewStringPlatform(env, ServerVendor((Display*)jlong_to_ptr(display)));1237}12381239/*1240* Class: sun_awt_X11_XlibWrapper1241* Method: VendorRelease1242* Signature: (J)I;1243*/1244JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease1245(JNIEnv *env, jclass clazz, jlong display)1246{1247AWT_CHECK_HAVE_LOCK_RETURN(0);1248return VendorRelease((Display*)jlong_to_ptr(display));1249}12501251/*1252* Class: sun_awt_X11_XlibWrapper1253* Method: IsXsunKPBehavior1254* Signature: (J)Z;1255*/1256JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior1257(JNIEnv *env, jclass clazz, jlong display)1258{1259// Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.1260// Otherwise, it is [1] or sometimes [0].1261// This sniffer first tries to determine what is a keycode for XK_KP_71262// using XKeysymToKeycode;1263// second, in which place in the keysymarray is XK_KP_71264// using XKeycodeToKeysym.1265int kc7;1266AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1267kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7);1268if( !kc7 ) {1269// keycode is not defined. Why, it's a reduced keyboard perhaps:1270// report arbitrarily false.1271return JNI_FALSE;1272} else {1273long ks2 = keycodeToKeysym((Display*)jlong_to_ptr(display), kc7, 2);1274if( ks2 == XK_KP_7 ) {1275//XXX If some Xorg server would put XK_KP_7 in keysymarray[2] as well,1276//XXX for yet unknown to me reason, the sniffer would lie.1277return JNI_TRUE;1278}else{1279return JNI_FALSE;1280}1281}1282}12831284JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard1285(JNIEnv *env, jclass clazz, jlong display)1286{1287int xx;1288AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1289xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);1290return (!xx) ? JNI_FALSE : JNI_TRUE;1291}12921293JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard1294(JNIEnv *env, jclass clazz, jlong display)1295{1296int xx;1297static jboolean result = JNI_FALSE;12981299int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;1300KeySym *keySyms, *keySymsStart, keySym;1301int32_t i;1302int32_t kanaCount = 0;13031304AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);13051306// There's no direct way to determine whether the keyboard has1307// a kana lock key. From available keyboard mapping tables, it looks1308// like only keyboards with the kana lock key can produce keysyms1309// for kana characters. So, as an indirect test, we check for those.1310XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);1311keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);1312keySymsStart = keySyms;1313for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {1314keySym = *keySyms++;1315if ((keySym & 0xff00) == 0x0400) {1316kanaCount++;1317}1318}1319XFree(keySymsStart);13201321// use a (somewhat arbitrary) minimum so we don't get confused by a stray function key1322result = kanaCount > 10;1323return result ? JNI_TRUE : JNI_FALSE;1324}13251326JavaVM* jvm = NULL;1327static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {1328JNIEnv * env;1329// First call the native synthetic error handler declared in "awt_util.h" file.1330if (current_native_xerror_handler != NULL) {1331current_native_xerror_handler(dpy, event);1332}1333if (jvm != NULL) {1334env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);1335if (env) {1336return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil",1337"globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i;1338}1339}1340return 0;1341}13421343/*1344* Class: sun_awt_X11_XlibWrapper1345* Method: SetToolkitErrorHandler1346* Signature: ()J1347*/1348JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler1349(JNIEnv *env, jclass clazz)1350{1351if ((*env)->GetJavaVM(env, &jvm) < 0) {1352return 0;1353}1354AWT_CHECK_HAVE_LOCK_RETURN(0);1355return ptr_to_jlong(XSetErrorHandler(ToolkitErrorHandler));1356}13571358/*1359* Class: sun_awt_X11_XlibWrapper1360* Method: XSetErrorHandler1361* Signature: (J)V1362*/1363JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetErrorHandler1364(JNIEnv *env, jclass clazz, jlong handler)1365{1366AWT_CHECK_HAVE_LOCK();1367XSetErrorHandler((XErrorHandler) jlong_to_ptr(handler));1368}13691370/*1371* Class: sun_awt_X11_XlibWrapper1372* Method: CallErrorHandler1373* Signature: (JJJ)I1374*/1375JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler1376(JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)1377{1378return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));1379}13801381/*1382* Class: sun_awt_X11_XlibWrapper1383* Method: PrintXErrorEvent1384* Signature: (JJ)V1385*/1386JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent1387(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)1388{1389char msg[128];1390char buf[128];13911392XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);13931394XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));1395jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);1396jio_snprintf(buf, sizeof(buf), "%d", err->request_code);1397XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));1398jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);1399if (err->request_code > 128) {1400jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);1401}1402}14031404/*1405* Class: sun_awt_X11_XlibWrapper1406* Method: XInternAtoms1407* Signature: (J[Ljava/lang/String;ZJ)I1408*/1409JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XInternAtoms1410(JNIEnv *env, jclass clazz, jlong display, jobjectArray names_arr, jboolean only_if_exists, jlong atoms)1411{1412int status = 0;1413AWT_CHECK_HAVE_LOCK_RETURN(0);1414jsize length;1415char** names = stringArrayToNative(env, names_arr, &length);1416if (names) {1417status = XInternAtoms((Display*)jlong_to_ptr(display), names, length, only_if_exists, (Atom*) jlong_to_ptr(atoms));1418freeNativeStringArray(names, length);1419}1420return status;1421}14221423/*1424* Class: sun_awt_X11_XlibWrapper1425* Method: XGetWindowAttributes1426* Signature: (JJJ)I1427*/1428JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowAttributes1429(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong attr_ptr)1430{1431jint status;1432AWT_CHECK_HAVE_LOCK_RETURN(0);1433memset((XWindowAttributes*) jlong_to_ptr(attr_ptr), 0, sizeof(XWindowAttributes));1434status = XGetWindowAttributes((Display*)jlong_to_ptr(display), window, (XWindowAttributes*) jlong_to_ptr(attr_ptr));1435return status;1436}14371438/*1439* Class: sun_awt_X11_XlibWrapper1440* Method: XGetGeometry1441* Signature: (JJJJJJJJJ)I1442*/1443JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetGeometry1444(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong root_return,1445jlong x_return, jlong y_return, jlong width_return, jlong height_return,1446jlong border_width_return, jlong depth_return)1447{1448jint status;1449AWT_CHECK_HAVE_LOCK_RETURN(0);1450status = XGetGeometry((Display *)jlong_to_ptr(display),1451(Drawable)drawable, (Window *)jlong_to_ptr(root_return),1452(int *)jlong_to_ptr(x_return), (int *)jlong_to_ptr(y_return),1453(unsigned int *)jlong_to_ptr(width_return), (unsigned int *)jlong_to_ptr(height_return),1454(unsigned int *)jlong_to_ptr(border_width_return),1455(unsigned int *)jlong_to_ptr(depth_return));1456return status;1457}14581459/*1460* Class: sun_awt_X11_XlibWrapper1461* Method: XGetWMNormalHints1462* Signature: (JJJJ)I1463*/1464JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMNormalHints1465(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints, jlong supplied_return)1466{1467AWT_CHECK_HAVE_LOCK_RETURN(0);1468return XGetWMNormalHints((Display*) jlong_to_ptr(display),1469window,1470(XSizeHints*) jlong_to_ptr(hints),1471(long*) jlong_to_ptr(supplied_return));1472}14731474/*1475* Class: sun_awt_X11_XlibWrapper1476* Method: XSetWMNormalHints1477* Signature: (JJJ)V1478*/1479JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMNormalHints1480(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)1481{1482AWT_CHECK_HAVE_LOCK();1483XSetWMNormalHints((Display*) jlong_to_ptr(display), window, (XSizeHints*) jlong_to_ptr(hints));1484}14851486/*1487* Class: sun_awt_X11_XlibWrapper1488* Method: XDeleteProperty1489* Signature: (JJJ)V1490*/1491JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDeleteProperty1492(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)1493{1494AWT_CHECK_HAVE_LOCK();1495XDeleteProperty((Display*) jlong_to_ptr(display), window, (Atom)atom);1496}14971498/*1499* Class: sun_awt_X11_XlibWrapper1500* Method: XSendEvent1501* Signature: (JJZJJ)V1502*/1503JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XSendEvent1504(JNIEnv *env, jclass clazz, jlong display, jlong window, jboolean propagate, jlong event_mask, jlong event)1505{1506AWT_CHECK_HAVE_LOCK_RETURN(0);1507return XSendEvent((Display*) jlong_to_ptr(display),1508window,1509propagate==JNI_TRUE?True:False,1510(long) event_mask,1511(XEvent*) jlong_to_ptr(event));1512}15131514/*1515* Class: sun_awt_X11_XlibWrapper1516* Method: XQueryTree1517* Signature: (JJJJJJ)I1518*/1519JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XQueryTree1520(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong root_return, jlong parent_return, jlong children_return, jlong nchildren_return)1521{1522AWT_CHECK_HAVE_LOCK_RETURN(0);1523return XQueryTree((Display*) jlong_to_ptr(display),1524window,1525(Window *) jlong_to_ptr(root_return),1526(Window*) jlong_to_ptr(parent_return),1527(Window**) jlong_to_ptr(children_return),1528(unsigned int*) jlong_to_ptr(nchildren_return));1529}15301531/*1532* Class: sun_awt_X11_XlibWrapper1533* Method: memcpy1534* Signature: (JJJ)V1535*/1536JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_memcpy1537(JNIEnv *env, jclass clazz, jlong dest_ptr, jlong src_ptr, jlong length)1538{1539memcpy(jlong_to_ptr(dest_ptr), jlong_to_ptr(src_ptr), length);1540}15411542JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetMinMaxHints1543(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x, jint y, jint width, jint height, jlong flags) {1544XSizeHints * hints;1545AWT_CHECK_HAVE_LOCK();1546hints = XAllocSizeHints();1547hints->flags = flags;1548hints->width = width;1549hints->min_width = width;1550hints->max_width = width;1551hints->height = height;1552hints->min_height = height;1553hints->max_height = height;1554hints->x = x;1555hints->y = y;1556XSetWMNormalHints((Display*) jlong_to_ptr(display), window, hints);1557XFree(hints);1558}15591560JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetVisualInfo1561(JNIEnv *env, jclass clazz, jlong display, jlong vinfo_mask, jlong vinfo_template,1562jlong nitems_return)1563{1564AWT_CHECK_HAVE_LOCK_RETURN(0);1565return ptr_to_jlong(XGetVisualInfo((Display*) jlong_to_ptr(display),1566(long) vinfo_mask,1567(XVisualInfo*) jlong_to_ptr(vinfo_template),1568(int*) jlong_to_ptr(nitems_return)));1569}15701571JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XAllocSizeHints1572(JNIEnv *env, jclass clazz)1573{1574AWT_CHECK_HAVE_LOCK_RETURN(0);1575return ptr_to_jlong(XAllocSizeHints());1576}15771578/*1579* Class: sun_awt_X11_XlibWrapper1580* Method: XIconifyWindow1581* Signature: (JJJ)V1582*/1583JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XBell1584(JNIEnv *env, jclass clazz, jlong display, jint percent)1585{1586AWT_CHECK_HAVE_LOCK();1587XBell((Display*)jlong_to_ptr(display), percent);1588}15891590/*1591* Class: sun_awt_X11_XlibWrapper1592* Method: XAllocColor1593* Signature: (JJJ)Z1594*/1595JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XAllocColor1596(JNIEnv *env, jclass clazz, jlong display , jlong colormap, jlong xcolor) {15971598Status status;1599AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1600status = XAllocColor((Display *) jlong_to_ptr(display), (Colormap) colormap, (XColor *) jlong_to_ptr(xcolor));16011602if (status == 0) return JNI_FALSE;1603else return JNI_TRUE;1604}16051606/*1607* Class: sun_awt_X11_XlibWrapper1608* Method: XCreateBitmapFromData1609* Signature: (JJJII)J1610*/1611JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData1612(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong data, jint width, jint height) {1613AWT_CHECK_HAVE_LOCK_RETURN(0);16141615return (jlong) XCreateBitmapFromData((Display *) jlong_to_ptr(display), (Drawable) drawable,1616(char *) jlong_to_ptr(data), width, height);1617}16181619/*1620* Class: sun_awt_X11_XlibWrapper1621* Method: XFreePixmap1622* Signature: (JJ)V1623*/1624JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreePixmap1625(JNIEnv *env, jclass clazz, jlong display, jlong pixmap) {1626AWT_CHECK_HAVE_LOCK();1627XFreePixmap((Display *)jlong_to_ptr(display), (Pixmap) pixmap);1628}16291630/*1631* Class: sun_awt_X11_XlibWrapper1632* Method: XReparentWindow1633* Signature: (JJJII)V1634*/1635JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XReparentWindow1636(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong parent, jint x, jint y) {1637AWT_CHECK_HAVE_LOCK();1638XReparentWindow((Display*)jlong_to_ptr(display), window, parent, x, y);1639}16401641/*1642* Class: sun_awt_X11_XlibWrapper1643* Method: XConvertSelection1644* Signature: (JJJJJJ)V1645*/1646JNIEXPORT void JNICALL1647Java_sun_awt_X11_XlibWrapper_XConvertSelection(JNIEnv *env, jclass clazz,1648jlong display, jlong selection,1649jlong target, jlong property,1650jlong requestor, jlong time) {1651AWT_CHECK_HAVE_LOCK();1652XConvertSelection((Display*)jlong_to_ptr(display), selection, target, property, requestor,1653time);1654}16551656/*1657* Class: sun_awt_X11_XlibWrapper1658* Method: XSetSelectionOwner1659* Signature: (JJJJ)V1660*/1661JNIEXPORT void JNICALL1662Java_sun_awt_X11_XlibWrapper_XSetSelectionOwner(JNIEnv *env, jclass clazz,1663jlong display, jlong selection,1664jlong owner, jlong time) {1665AWT_CHECK_HAVE_LOCK();1666XSetSelectionOwner((Display*)jlong_to_ptr(display), selection, owner, time);1667}16681669/*1670* Class: sun_awt_X11_XlibWrapper1671* Method: XGetSelectionOwner1672* Signature: (JJ)J1673*/1674JNIEXPORT jlong JNICALL1675Java_sun_awt_X11_XlibWrapper_XGetSelectionOwner(JNIEnv *env, jclass clazz,1676jlong display, jlong selection) {1677AWT_CHECK_HAVE_LOCK_RETURN(0);1678return (jlong)XGetSelectionOwner((Display*)jlong_to_ptr(display), selection);1679}16801681/*1682* Class: sun_awt_X11_XlibWrapper1683* Method: XGetAtomName1684* Signature: (JJ)Ljava/lang/String;1685*/1686JNIEXPORT jstring JNICALL1687Java_sun_awt_X11_XlibWrapper_XGetAtomName(JNIEnv *env, jclass clazz,1688jlong display, jlong atom)1689{1690jstring string = NULL;1691char* name;1692AWT_CHECK_HAVE_LOCK_RETURN(NULL);1693name = (char*) XGetAtomName((Display*)jlong_to_ptr(display), atom);16941695if (name == NULL) {1696fprintf(stderr, "Atom was %d\n", (int)atom);1697JNU_ThrowNullPointerException(env, "Failed to retrieve atom name.");1698return NULL;1699}17001701string = (*env)->NewStringUTF(env, (const char *)name);17021703XFree(name);17041705return string;1706}17071708/*1709* Class: sun_awt_X11_XlibWrapper1710* Method: XMaxRequestSize1711* Signature: (J)J1712*/1713JNIEXPORT jlong JNICALL1714Java_sun_awt_X11_XlibWrapper_XMaxRequestSize(JNIEnv *env, jclass clazz,1715jlong display) {1716AWT_CHECK_HAVE_LOCK_RETURN(0);1717return XMaxRequestSize((Display*) jlong_to_ptr(display));1718}17191720JNIEXPORT jlong JNICALL1721Java_sun_awt_X11_XlibWrapper_XAllocWMHints(JNIEnv *env, jclass clazz)1722{1723AWT_CHECK_HAVE_LOCK_RETURN(0);1724return ptr_to_jlong(XAllocWMHints());1725}17261727JNIEXPORT jlong JNICALL1728Java_sun_awt_X11_XlibWrapper_XCreatePixmap(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jint depth)1729{1730AWT_CHECK_HAVE_LOCK_RETURN(0);1731return XCreatePixmap((Display*)jlong_to_ptr(display), (Drawable)drawable, width, height, depth);1732}17331734JNIEXPORT jlong JNICALL1735Java_sun_awt_X11_XlibWrapper_XCreateImage1736(JNIEnv *env, jclass clazz, jlong display, jlong visual_ptr,1737jint depth, jint format, jint offset, jlong data, jint width,1738jint height, jint bitmap_pad, jint bytes_per_line)1739{1740AWT_CHECK_HAVE_LOCK_RETURN(0);1741return ptr_to_jlong(XCreateImage((Display*) jlong_to_ptr(display), (Visual*) jlong_to_ptr(visual_ptr),1742depth, format, offset, (char*) jlong_to_ptr(data),1743width, height, bitmap_pad, bytes_per_line));1744}17451746JNIEXPORT jlong JNICALL1747Java_sun_awt_X11_XlibWrapper_XCreateGC1748(JNIEnv *env, jclass clazz, jlong display, jlong drawable,1749jlong valuemask, jlong values)1750{1751AWT_CHECK_HAVE_LOCK_RETURN(0);1752return ptr_to_jlong(XCreateGC((Display*) jlong_to_ptr(display), (Drawable)drawable, valuemask, (XGCValues*) jlong_to_ptr(values)));1753}17541755JNIEXPORT void JNICALL1756Java_sun_awt_X11_XlibWrapper_XDestroyImage(JNIEnv *env, jclass clazz, jlong image)1757{1758XImage *img = (XImage*) jlong_to_ptr(image);1759AWT_CHECK_HAVE_LOCK();17601761// Fix for bug 4903671 :1762// We should be careful to not double free the memory pointed to data1763// Since we use unsafe to allocate it, we should use unsafe to free it.1764// So we should NULL the data pointer before calling XDestroyImage so1765// that X does not free the pointer for us.1766img->data = NULL;1767XDestroyImage(img);1768}17691770JNIEXPORT void JNICALL1771Java_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)1772{1773AWT_CHECK_HAVE_LOCK();1774XPutImage((Display*)jlong_to_ptr(display), (Drawable)drawable, (GC) jlong_to_ptr(gc), (XImage*) jlong_to_ptr(image), src_x, src_y,1775dest_x, dest_y, width, height);1776}17771778JNIEXPORT void JNICALL1779Java_sun_awt_X11_XlibWrapper_XFreeGC(JNIEnv *env, jclass clazz, jlong display, jlong gc)1780{1781AWT_CHECK_HAVE_LOCK();1782XFreeGC((Display*) jlong_to_ptr(display), (GC) jlong_to_ptr(gc));1783}17841785JNIEXPORT void JNICALL1786Java_sun_awt_X11_XlibWrapper_XSetWindowBackgroundPixmap(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong pixmap)1787{1788AWT_CHECK_HAVE_LOCK();1789XSetWindowBackgroundPixmap((Display*) jlong_to_ptr(display), (Window)window, (Pixmap)pixmap);1790}17911792JNIEXPORT void JNICALL1793Java_sun_awt_X11_XlibWrapper_XClearWindow(JNIEnv *env, jclass clazz, jlong display, jlong window)1794{1795AWT_CHECK_HAVE_LOCK();1796XClearWindow((Display*) jlong_to_ptr(display), (Window)window);1797}17981799JNIEXPORT jint JNICALL1800Java_sun_awt_X11_XlibWrapper_XGetIconSizes(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong ret_sizes, jlong ret_count)1801{1802XIconSize** psize = (XIconSize**) jlong_to_ptr(ret_sizes);1803int * pcount = (int *) jlong_to_ptr(ret_count);1804Status res;1805AWT_CHECK_HAVE_LOCK_RETURN(0);1806res = XGetIconSizes((Display*) jlong_to_ptr(display), (Window)window, psize, pcount);1807return res;1808}18091810JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeQueryExtension1811(JNIEnv *env, jclass clazz, jlong display, jlong major_version_return,1812jlong minor_version_return)1813{1814AWT_CHECK_HAVE_LOCK_RETURN(0);1815return XdbeQueryExtension((Display*) jlong_to_ptr(display), (int *) jlong_to_ptr(major_version_return),1816(int *) jlong_to_ptr(minor_version_return));1817}18181819JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryExtension1820(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jlong mop_return,1821jlong feve_return, jlong err_return)1822{1823char *cname;1824Boolean bu;1825if (!JNU_IsNull(env, jstr)) {1826cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);1827CHECK_NULL_RETURN(cname, JNI_FALSE);1828} else {1829cname = "";1830}18311832AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1833bu = XQueryExtension((Display*) jlong_to_ptr(display), cname, (int *) jlong_to_ptr(mop_return),1834(int *) jlong_to_ptr(feve_return), (int *) jlong_to_ptr(err_return));1835if (!JNU_IsNull(env, jstr)) {1836JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);1837}1838return bu ? JNI_TRUE : JNI_FALSE;1839}18401841JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKeypadKey1842(JNIEnv *env, jclass clazz, jlong keysym)1843{1844AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);1845if(IsKeypadKey(keysym)) {1846return JNI_TRUE;1847}1848return JNI_FALSE;1849}18501851JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XdbeAllocateBackBufferName1852(JNIEnv *env, jclass clazz, jlong display, jlong window, jint swap_action)1853{1854AWT_CHECK_HAVE_LOCK_RETURN(0);1855return XdbeAllocateBackBufferName((Display*) jlong_to_ptr(display), (Window) window,1856(XdbeSwapAction) swap_action);1857}18581859JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeDeallocateBackBufferName1860(JNIEnv *env, jclass clazz, jlong display, jlong buffer)1861{1862AWT_CHECK_HAVE_LOCK_RETURN(0);1863return XdbeDeallocateBackBufferName((Display*) jlong_to_ptr(display), (XdbeBackBuffer) buffer);1864}18651866JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeBeginIdiom1867(JNIEnv *env, jclass clazz, jlong display)1868{1869AWT_CHECK_HAVE_LOCK_RETURN(0);1870return XdbeBeginIdiom((Display*) jlong_to_ptr(display));1871}18721873JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeEndIdiom1874(JNIEnv *env, jclass clazz, jlong display)1875{1876AWT_CHECK_HAVE_LOCK_RETURN(0);1877return XdbeEndIdiom((Display*) jlong_to_ptr(display));1878}18791880JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers1881(JNIEnv *env, jclass clazz, jlong display, jlong swap_info, jint num_windows)1882{1883AWT_CHECK_HAVE_LOCK_RETURN(0);1884return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows);1885}1886JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap1887(JNIEnv *env, jclass clazz, jlong display, jlong vector)1888{1889AWT_CHECK_HAVE_LOCK();1890XQueryKeymap( (Display *) jlong_to_ptr(display), (char *) jlong_to_ptr(vector));1891}18921893// XKeycodeToKeysym is deprecated but for compatibility we keep the API.1894JNIEXPORT jlong JNICALL1895Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz,1896jlong display, jint keycode,1897jint index) {1898AWT_CHECK_HAVE_LOCK_RETURN(0);1899return keycodeToKeysym((Display*)jlong_to_ptr(display), (unsigned int)keycode, (int)index);1900}19011902JNIEXPORT jint JNICALL1903Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,1904jlong display) {1905XkbStateRec sr;1906AWT_CHECK_HAVE_LOCK_RETURN(0);1907memset(&sr, 0, sizeof(XkbStateRec));1908XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);1909// printf("-------------------------------------VVVV\n");1910// printf(" group:0x%0X\n",sr.group);1911// printf(" base_group:0x%0X\n",sr.base_group);1912// printf(" latched_group:0x%0X\n",sr.latched_group);1913// printf(" locked_group:0x%0X\n",sr.locked_group);1914// printf(" mods:0x%0X\n",sr.mods);1915// printf(" base_mods:0x%0X\n",sr.base_mods);1916// printf(" latched_mods:0x%0X\n",sr.latched_mods);1917// printf(" locked_mods:0x%0X\n",sr.locked_mods);1918// printf(" compat_state:0x%0X\n",sr.compat_state);1919// printf(" grab_mods:0x%0X\n",sr.grab_mods);1920// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods);1921// printf(" lookup_mods:0x%0X\n",sr.lookup_mods);1922// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);1923// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons);1924// printf("-------------------------------------^^^^\n");1925return (jint)(sr.group);1926}19271928JNIEXPORT jlong JNICALL1929Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,1930jlong display, jint keycode,1931jint group, jint level) {1932AWT_CHECK_HAVE_LOCK_RETURN(0);1933return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);1934}19351936JNIEXPORT jint JNICALL1937Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,1938jlong display, jlong keysym) {1939AWT_CHECK_HAVE_LOCK_RETURN(0);1940return XKeysymToKeycode((Display*) jlong_to_ptr(display), (KeySym)keysym);1941}19421943JNIEXPORT jlong JNICALL1944Java_sun_awt_X11_XlibWrapper_XGetModifierMapping(JNIEnv *env, jclass clazz,1945jlong display) {1946AWT_CHECK_HAVE_LOCK_RETURN(0);1947return ptr_to_jlong(XGetModifierMapping((Display*) jlong_to_ptr(display)));1948}19491950JNIEXPORT void JNICALL1951Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,1952jlong keymap) {1953AWT_CHECK_HAVE_LOCK();1954XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));1955}19561957/*1958* Class: sun_awt_X11_XlibWrapper1959* Method: XRefreshKeyboardMapping1960* Signature: (J)V1961*/1962JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping1963(JNIEnv *env, jclass clazz, jlong event_ptr)1964{1965AWT_CHECK_HAVE_LOCK();1966XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));1967}19681969JNIEXPORT void JNICALL1970Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,1971jlong display, jint mask,1972jlong cursor, jlong time) {1973AWT_CHECK_HAVE_LOCK();1974XChangeActivePointerGrab((Display*)jlong_to_ptr(display), (unsigned int)mask,1975(Cursor)cursor, (Time)time);1976}19771978/******************* Secondary loop support ************************************/1979#define AWT_SECONDARY_LOOP_TIMEOUT 25019801981static Bool exitSecondaryLoop = True;19821983/*1984* This predicate procedure allows the Toolkit thread to process specific events1985* while it is blocked waiting for the event dispatch thread to process1986* a SunDropTargetEvent. We need this to prevent deadlock when the client code1987* processing SunDropTargetEvent sets or gets the contents of the system1988* clipboard/selection. In this case the event dispatch thread waits for the1989* Toolkit thread to process PropertyNotify or SelectionNotify events.1990*/1991static Bool1992secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {1993return (1994event->type == SelectionNotify ||1995event->type == SelectionClear ||1996event->type == PropertyNotify ||1997(event->type == ConfigureNotify1998&& event->xany.window == *(Window*) xawt_root_window)1999) ? True : False;2000}20012002JNIEXPORT jboolean JNICALL2003Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz,2004jlong display, jlong ptr) {2005uint32_t timeout = 1;20062007AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);2008exitSecondaryLoop = False;2009Window xawt_root_window = get_xawt_root_shell(env);20102011while (!exitSecondaryLoop) {2012if (XCheckIfEvent((Display*) jlong_to_ptr(display),2013(XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {2014return JNI_TRUE;2015}2016timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;2017AWT_WAIT(timeout);2018}2019return JNI_FALSE;2020}20212022JNIEXPORT void JNICALL2023Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop(JNIEnv *env, jclass clazz) {2024DASSERT(!exitSecondaryLoop);2025AWT_CHECK_HAVE_LOCK();2026exitSecondaryLoop = True;2027AWT_NOTIFY_ALL();2028}20292030JNIEXPORT jobjectArray JNICALL2031Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList(JNIEnv *env,2032jclass clazz,2033jbyteArray bytes,2034jlong encodingAtom) {2035XTextProperty tp;2036jbyte *value;20372038char** strings = (char **)NULL;2039int32_t nstrings = 0;2040jobjectArray ret = NULL;2041int32_t i;2042jsize len;2043jboolean isCopy = JNI_FALSE;2044static jclass stringClass = NULL;2045jclass stringClassLocal = NULL;20462047AWT_CHECK_HAVE_LOCK_RETURN(NULL);20482049if (JNU_IsNull(env, stringClass)) {2050stringClassLocal = (*env)->FindClass(env, "java/lang/String");20512052if ((*env)->ExceptionCheck(env)) {2053(*env)->ExceptionDescribe(env);2054(*env)->ExceptionClear(env);2055DASSERT(False);2056}20572058if (JNU_IsNull(env, stringClassLocal)) {2059return NULL;2060}20612062stringClass = (*env)->NewGlobalRef(env, stringClassLocal); /* never freed! */2063(*env)->DeleteLocalRef(env, stringClassLocal);20642065if (JNU_IsNull(env, stringClass)) {2066JNU_ThrowOutOfMemoryError(env, "");2067return NULL;2068}2069}20702071/*2072* If the length of the byte array is 0 just return a null2073*/2074len = (*env)->GetArrayLength(env, bytes);2075if (len == 0) {2076return (*env)->NewObjectArray(env, 0, stringClass, NULL);2077}20782079value = (*env)->GetByteArrayElements(env, bytes, &isCopy);2080if (JNU_IsNull(env, value)) {2081return NULL;2082}20832084tp.encoding = encodingAtom;2085tp.value = (unsigned char *)value;2086tp.nitems = len;2087tp.format = 8;20882089/*2090* Convert the byte stream into a list of X11 strings2091*/2092if (XTextPropertyToStringList(&tp, &strings, &nstrings) == 0) {2093(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);2094return NULL;2095}20962097(*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);20982099if (nstrings == 0) {2100return (*env)->NewObjectArray(env, 0, stringClass, NULL);2101}21022103ret = (*env)->NewObjectArray(env, nstrings, stringClass, NULL);21042105if ((*env)->ExceptionCheck(env)) {2106(*env)->ExceptionDescribe(env);2107(*env)->ExceptionClear(env);2108goto wayout;2109}21102111if (JNU_IsNull(env, ret)) {2112goto wayout;2113}21142115for (i = 0; i < nstrings; i++) {2116jstring string = (*env)->NewStringUTF(env,2117(const char *)strings[i]);2118if ((*env)->ExceptionCheck(env)) {2119(*env)->ExceptionDescribe(env);2120(*env)->ExceptionClear(env);2121goto wayout;2122}21232124if (JNU_IsNull(env, string)) {2125goto wayout;2126}21272128(*env)->SetObjectArrayElement(env, ret, i, string);21292130if ((*env)->ExceptionCheck(env)) {2131(*env)->ExceptionDescribe(env);2132(*env)->ExceptionClear(env);2133goto wayout;2134}21352136(*env)->DeleteLocalRef(env, string);2137}21382139wayout:2140/*2141* Clean up and return2142*/2143XFreeStringList(strings);2144return ret;2145}21462147JNIEXPORT void JNICALL2148Java_sun_awt_X11_XlibWrapper_XPutBackEvent(JNIEnv *env,2149jclass clazz,2150jlong display,2151jlong event) {2152XPutBackEvent((Display*)jlong_to_ptr(display), (XEvent*) jlong_to_ptr(event));2153}21542155JNIEXPORT jlong JNICALL2156Java_sun_awt_X11_XlibWrapper_getAddress(JNIEnv *env,2157jclass clazz,2158jobject o) {2159return ptr_to_jlong(o);2160}21612162JNIEXPORT void JNICALL2163Java_sun_awt_X11_XlibWrapper_copyIntArray(JNIEnv *env,2164jclass clazz,2165jlong dest, jobject array, jint size) {2166jboolean isCopy = JNI_FALSE;2167jint * ints = (*env)->GetIntArrayElements(env, array, &isCopy);2168memcpy(jlong_to_ptr(dest), ints, size);2169if (isCopy) {2170(*env)->ReleaseIntArrayElements(env, array, ints, JNI_ABORT);2171}2172}21732174JNIEXPORT void JNICALL2175Java_sun_awt_X11_XlibWrapper_copyLongArray(JNIEnv *env,2176jclass clazz,2177jlong dest, jobject array, jint size) {2178jboolean isCopy = JNI_FALSE;2179jlong * longs = (*env)->GetLongArrayElements(env, array, &isCopy);2180memcpy(jlong_to_ptr(dest), longs, size);2181if (isCopy) {2182(*env)->ReleaseLongArrayElements(env, array, longs, JNI_ABORT);2183}2184}21852186JNIEXPORT jint JNICALL2187Java_sun_awt_X11_XlibWrapper_XSynchronize(JNIEnv *env, jclass clazz, jlong display, jboolean onoff)2188{2189return (jint) XSynchronize((Display*)jlong_to_ptr(display), (onoff == JNI_TRUE ? True : False));2190}21912192JNIEXPORT jboolean JNICALL2193Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension2194(JNIEnv *env, jclass clazz, jlong display, jlong event_base_return, jlong error_base_return)2195{2196Bool status;21972198AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);21992200status = XShapeQueryExtension((Display *)jlong_to_ptr(display),2201(int *)jlong_to_ptr(event_base_return), (int *)jlong_to_ptr(error_base_return));2202return status ? JNI_TRUE : JNI_FALSE;2203}22042205/*2206* Class: XlibWrapper2207* Method: SetRectangularShape2208*/22092210JNIEXPORT void JNICALL2211Java_sun_awt_X11_XlibWrapper_SetRectangularShape2212(JNIEnv *env, jclass clazz, jlong display, jlong window,2213jint x1, jint y1, jint x2, jint y2,2214jobject region)2215{2216AWT_CHECK_HAVE_LOCK();22172218// If all the params are zeros, the shape must be simply reset.2219// Otherwise, the shape may be not rectangular.2220if (region || x1 || x2 || y1 || y2) {2221XRectangle rects[256];2222XRectangle *pRect = rects;22232224int numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region,2225&pRect, 256);22262227XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2228ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);2229XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2230ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);22312232if (pRect != rects) {2233free(pRect);2234}2235} else {2236// Reset the shape to a rectangular form.2237XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2238ShapeClip, 0, 0, None, ShapeSet);2239XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2240ShapeBounding, 0, 0, None, ShapeSet);2241}2242}22432244/*2245* Class: XlibWrapper2246* Method: SetZOrder2247*/22482249JNIEXPORT void JNICALL2250Java_sun_awt_X11_XlibWrapper_SetZOrder2251(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)2252{2253unsigned int value_mask = CWStackMode;22542255XWindowChanges wc;2256wc.sibling = (Window)jlong_to_ptr(above);22572258AWT_CHECK_HAVE_LOCK();22592260if (above == 0) {2261wc.stack_mode = Above;2262} else {2263wc.stack_mode = Below;2264value_mask |= CWSibling;2265}22662267XConfigureWindow((Display *)jlong_to_ptr(display),2268(Window)jlong_to_ptr(window),2269value_mask, &wc );2270}22712272/*2273* Class: XlibWrapper2274* Method: SetBitmapShape2275*/2276JNIEXPORT void JNICALL2277Java_sun_awt_X11_XlibWrapper_SetBitmapShape2278(JNIEnv *env, jclass clazz, jlong display, jlong window,2279jint width, jint height, jintArray bitmap)2280{2281jsize len;2282jint *values;2283jboolean isCopy = JNI_FALSE;2284size_t worstBufferSize = (size_t)((width / 2 + 1) * height);2285RECT_T * pRect;2286int numrects;22872288if (!IS_SAFE_SIZE_MUL(width / 2 + 1, height)) {2289return;2290}22912292AWT_CHECK_HAVE_LOCK();22932294len = (*env)->GetArrayLength(env, bitmap);2295if (len == 0 || len < width * height) {2296return;2297}22982299values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);2300if (JNU_IsNull(env, values)) {2301return;2302}23032304pRect = (RECT_T *)SAFE_SIZE_ARRAY_ALLOC(malloc, worstBufferSize, sizeof(RECT_T));2305if (!pRect) {2306return;2307}23082309/* Note: the values[0] and values[1] are supposed to contain the width2310* and height (see XIconInfo.getIntData() for details). So, we do +2.2311*/2312numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,2313(unsigned char *)(values + 2), pRect);23142315XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2316ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);2317XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),2318ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);23192320free(pRect);23212322(*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);2323}232423252326