XlibWrapper.c revision 15926:fbc5498378d6
1/*
2 * Copyright (c) 2002, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#include "sun_awt_X11_XlibWrapper.h"
27#include <X11/Xlib.h>
28#include <X11/keysym.h>
29#include <X11/Xutil.h>
30#include <X11/Xos.h>
31#include <X11/Xatom.h>
32#include <X11/extensions/Xdbe.h>
33#include <X11/extensions/shape.h>
34#include <string.h>
35#include <stdlib.h>
36#include <X11/Sunkeysym.h>
37
38#include <jni.h>
39#include <jni_util.h>
40#include <jlong.h>
41#include <sizecalc.h>
42
43#include <awt.h>
44#include <awt_util.h>
45#include <jvm.h>
46
47#include <Region.h>
48#include "utility/rect.h"
49
50#include <X11/XKBlib.h>
51
52// From XWindow.c
53extern KeySym keycodeToKeysym(Display *display, KeyCode keycode, int index);
54
55#if defined(DEBUG)
56static jmethodID lockIsHeldMID = NULL;
57
58static void
59CheckHaveAWTLock(JNIEnv *env)
60{
61    if (lockIsHeldMID == NULL) {
62        if (tkClass == NULL) return;
63        lockIsHeldMID =
64            (*env)->GetStaticMethodID(env, tkClass,
65                                      "isAWTLockHeldByCurrentThread", "()Z");
66        if (lockIsHeldMID == NULL) return;
67    }
68    if (!(*env)->CallStaticBooleanMethod(env, tkClass, lockIsHeldMID)) {
69        JNU_ThrowInternalError(env, "Current thread does not hold AWT_LOCK!");
70    }
71}
72
73#define AWT_CHECK_HAVE_LOCK()                       \
74    do {                                            \
75        CheckHaveAWTLock(env);                      \
76        if ((*env)->ExceptionCheck(env)) {          \
77            return;                                 \
78        }                                           \
79    } while (0);                                    \
80
81#define AWT_CHECK_HAVE_LOCK_RETURN(ret)             \
82    do {                                            \
83        CheckHaveAWTLock(env);                      \
84        if ((*env)->ExceptionCheck(env)) {          \
85            return (ret);                           \
86        }                                           \
87    } while (0);                                    \
88
89#else
90#define AWT_CHECK_HAVE_LOCK()
91#define AWT_CHECK_HAVE_LOCK_RETURN(ret)
92#endif
93
94void freeNativeStringArray(char **array, jsize length) {
95    int i;
96    if (array == NULL) {
97        return;
98    }
99    for (i = 0; i < length; i++) {
100        free(array[i]);
101    }
102    free(array);
103}
104
105char** stringArrayToNative(JNIEnv *env, jobjectArray array, jsize * ret_length) {
106    Bool err = FALSE;
107    char ** strings;
108    int index, str_index = 0;
109    jsize length = (*env)->GetArrayLength(env, array);
110
111    if (length == 0) {
112        return NULL;
113    }
114
115    strings = (char**) calloc(length, sizeof (char*));
116
117    if (strings == NULL) {
118        JNU_ThrowOutOfMemoryError(env, "");
119        return NULL;
120    }
121
122    for (index = 0; index < length; index++) {
123        jstring str = (*env)->GetObjectArrayElement(env, array, index);
124        if (str != NULL) {
125            const char * str_char = JNU_GetStringPlatformChars(env, str, NULL);
126            if (str_char != NULL) {
127                char * dup_str = strdup(str_char);
128                if (dup_str != NULL) {
129                    strings[str_index++] = dup_str;
130                } else {
131                    JNU_ThrowOutOfMemoryError(env, "");
132                    err = TRUE;
133                }
134                JNU_ReleaseStringPlatformChars(env, str, str_char);
135            } else {
136                err = TRUE;
137            }
138            (*env)->DeleteLocalRef(env, str);
139            if (err) {
140                break;
141            }
142        }
143    }
144
145    if (err) {
146        freeNativeStringArray(strings, str_index);
147        strings = NULL;
148        str_index = -1;
149    }
150    *ret_length = str_index;
151
152    return strings;
153}
154
155/*
156 * Class:     XlibWrapper
157 * Method:    XOpenDisplay
158 * Signature: (J)J
159 */
160
161JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XOpenDisplay
162(JNIEnv *env, jclass clazz, jlong display_name)
163{
164    Display *dp;
165    AWT_CHECK_HAVE_LOCK_RETURN(0);
166    dp  =  XOpenDisplay((char *) jlong_to_ptr(display_name));
167
168    return ptr_to_jlong(dp);
169}
170
171JNIEXPORT void JNICALL
172Java_sun_awt_X11_XlibWrapper_XCloseDisplay(JNIEnv *env, jclass clazz,
173                       jlong display) {
174    AWT_CHECK_HAVE_LOCK();
175    XCloseDisplay((Display*) jlong_to_ptr(display));
176}
177
178JNIEXPORT jlong JNICALL
179Java_sun_awt_X11_XlibWrapper_XDisplayString(JNIEnv *env, jclass clazz,
180                        jlong display) {
181    AWT_CHECK_HAVE_LOCK_RETURN(0);
182    return ptr_to_jlong(XDisplayString((Display*) jlong_to_ptr(display)));
183}
184
185JNIEXPORT void JNICALL
186Java_sun_awt_X11_XlibWrapper_XSetCloseDownMode(JNIEnv *env, jclass clazz,
187                           jlong display, jint mode) {
188    AWT_CHECK_HAVE_LOCK();
189    XSetCloseDownMode((Display*) jlong_to_ptr(display), (int)mode);
190}
191
192/*
193 * Class:     sun_awt_X11_XlibWrapper
194 * Method:    DefaultScreen
195 * Signature: (J)J
196 */
197JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DefaultScreen (JNIEnv *env, jclass clazz, jlong display) {
198
199    AWT_CHECK_HAVE_LOCK_RETURN(0);
200    return (jlong) DefaultScreen((Display *) jlong_to_ptr(display));
201}
202
203/*
204 * Class:     sun_awt_X11_XlibWrapper
205 * Method:    ScreenOfDisplay
206 * Signature: (JJ)J
207 */
208JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_ScreenOfDisplay(JNIEnv *env, jclass clazz, jlong display, jlong screen_number) {
209    AWT_CHECK_HAVE_LOCK_RETURN(0);
210    return ptr_to_jlong(ScreenOfDisplay((Display *) jlong_to_ptr(display),
211                                        screen_number));
212}
213
214/*
215 * Class:     sun_awt_X11_XlibWrapper
216 * Method:    DoesBackingStore
217 * Signature: (J)I
218 */
219JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DoesBackingStore(JNIEnv *env, jclass clazz, jlong screen) {
220    AWT_CHECK_HAVE_LOCK_RETURN(0);
221    return (jint) DoesBackingStore((Screen*) jlong_to_ptr(screen));
222}
223
224/*
225 * Class:     sun_awt_X11_XlibWrapper
226 * Method:    DisplayWidth
227 * Signature: (JJ)J
228 */
229JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidth
230(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
231
232    AWT_CHECK_HAVE_LOCK_RETURN(0);
233    return (jlong) DisplayWidth((Display *) jlong_to_ptr(display),screen);
234
235}
236
237/*
238 * Class:     sun_awt_X11_XlibWrapper
239 * Method:    DisplayWidthMM
240 * Signature: (JJ)J
241 */
242JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayWidthMM
243(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
244    AWT_CHECK_HAVE_LOCK_RETURN(0);
245    return (jlong) DisplayWidthMM((Display *) jlong_to_ptr(display),screen);
246}
247
248/*
249 * Class:     sun_awt_X11_XlibWrapper
250 * Method:    DisplayHeight
251 * Signature: (JJ)J
252 */
253JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeight
254(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
255
256    AWT_CHECK_HAVE_LOCK_RETURN(0);
257    return (jlong) DisplayHeight((Display *) jlong_to_ptr(display),screen);
258}
259/*
260 * Class:     sun_awt_X11_XlibWrapper
261 * Method:    DisplayHeightMM
262 * Signature: (JJ)J
263 */
264JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_DisplayHeightMM
265(JNIEnv *env, jclass clazz, jlong display, jlong screen) {
266    AWT_CHECK_HAVE_LOCK_RETURN(0);
267    return (jlong) DisplayHeightMM((Display *) jlong_to_ptr(display),screen);
268}
269
270/*
271 * Class:     sun_awt_X11_XlibWrapper
272 * Method:    RootWindow
273 * Signature: (JJ)J
274 */
275JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_RootWindow
276(JNIEnv *env , jclass clazz, jlong display, jlong screen_number) {
277    AWT_CHECK_HAVE_LOCK_RETURN(0);
278    return (jlong) RootWindow((Display *) jlong_to_ptr(display), screen_number);
279}
280
281/*
282 * Class:     sun_awt_X11_XlibWrapper
283 * Method:    ScreenCount
284 */
285JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_ScreenCount
286(JNIEnv *env , jclass clazz, jlong display) {
287    AWT_CHECK_HAVE_LOCK_RETURN(0);
288    return ScreenCount((Display *) jlong_to_ptr(display));
289}
290
291
292/*
293 * Class:     XlibWrapper
294 * Method:    XCreateWindow
295 * Signature: (JJIIIIIIJJJJ)J
296 */
297JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateWindow
298  (JNIEnv *env, jclass clazz, jlong display, jlong window,
299   jint x, jint y, jint w, jint h , jint border_width, jint depth,
300   jlong wclass, jlong visual, jlong valuemask, jlong attributes)
301{
302    AWT_CHECK_HAVE_LOCK_RETURN(0);
303    return  XCreateWindow((Display *) jlong_to_ptr(display),(Window) window, x, y, w, h,
304              border_width, depth, wclass, (Visual *) jlong_to_ptr(visual),
305              valuemask, (XSetWindowAttributes *) jlong_to_ptr(attributes));
306
307}
308
309/*
310 * Class:     XlibWrapper
311 * Method:    XConvertCase
312 * Signature: (JJJ)V
313 */
314JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConvertCase
315  (JNIEnv *env, jclass clazz, jlong keysym,
316   jlong keysym_lowercase, jlong keysym_uppercase)
317{
318    AWT_CHECK_HAVE_LOCK();
319    XConvertCase(keysym, (jlong_to_ptr(keysym_lowercase)),
320                         (jlong_to_ptr(keysym_uppercase)));
321}
322
323
324/*
325 * Class:     XlibWrapper
326 * Method:    XMapWindow
327 * Signature: (JJ)V
328 */
329JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapWindow
330(JNIEnv *env, jclass clazz, jlong display, jlong window)
331{
332    AWT_CHECK_HAVE_LOCK();
333    XMapWindow( (Display *)jlong_to_ptr(display),(Window) window);
334
335}
336
337/*
338 * Class:     XlibWrapper
339 * Method:    XMapRaised
340 * Signature: (JJ)V
341 */
342JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMapRaised
343(JNIEnv *env, jclass clazz, jlong display, jlong window)
344{
345    AWT_CHECK_HAVE_LOCK();
346    XMapRaised( (Display *)jlong_to_ptr(display),(Window) window);
347
348}
349
350/*
351 * Class:     XlibWrapper
352 * Method:    XRaiseWindow
353 * Signature: (JJ)V
354 */
355JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRaiseWindow
356(JNIEnv *env, jclass clazz, jlong display, jlong window)
357{
358
359    AWT_CHECK_HAVE_LOCK();
360    XRaiseWindow( (Display *)jlong_to_ptr(display),(Window) window);
361
362}
363
364/*
365 * Class:     XlibWrapper
366 * Method:    XLowerWindow
367 * Signature: (JJ)V
368 */
369JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XLowerWindow
370(JNIEnv *env, jclass clazz, jlong display, jlong window)
371{
372
373    AWT_CHECK_HAVE_LOCK();
374    XLowerWindow( (Display *)jlong_to_ptr(display),(Window) window);
375
376}
377
378/*
379 * Class:     XlibWrapper
380 * Method:    XRestackWindows
381 * Signature: (JJI)V
382 */
383JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows
384(JNIEnv *env, jclass clazz, jlong display, jlong windows, jint length)
385{
386
387    AWT_CHECK_HAVE_LOCK();
388    XRestackWindows( (Display *) jlong_to_ptr(display), (Window *) jlong_to_ptr(windows), length);
389
390}
391
392/*
393 * Class:     XlibWrapper
394 * Method:    XConfigureWindow
395 * Signature: (JJJJ)V
396 */
397JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow
398(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,
399 jlong values)
400{
401    AWT_CHECK_HAVE_LOCK();
402    XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,
403            (unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));
404}
405
406/*
407 * Class:     XlibWrapper
408 * Method:    XSetInputFocus
409 * Signature: (JJ)V
410 */
411JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus
412(JNIEnv *env, jclass clazz, jlong display, jlong window)
413{
414
415    AWT_CHECK_HAVE_LOCK();
416    XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, CurrentTime);
417
418}
419/*
420 * Class:     XlibWrapper
421 * Method:    XSetInputFocus2
422 * Signature: (JJJ)V
423 */
424JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetInputFocus2
425(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong time)
426{
427
428    AWT_CHECK_HAVE_LOCK();
429    XSetInputFocus( (Display *)jlong_to_ptr(display),(Window) window, RevertToPointerRoot, time);
430
431}
432
433/*
434 * Class:     XlibWrapper
435 * Method:    XGetInputFocus
436 * Signature: (JJ)V
437 */
438JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetInputFocus
439(JNIEnv *env, jclass clazz, jlong display)
440{
441
442    Window focusOwner;
443    int revert_to;
444    AWT_CHECK_HAVE_LOCK_RETURN(0);
445    XGetInputFocus( (Display *)jlong_to_ptr(display), &focusOwner, &revert_to);
446    return focusOwner;
447}
448
449
450/*
451 * Class:     XlibWrapper
452 * Method:    XDestroyWindow
453 * Signature: (JJ)V
454 */
455JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDestroyWindow
456(JNIEnv *env, jclass clazz, jlong display, jlong window)
457{
458    AWT_CHECK_HAVE_LOCK();
459    XDestroyWindow( (Display *)jlong_to_ptr(display),(Window) window);
460}
461
462JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabPointer
463(JNIEnv *env, jclass clazz, jlong display, jlong window,
464 jint owner_events, jint event_mask, jint pointer_mode,
465 jint keyboard_mode, jlong confine_to, jlong cursor, jlong time)
466{
467    AWT_CHECK_HAVE_LOCK_RETURN(0);
468    return XGrabPointer( (Display *)jlong_to_ptr(display), (Window) window,
469             (Bool) owner_events, (unsigned int) event_mask, (int) pointer_mode,
470             (int) keyboard_mode, (Window) confine_to, (Cursor) cursor, (Time) time);
471}
472
473JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabPointer
474(JNIEnv *env, jclass clazz, jlong display, jlong time)
475{
476    AWT_CHECK_HAVE_LOCK();
477    XUngrabPointer( (Display *)jlong_to_ptr(display), (Time) time);
478}
479
480JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGrabKeyboard
481(JNIEnv *env, jclass clazz, jlong display, jlong window,
482 jint owner_events, jint pointer_mode,
483 jint keyboard_mode, jlong time)
484{
485    AWT_CHECK_HAVE_LOCK_RETURN(0);
486    return XGrabKeyboard( (Display *)jlong_to_ptr(display), (Window) window,
487              (Bool) owner_events, (int) pointer_mode,
488              (int) keyboard_mode, (Time) time);
489}
490
491JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUngrabKeyboard
492(JNIEnv *env, jclass clazz, jlong display, jlong time)
493{
494    AWT_CHECK_HAVE_LOCK();
495    XUngrabKeyboard( (Display *)jlong_to_ptr(display), (Time) time);
496}
497
498JNIEXPORT void JNICALL
499Java_sun_awt_X11_XlibWrapper_XGrabServer(JNIEnv *env, jclass clazz,
500                                         jlong display) {
501     AWT_CHECK_HAVE_LOCK();
502     XGrabServer((Display*)jlong_to_ptr(display));
503}
504
505JNIEXPORT void JNICALL
506Java_sun_awt_X11_XlibWrapper_XUngrabServer(JNIEnv *env, jclass clazz,
507                                           jlong display) {
508     AWT_CHECK_HAVE_LOCK();
509     XUngrabServer((Display*)jlong_to_ptr(display));
510     /* Workaround for bug 5039226 */
511     XSync((Display*)jlong_to_ptr(display), False);
512}
513
514/*
515 * Class:     XlibWrapper
516 * Method:    XUnmapWindow
517 * Signature: (JJ)V
518 */
519JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XUnmapWindow
520(JNIEnv *env, jclass clazz, jlong display, jlong window)
521{
522
523    AWT_CHECK_HAVE_LOCK();
524    XUnmapWindow( (Display *)jlong_to_ptr(display),(Window) window);
525
526}
527
528
529
530JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput
531(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong mask)
532{
533    AWT_CHECK_HAVE_LOCK();
534    XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);
535}
536
537JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents
538(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits)
539{
540    AWT_CHECK_HAVE_LOCK();
541    XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,
542                   (unsigned long)bits_to_change,
543                   (unsigned long)values_for_bits);
544}
545JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails
546(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits)
547{
548    AWT_CHECK_HAVE_LOCK();
549    XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,
550                   (unsigned int) event_type,
551                   (unsigned long)bits_to_change,
552                   (unsigned long)values_for_bits);
553}
554JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension
555(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,
556              jlong error_rtrn, jlong major_in_out, jlong minor_in_out)
557{
558    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
559    return XkbQueryExtension( (Display *) jlong_to_ptr(display),
560                       (int *) jlong_to_ptr(opcode_rtrn),
561                       (int *) jlong_to_ptr(event_rtrn),
562                       (int *) jlong_to_ptr(error_rtrn),
563                       (int *) jlong_to_ptr(major_in_out),
564                       (int *) jlong_to_ptr(minor_in_out));
565}
566JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion
567(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)
568{
569    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
570    *((int *)jlong_to_ptr(lib_major_in_out)) =  XkbMajorVersion;
571    *((int *)jlong_to_ptr(lib_minor_in_out)) =  XkbMinorVersion;
572    return  XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out));
573}
574
575JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap
576(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec)
577{
578    AWT_CHECK_HAVE_LOCK_RETURN(0);
579    return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display),
580                              (unsigned int) which,
581                              (unsigned int) device_spec);
582}
583JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap
584(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)
585{
586    AWT_CHECK_HAVE_LOCK_RETURN(0);
587    return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),
588                              (unsigned int) which,
589                              (XkbDescPtr) jlong_to_ptr(xkb));
590}
591JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard
592(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)
593{
594    AWT_CHECK_HAVE_LOCK();
595    XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);
596}
597JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode
598(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)
599{
600    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
601    Bool b;
602    b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,
603                              (unsigned int *)jlong_to_ptr(mods_rtrn),
604                               (KeySym *)jlong_to_ptr(keysym_rtrn));
605    //printf("native,  input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);
606    //printf("native, output:  keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn));
607    return b;
608}
609JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSetDetectableAutoRepeat
610(JNIEnv *env, jclass clazz, jlong display, jboolean detectable)
611{
612    AWT_CHECK_HAVE_LOCK();
613    XkbSetDetectableAutoRepeat((Display *) jlong_to_ptr(display), detectable, NULL);
614}
615/*
616 * Class:     sun_awt_X11_XlibWrapper
617 * Method:    XNextEvent
618 * Signature: (JJ)V
619 */
620
621
622JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XNextEvent
623(JNIEnv *env, jclass clazz, jlong display, jlong ptr)
624{
625    AWT_CHECK_HAVE_LOCK();
626    XNextEvent( (Display *) jlong_to_ptr(display), jlong_to_ptr(ptr));
627}
628
629/*
630 * Class:     sun_awt_X11_XlibWrapper
631 * Method:    XMaskEvent
632 * Signature: (JJJ)V
633 */
634
635JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XMaskEvent
636  (JNIEnv *env, jclass clazz, jlong display, jlong event_mask, jlong event_return)
637{
638    AWT_CHECK_HAVE_LOCK();
639    XMaskEvent( (Display *) jlong_to_ptr(display), event_mask, (XEvent *) jlong_to_ptr(event_return));
640}
641
642/*
643 * Class:     sun_awt_X11_XlibWrapper
644 * Method:    XWindowEvent
645 * Signature: (JJJJ)V
646 */
647
648JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XWindowEvent
649  (JNIEnv *env, jclass clazz, jlong display, jlong window, jlong event_mask, jlong event_return)
650{
651    AWT_CHECK_HAVE_LOCK();
652    XWindowEvent( (Display *) jlong_to_ptr(display), (Window)window, event_mask, (XEvent *) jlong_to_ptr(event_return));
653}
654
655/*
656 * Class:     sun_awt_X11_XlibWrapper
657 * Method:    XFilterEvent
658 * Signature: (JJ)Z
659 */
660JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XFilterEvent
661(JNIEnv *env, jclass clazz, jlong ptr, jlong window)
662{
663    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
664    return (jboolean) XFilterEvent((XEvent *) jlong_to_ptr(ptr), (Window) window);
665}
666
667/*
668 * Class:     sun_awt_X11_XlibWrapper
669 * Method:    XSupportsLocale
670 * Signature: ()Z
671 */
672JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XSupportsLocale
673(JNIEnv *env, jclass clazz)
674{
675    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
676    return (jboolean)XSupportsLocale();
677}
678
679/*
680 * Class:     sun_awt_X11_XlibWrapper
681 * Method:    XSetLocaleModifiers
682 * Signature: (Ljava/lang/String;)Ljava/lang/String;
683 */
684JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XSetLocaleModifiers
685(JNIEnv *env, jclass clazz, jstring jstr)
686{
687    char * modifier_list = NULL;
688    char * ret = NULL;
689
690    if (!JNU_IsNull(env, jstr)) {
691        modifier_list = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
692        CHECK_NULL_RETURN(modifier_list, NULL);
693    }
694
695    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
696    if (modifier_list) {
697        ret = XSetLocaleModifiers(modifier_list);
698        JNU_ReleaseStringPlatformChars(env, jstr, (const char *) modifier_list);
699    } else {
700        ret = XSetLocaleModifiers("");
701    }
702
703    return (ret != NULL ? JNU_NewStringPlatform(env, ret): NULL);
704}
705
706
707/*
708 * Class:     sun_awt_X11_wrappers_XlibWrapper
709 * Method:    XPeekEvent
710 * Signature: (JJ)V
711 */
712
713
714JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XPeekEvent
715(JNIEnv *env, jclass clazz, jlong display, jlong ptr)
716{
717    AWT_CHECK_HAVE_LOCK();
718    XPeekEvent((Display *) jlong_to_ptr(display),jlong_to_ptr(ptr));
719}
720
721
722/*
723 * Class:     sun_awt_X11_XlibWrapper
724 * Method:    XMoveResizeWindow
725 * Signature: (JJIIII)V
726 */
727
728JNIEXPORT void JNICALL  Java_sun_awt_X11_XlibWrapper_XMoveResizeWindow
729(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x , jint y , jint width, jint height) {
730
731    AWT_CHECK_HAVE_LOCK();
732    XMoveResizeWindow( (Display *) jlong_to_ptr(display), (Window) window, x, y, width, height);
733
734}
735
736/*
737 * Class:     sun_awt_X11_XlibWrapper
738 * Method:    XResizeWindow
739 * Signature: (JJII)V
740 */
741
742JNIEXPORT void JNICALL  Java_sun_awt_X11_XlibWrapper_XResizeWindow
743(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height)
744{
745    AWT_CHECK_HAVE_LOCK();
746    XResizeWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);
747}
748
749/*
750 * Class:     sun_awt_X11_XlibWrapper
751 * Method:    XMoveWindow
752 * Signature: (JJII)V
753 */
754
755JNIEXPORT void JNICALL  Java_sun_awt_X11_XlibWrapper_XMoveWindow
756(JNIEnv *env, jclass clazz, jlong display, jlong window, jint width, jint height)
757{
758    AWT_CHECK_HAVE_LOCK();
759    XMoveWindow( (Display *) jlong_to_ptr(display),(Window) window,width,height);
760}
761
762
763/*
764 * Class:     sun_awt_X11_XlibWrapper
765 * Method:    XSetWindowBackground
766 * Signature: (JJJ)V
767 */
768
769JNIEXPORT void JNICALL  Java_sun_awt_X11_XlibWrapper_XSetWindowBackground
770(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong background_pixel) {
771
772    AWT_CHECK_HAVE_LOCK();
773    XSetWindowBackground((Display *) jlong_to_ptr(display),window,background_pixel);
774
775}
776
777
778/*
779 * Class:     sun_awt_X11_XlibWrapper
780 * Method:    XFlush
781 * Signature: (J)V
782 */
783JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFlush
784(JNIEnv *env, jclass clazz, jlong display) {
785
786    AWT_CHECK_HAVE_LOCK();
787    XFlush((Display *)jlong_to_ptr(display));
788}
789
790/*
791 * Class:     sun_awt_X11_XlibWrapper
792 * Method:    XSync
793 * Signature: (JI)V
794 */
795JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSync
796(JNIEnv *env, jclass clazz, jlong display, jint discard) {
797
798    AWT_CHECK_HAVE_LOCK();
799    XSync((Display *) jlong_to_ptr(display), discard);
800
801}
802
803JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XTranslateCoordinates
804(JNIEnv *env, jclass clazz, jlong display, jlong src_w, jlong dest_w,
805 jlong src_x, jlong src_y, jlong dest_x_return, jlong dest_y_return,
806 jlong child_return)
807{
808    AWT_CHECK_HAVE_LOCK_RETURN(0);
809    return XTranslateCoordinates( (Display *) jlong_to_ptr(display), src_w, dest_w,
810                  src_x, src_y,
811                  (int *) jlong_to_ptr(dest_x_return),
812                  (int *) jlong_to_ptr(dest_y_return),
813                  (Window *) jlong_to_ptr(child_return));
814}
815
816JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XEventsQueued
817(JNIEnv *env, jclass clazz, jlong display, jint mode) {
818
819    AWT_CHECK_HAVE_LOCK_RETURN(0);
820    return XEventsQueued((Display *) jlong_to_ptr(display), mode);
821
822}
823
824/*
825 * Class:     sun_awt_X11_XlibWrapper
826 * Method:    SetProperty
827 * Signature: (JJJLjava/lang/String;)V
828 */
829JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_SetProperty
830(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom, jstring jstr) {
831    char *cname;
832    XTextProperty tp;
833    int32_t status;
834
835    /*
836       In case there are direct support of UTF-8 declared, use UTF-8 strings.
837    */
838    if (!JNU_IsNull(env, jstr)) {
839#ifdef X_HAVE_UTF8_STRING
840        cname = (char *) (*env)->GetStringUTFChars(env, jstr, JNI_FALSE);
841#else
842        cname = (char *) JNU_GetStringPlatformChars(env, jstr, NULL);
843#endif
844        CHECK_NULL(cname);
845    } else {
846        cname = "";
847    }
848
849
850    AWT_CHECK_HAVE_LOCK();
851
852#ifdef X_HAVE_UTF8_STRING
853    status = Xutf8TextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
854                                       XStdICCTextStyle, &tp);
855#else
856    status = XmbTextListToTextProperty((Display *)jlong_to_ptr(display), &cname, 1,
857                                       XStdICCTextStyle, &tp);
858#endif
859
860
861    if (status == Success || status > 0) {
862        XChangeProperty((Display *)jlong_to_ptr(display), window, atom, tp.encoding, tp.format, PropModeReplace, tp.value, tp.nitems);
863        if (tp.value != NULL) {
864            XFree(tp.value);
865        }
866    }
867
868    if (!JNU_IsNull(env, jstr)) {
869#ifdef X_HAVE_UTF8_STRING
870        (*env)->ReleaseStringUTFChars(env, jstr, (const char *) cname);
871#else
872        JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
873#endif
874    }
875}
876
877/*
878 * Class:     sun_awt_X11_XlibWrapper
879 * Method:    XChangeProperty
880 * Signature: (JJJJJJJJJJJ)V
881 */
882JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyImpl(
883    JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,
884    jlong type, jint format, jint mode, jlong data, jint nelements)
885{
886    AWT_CHECK_HAVE_LOCK();
887    XChangeProperty((Display*) jlong_to_ptr(display), (Window) window, (Atom) property,
888            (Atom) type, format, mode, (unsigned char*) jlong_to_ptr(data),
889            nelements);
890}
891/*
892 * Class:     sun_awt_X11_XlibWrapper
893 * Method:    XChangePropertyS
894 * Signature: (JJJJJJJJJLjava/lang/String;)V
895 */
896JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangePropertyS(
897    JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property,
898    jlong type, jint format, jint mode, jstring value)
899{
900    jboolean iscopy;
901    AWT_CHECK_HAVE_LOCK();
902    const char * chars = JNU_GetStringPlatformChars(env, value, &iscopy);
903    CHECK_NULL(chars);
904    XChangeProperty((Display*)jlong_to_ptr(display), window, (Atom)property,
905                    (Atom)type, format, mode, (unsigned char*)chars, strlen(chars));
906    if (iscopy) {
907        JNU_ReleaseStringPlatformChars(env, value, chars);
908    }
909}
910
911/*
912 * Class:     sun_awt_X11_XlibWrapper
913 * Method:    XGetWindowProperty
914 * Signature: (JJJJJJJJJJJ)J;
915 */
916JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowProperty
917(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong property, jlong long_offset,
918 jlong long_length, jlong delete, jlong req_type, jlong actual_type,
919 jlong actual_format, jlong nitems_ptr, jlong bytes_after, jlong data_ptr)
920{
921    AWT_CHECK_HAVE_LOCK_RETURN(0);
922    return XGetWindowProperty((Display*) jlong_to_ptr(display), window, property, long_offset, long_length,
923                  delete, (Atom) req_type, (Atom*) jlong_to_ptr(actual_type),
924                  (int *) jlong_to_ptr(actual_format), (unsigned long *) jlong_to_ptr(nitems_ptr),
925                  (unsigned long*) jlong_to_ptr(bytes_after), (unsigned char**) jlong_to_ptr(data_ptr));
926}
927
928/*
929 * Class:     sun_awt_X11_XlibWrapper
930 * Method:    GetProperty
931 * Signature: (JJJ)Ljava/lang/String;
932 */
933JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_GetProperty
934(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)
935{
936    /* Request status */
937    int status;
938
939    /* Returns of XGetWindowProperty */
940    Atom actual_type;
941    int actual_format;
942    unsigned long nitems;
943    unsigned long bytes_after;
944    unsigned char * string;
945    jstring res = NULL;
946    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
947    status = XGetWindowProperty((Display*)jlong_to_ptr(display), window,
948                                atom, 0, 0xFFFF, False, XA_STRING,
949                                &actual_type, &actual_format, &nitems, &bytes_after,
950                                &string);
951
952    if (status != Success || string == NULL) {
953        return NULL;
954    }
955
956    if (actual_type == XA_STRING && actual_format == 8) {
957        res = JNU_NewStringPlatform(env,(char*) string);
958    }
959    XFree(string);
960    return res;
961}
962
963/*
964 * Class:     sun_awt_X11_XlibWrapper
965 * Method:    InternAtom
966 * Signature: (JLjava/lang/String;I)J
967 */
968JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_InternAtom
969(JNIEnv *env, jclass clazz, jlong display, jstring jstr, jint ife) {
970
971    char *cname;
972    unsigned long atom;
973
974    AWT_CHECK_HAVE_LOCK_RETURN(0);
975
976    if (!JNU_IsNull(env, jstr)) {
977        cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
978        CHECK_NULL_RETURN(cname, 0);
979    } else {
980        cname = "";
981    }
982
983    atom = XInternAtom((Display *) jlong_to_ptr(display), cname, ife);
984
985    if (!JNU_IsNull(env, jstr)) {
986        JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
987    }
988
989    return (jlong) atom;
990
991}
992
993JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XCreateFontCursor
994(JNIEnv *env, jclass clazz, jlong display, jint shape) {
995    AWT_CHECK_HAVE_LOCK_RETURN(0);
996    return XCreateFontCursor((Display *) jlong_to_ptr(display), (int) shape);
997}
998
999
1000/*
1001 * Class:     sun_awt_X11_XlibWrapper
1002 * Method:    XCreatePixmapCursor
1003 * Signature: (JJJJJII)J
1004 */
1005JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreatePixmapCursor
1006(JNIEnv *env , jclass clazz, jlong display, jlong source, jlong mask, jlong fore, jlong back, jint x , jint y) {
1007
1008    AWT_CHECK_HAVE_LOCK_RETURN(0);
1009    return (jlong) XCreatePixmapCursor((Display *) jlong_to_ptr(display), (Pixmap) source, (Pixmap) mask,
1010                                       (XColor *) jlong_to_ptr(fore), (XColor *) jlong_to_ptr(back), x, y);
1011}
1012
1013
1014/*
1015 * Class:     sun_awt_X11_XlibWrapper
1016 * Method:    XQueryBestCursor
1017 * Signature: (JJIIJJ)Z
1018 */
1019JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryBestCursor
1020(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jlong width_return, jlong height_return) {
1021
1022    Status status;
1023
1024    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1025    status  =  XQueryBestCursor((Display *) jlong_to_ptr(display), (Drawable) drawable, width,height,
1026                                (unsigned int *) jlong_to_ptr(width_return), (unsigned int *) jlong_to_ptr(height_return));
1027
1028    if (status == 0) return JNI_FALSE;
1029    else return JNI_TRUE;
1030}
1031
1032
1033/*
1034 * Class:     sun_awt_X11_XlibWrapper
1035 * Method:    XFreeCursor
1036 * Signature: (JJ)V
1037 */
1038JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreeCursor
1039(JNIEnv *env, jclass clazz, jlong display, jlong cursor) {
1040
1041    AWT_CHECK_HAVE_LOCK();
1042    XFreeCursor( (Display *) jlong_to_ptr(display), (Cursor) cursor);
1043}
1044
1045/*
1046 * Class:     sun_awt_X11_XlibWrapper
1047 * Method:    XQueryPointer
1048 * Signature: (JJJJJJJJJ)Z
1049 */
1050JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryPointer
1051(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) {
1052
1053    Bool b;
1054
1055    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1056    b = XQueryPointer((Display *) jlong_to_ptr(display),
1057                      (Window) w, (Window *) jlong_to_ptr(root_return), (Window *) jlong_to_ptr(child_return),
1058                      (int *) jlong_to_ptr(root_x_return), (int *) jlong_to_ptr(root_y_return),
1059                      (int *) jlong_to_ptr(win_x_return), (int *) jlong_to_ptr(win_y_return),
1060                      (unsigned int *) jlong_to_ptr(mask_return));
1061
1062    return b ? JNI_TRUE : JNI_FALSE;
1063}
1064
1065/*
1066 * Class:     sun_awt_X11_XlibWrapper
1067 * Method:    XChangeWindowAttributes
1068 * Signature: (JJJJ)V
1069 */
1070JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XChangeWindowAttributes
1071(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong valuemask, jlong attributes) {
1072
1073    AWT_CHECK_HAVE_LOCK();
1074    XChangeWindowAttributes((Display *) jlong_to_ptr(display), (Window) window, (unsigned long) valuemask,
1075                            (XSetWindowAttributes *) jlong_to_ptr(attributes));
1076}
1077
1078
1079/*
1080 * Class:     sun_awt_X11_XlibWrapper
1081 * Method:    XSetTransientFor
1082 * Signature: (JJJ)V
1083 */
1084JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetTransientFor
1085(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong transient_for_window)
1086{
1087    AWT_CHECK_HAVE_LOCK();
1088    XSetTransientForHint((Display *) jlong_to_ptr(display), window, transient_for_window);
1089}
1090
1091/*
1092 * Class:     sun_awt_X11_XlibWrapper
1093 * Method:    XSetWMHints
1094 * Signature: (JJJ)V
1095 */
1096JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMHints
1097(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1098{
1099    AWT_CHECK_HAVE_LOCK();
1100    XSetWMHints((Display *) jlong_to_ptr(display), window, (XWMHints *) jlong_to_ptr(hints));
1101}
1102
1103/*
1104 * Class:     sun_awt_X11_XlibWrapper
1105 * Method:    XGetWMHints
1106 * Signature: (JJJ)V
1107 */
1108JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMHints
1109(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1110{
1111    XWMHints * get_hints;
1112    AWT_CHECK_HAVE_LOCK();
1113    get_hints = XGetWMHints((Display*)jlong_to_ptr(display), window);
1114    if (get_hints != NULL) {
1115        memcpy(jlong_to_ptr(hints), get_hints, sizeof(XWMHints));
1116        XFree(get_hints);
1117    } else {
1118        memset(jlong_to_ptr(hints), 0, sizeof(XWMHints));
1119    }
1120}
1121
1122/*
1123 * Class:     sun_awt_X11_XlibWrapper
1124 * Method:    XGetPointerMapping
1125 * Signature: (JJI)I
1126 */
1127JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetPointerMapping
1128(JNIEnv *env, jclass clazz, jlong display, jlong map, jint buttonNumber)
1129{
1130    AWT_CHECK_HAVE_LOCK_RETURN(0);
1131    return XGetPointerMapping((Display*)jlong_to_ptr(display), (unsigned char*) jlong_to_ptr(map), buttonNumber);
1132}
1133
1134/*
1135 * Class:     sun_awt_X11_XlibWrapper
1136 * Method:    XGetDefault
1137 * Signature: (JJI)I
1138 */
1139JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_XGetDefault
1140(JNIEnv *env, jclass clazz, jlong display, jstring program, jstring option)
1141{
1142    char * c_program = NULL;
1143    char * c_option = NULL;
1144    char * c_res = NULL;
1145
1146    if (!JNU_IsNull(env, program)) {
1147        c_program = (char *)JNU_GetStringPlatformChars(env, program, NULL);
1148    }
1149    CHECK_NULL_RETURN(c_program, NULL);
1150
1151    if (!JNU_IsNull(env, option)) {
1152        c_option = (char *)JNU_GetStringPlatformChars(env, option, NULL);
1153    }
1154
1155    if (c_option == NULL) {
1156        JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);
1157        return NULL;
1158    }
1159
1160    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1161    c_res = XGetDefault((Display*)jlong_to_ptr(display), c_program, c_option);
1162    // The strings returned by XGetDefault() are owned by Xlib and
1163    // should not be modified or freed by the client.
1164
1165    JNU_ReleaseStringPlatformChars(env, program, (const char *) c_program);
1166    JNU_ReleaseStringPlatformChars(env, option, (const char *) c_option);
1167
1168    if (c_res != NULL) {
1169        return JNU_NewStringPlatform(env, c_res);
1170    } else {
1171        return NULL;
1172    }
1173}
1174
1175
1176/*
1177 * Class:     sun_awt_X11_XlibWrapper
1178 * Method:    getScreenOfWindow
1179 * Signature: (JJ)J
1180 */
1181JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_getScreenOfWindow
1182(JNIEnv *env, jclass clazz, jlong display, jlong window)
1183{
1184    XWindowAttributes attrs;
1185    memset(&attrs, 0, sizeof(attrs));
1186    AWT_CHECK_HAVE_LOCK_RETURN(0);
1187    XGetWindowAttributes((Display *) jlong_to_ptr(display), window, &attrs);
1188    return ptr_to_jlong(attrs.screen);
1189}
1190
1191/*
1192 * Class:     sun_awt_X11_XlibWrapper
1193 * Method:    XScreenNumberOfScreen
1194 * Signature: (J)J
1195 */
1196JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XScreenNumberOfScreen
1197(JNIEnv *env, jclass clazz, jlong screen)
1198{
1199    AWT_CHECK_HAVE_LOCK_RETURN(-1);
1200    if(jlong_to_ptr(screen) == NULL) {
1201        return -1;
1202    }
1203    return XScreenNumberOfScreen((Screen*) jlong_to_ptr(screen));
1204}
1205
1206/*
1207 * Class:     sun_awt_X11_XlibWrapper
1208 * Method:    XIconifyWindow
1209 * Signature: (JJJ)V
1210 */
1211JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XIconifyWindow
1212(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong screenNumber)
1213{
1214    AWT_CHECK_HAVE_LOCK_RETURN(0);
1215    return XIconifyWindow((Display*) jlong_to_ptr(display), window, screenNumber);
1216}
1217
1218/*
1219 * Class:     sun_awt_X11_XlibWrapper
1220 * Method:    XFree
1221 * Signature: (J)V
1222 */
1223JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFree
1224(JNIEnv *env, jclass clazz, jlong ptr)
1225{
1226    AWT_CHECK_HAVE_LOCK();
1227    XFree(jlong_to_ptr(ptr));
1228}
1229
1230/*
1231 * Class:     sun_awt_X11_XlibWrapper
1232 * Method:    XFree
1233 * Signature: (J)V
1234 */
1235JNIEXPORT jbyteArray JNICALL Java_sun_awt_X11_XlibWrapper_getStringBytes
1236(JNIEnv *env, jclass clazz, jlong str_ptr)
1237{
1238    unsigned char * str = (unsigned char*) jlong_to_ptr(str_ptr);
1239    long length = strlen((char*)str);
1240    jbyteArray res = (*env)->NewByteArray(env, length);
1241    CHECK_NULL_RETURN(res, NULL);
1242    (*env)->SetByteArrayRegion(env, res, 0, length,
1243                   (const signed char*) str);
1244    return res;
1245}
1246
1247
1248/*
1249 * Class:     sun_awt_X11_XlibWrapper
1250 * Method:    ServerVendor
1251 * Signature: (J)Ljava/lang/String;
1252 */
1253JNIEXPORT jstring JNICALL Java_sun_awt_X11_XlibWrapper_ServerVendor
1254(JNIEnv *env, jclass clazz, jlong display)
1255{
1256    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1257    return JNU_NewStringPlatform(env, ServerVendor((Display*)jlong_to_ptr(display)));
1258}
1259/*
1260 * Class:     sun_awt_X11_XlibWrapper
1261 * Method:    VendorRelease
1262 * Signature: (J)I;
1263 */
1264JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_VendorRelease
1265(JNIEnv *env, jclass clazz, jlong display)
1266{
1267    AWT_CHECK_HAVE_LOCK_RETURN(0);
1268    return VendorRelease((Display*)jlong_to_ptr(display));
1269}
1270/*
1271 * Class:     sun_awt_X11_XlibWrapper
1272 * Method:    IsXsunKPBehavior
1273 * Signature: (J)Z;
1274 */
1275JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsXsunKPBehavior
1276(JNIEnv *env, jclass clazz, jlong display)
1277{
1278    // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
1279    // Otherwise, it is [1] or sometimes [0].
1280    // This sniffer first tries to determine what is a keycode for XK_KP_7
1281    // using XKeysymToKeycode;
1282    // second, in which place in the keysymarray is XK_KP_7
1283    // using XKeycodeToKeysym.
1284    int kc7;
1285    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1286    kc7 = XKeysymToKeycode((Display*)jlong_to_ptr(display), XK_KP_7);
1287    if( !kc7 ) {
1288        // keycode is not defined. Why, it's a reduced keyboard perhaps:
1289        // report arbitrarily false.
1290        return JNI_FALSE;
1291    } else {
1292        long ks2 = keycodeToKeysym((Display*)jlong_to_ptr(display), kc7, 2);
1293        if( ks2 == XK_KP_7 ) {
1294            //XXX If some Xorg server would put XK_KP_7 in keysymarray[2] as well,
1295            //XXX for yet unknown to me reason, the sniffer would lie.
1296            return JNI_TRUE;
1297        }else{
1298            return JNI_FALSE;
1299        }
1300    }
1301}
1302
1303
1304JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsSunKeyboard
1305(JNIEnv *env, jclass clazz, jlong display)
1306{
1307    int xx;
1308    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1309    xx = XKeysymToKeycode((Display*)jlong_to_ptr(display), SunXK_F37);
1310    return (!xx) ? JNI_FALSE : JNI_TRUE;
1311}
1312
1313JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKanaKeyboard
1314(JNIEnv *env, jclass clazz, jlong display)
1315{
1316    int xx;
1317    static jboolean result = JNI_FALSE;
1318
1319    int32_t minKeyCode, maxKeyCode, keySymsPerKeyCode;
1320    KeySym *keySyms, *keySymsStart, keySym;
1321    int32_t i;
1322    int32_t kanaCount = 0;
1323
1324    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1325
1326    // There's no direct way to determine whether the keyboard has
1327    // a kana lock key. From available keyboard mapping tables, it looks
1328    // like only keyboards with the kana lock key can produce keysyms
1329    // for kana characters. So, as an indirect test, we check for those.
1330    XDisplayKeycodes((Display*)jlong_to_ptr(display), &minKeyCode, &maxKeyCode);
1331    keySyms = XGetKeyboardMapping((Display*)jlong_to_ptr(display), minKeyCode, maxKeyCode - minKeyCode + 1, &keySymsPerKeyCode);
1332    keySymsStart = keySyms;
1333    for (i = 0; i < (maxKeyCode - minKeyCode + 1) * keySymsPerKeyCode; i++) {
1334        keySym = *keySyms++;
1335        if ((keySym & 0xff00) == 0x0400) {
1336            kanaCount++;
1337        }
1338    }
1339    XFree(keySymsStart);
1340
1341    // use a (somewhat arbitrary) minimum so we don't get confused by a stray function key
1342    result = kanaCount > 10;
1343    return result ? JNI_TRUE : JNI_FALSE;
1344}
1345
1346JavaVM* jvm = NULL;
1347static int ToolkitErrorHandler(Display * dpy, XErrorEvent * event) {
1348    JNIEnv * env;
1349    // First call the native synthetic error handler declared in "awt_util.h" file.
1350    if (current_native_xerror_handler != NULL) {
1351        current_native_xerror_handler(dpy, event);
1352    }
1353    if (jvm != NULL) {
1354        env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
1355        if (env) {
1356            return JNU_CallStaticMethodByName(env, NULL, "sun/awt/X11/XErrorHandlerUtil",
1357                "globalErrorHandler", "(JJ)I", ptr_to_jlong(dpy), ptr_to_jlong(event)).i;
1358        }
1359    }
1360    return 0;
1361}
1362
1363/*
1364 * Class:     sun_awt_X11_XlibWrapper
1365 * Method:    SetToolkitErrorHandler
1366 * Signature: ()J
1367 */
1368JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_SetToolkitErrorHandler
1369(JNIEnv *env, jclass clazz)
1370{
1371    if ((*env)->GetJavaVM(env, &jvm) < 0) {
1372        return 0;
1373    }
1374    AWT_CHECK_HAVE_LOCK_RETURN(0);
1375    return ptr_to_jlong(XSetErrorHandler(ToolkitErrorHandler));
1376}
1377
1378/*
1379 * Class:     sun_awt_X11_XlibWrapper
1380 * Method:    XSetErrorHandler
1381 * Signature: (J)V
1382 */
1383JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetErrorHandler
1384(JNIEnv *env, jclass clazz, jlong handler)
1385{
1386    AWT_CHECK_HAVE_LOCK();
1387    XSetErrorHandler((XErrorHandler) jlong_to_ptr(handler));
1388}
1389
1390/*
1391 * Class:     sun_awt_X11_XlibWrapper
1392 * Method:    CallErrorHandler
1393 * Signature: (JJJ)I
1394 */
1395JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_CallErrorHandler
1396(JNIEnv *env, jclass clazz, jlong handler, jlong display, jlong event_ptr)
1397{
1398    return (*(XErrorHandler)jlong_to_ptr(handler))((Display*) jlong_to_ptr(display), (XErrorEvent*) jlong_to_ptr(event_ptr));
1399}
1400
1401
1402/*
1403 * Class:     sun_awt_X11_XlibWrapper
1404 * Method:    PrintXErrorEvent
1405 * Signature: (JJ)V
1406 */
1407JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_PrintXErrorEvent
1408(JNIEnv *env, jclass clazz, jlong display, jlong event_ptr)
1409{
1410    char msg[128];
1411    char buf[128];
1412
1413    XErrorEvent* err = (XErrorEvent *)jlong_to_ptr(event_ptr);
1414
1415    XGetErrorText((Display *)jlong_to_ptr(display), err->error_code, msg, sizeof(msg));
1416    jio_fprintf(stderr, "Xerror %s, XID %x, ser# %d\n", msg, err->resourceid, err->serial);
1417    jio_snprintf(buf, sizeof(buf), "%d", err->request_code);
1418    XGetErrorDatabaseText((Display *)jlong_to_ptr(display), "XRequest", buf, "Unknown", msg, sizeof(msg));
1419    jio_fprintf(stderr, "Major opcode %d (%s)\n", err->request_code, msg);
1420    if (err->request_code > 128) {
1421        jio_fprintf(stderr, "Minor opcode %d\n", err->minor_code);
1422    }
1423}
1424
1425
1426/*
1427 * Class:     sun_awt_X11_XlibWrapper
1428 * Method:    XInternAtoms
1429 * Signature: (J[Ljava/lang/String;ZJ)I
1430 */
1431JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XInternAtoms
1432(JNIEnv *env, jclass clazz, jlong display, jobjectArray names_arr, jboolean only_if_exists, jlong atoms)
1433{
1434    int status = 0;
1435    AWT_CHECK_HAVE_LOCK_RETURN(0);
1436    jsize length;
1437    char** names = stringArrayToNative(env, names_arr, &length);
1438    if (names) {
1439        status = XInternAtoms((Display*)jlong_to_ptr(display), names, length, only_if_exists, (Atom*) jlong_to_ptr(atoms));
1440        freeNativeStringArray(names, length);
1441    }
1442    return status;
1443}
1444
1445
1446
1447/*
1448 * Class:     sun_awt_X11_XlibWrapper
1449 * Method:    XGetWindowAttributes
1450 * Signature: (JJJ)I
1451 */
1452JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWindowAttributes
1453(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong attr_ptr)
1454{
1455    jint status;
1456    AWT_CHECK_HAVE_LOCK_RETURN(0);
1457    memset((XWindowAttributes*) jlong_to_ptr(attr_ptr), 0, sizeof(XWindowAttributes));
1458    status =  XGetWindowAttributes((Display*)jlong_to_ptr(display), window, (XWindowAttributes*) jlong_to_ptr(attr_ptr));
1459    return status;
1460}
1461
1462
1463/*
1464 * Class:     sun_awt_X11_XlibWrapper
1465 * Method:    XGetGeometry
1466 * Signature: (JJJJJJJJJ)I
1467 */
1468JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetGeometry
1469(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong root_return,
1470     jlong x_return, jlong y_return, jlong width_return, jlong height_return,
1471     jlong border_width_return, jlong depth_return)
1472{
1473    jint status;
1474    AWT_CHECK_HAVE_LOCK_RETURN(0);
1475    status = XGetGeometry((Display *)jlong_to_ptr(display),
1476                          (Drawable)drawable, (Window *)jlong_to_ptr(root_return),
1477                          (int *)jlong_to_ptr(x_return), (int *)jlong_to_ptr(y_return),
1478                          (unsigned int *)jlong_to_ptr(width_return), (unsigned int *)jlong_to_ptr(height_return),
1479                          (unsigned int *)jlong_to_ptr(border_width_return),
1480                          (unsigned int *)jlong_to_ptr(depth_return));
1481    return status;
1482}
1483
1484
1485/*
1486 * Class:     sun_awt_X11_XlibWrapper
1487 * Method:    XGetWMNormalHints
1488 * Signature: (JJJJ)I
1489 */
1490JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XGetWMNormalHints
1491(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints, jlong supplied_return)
1492{
1493    AWT_CHECK_HAVE_LOCK_RETURN(0);
1494    return XGetWMNormalHints((Display*) jlong_to_ptr(display),
1495                             window,
1496                             (XSizeHints*) jlong_to_ptr(hints),
1497                             (long*) jlong_to_ptr(supplied_return));
1498}
1499
1500/*
1501 * Class:     sun_awt_X11_XlibWrapper
1502 * Method:    XSetWMNormalHints
1503 * Signature: (JJJ)V
1504 */
1505JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetWMNormalHints
1506(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong hints)
1507{
1508    AWT_CHECK_HAVE_LOCK();
1509    XSetWMNormalHints((Display*) jlong_to_ptr(display), window, (XSizeHints*) jlong_to_ptr(hints));
1510}
1511
1512/*
1513 * Class:     sun_awt_X11_XlibWrapper
1514 * Method:    XDeleteProperty
1515 * Signature: (JJJ)V
1516 */
1517JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XDeleteProperty
1518(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong atom)
1519{
1520    AWT_CHECK_HAVE_LOCK();
1521    XDeleteProperty((Display*) jlong_to_ptr(display), window, (Atom)atom);
1522}
1523
1524/*
1525 * Class:     sun_awt_X11_XlibWrapper
1526 * Method:    XSendEvent
1527 * Signature: (JJZJJ)V
1528 */
1529JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XSendEvent
1530(JNIEnv *env, jclass clazz, jlong display, jlong window, jboolean propagate, jlong event_mask, jlong event)
1531{
1532    AWT_CHECK_HAVE_LOCK_RETURN(0);
1533    return XSendEvent((Display*) jlong_to_ptr(display),
1534                      window,
1535                      propagate==JNI_TRUE?True:False,
1536                      (long) event_mask,
1537                      (XEvent*) jlong_to_ptr(event));
1538}
1539
1540
1541/*
1542 * Class:     sun_awt_X11_XlibWrapper
1543 * Method:    XQueryTree
1544 * Signature: (JJJJJJ)I
1545 */
1546JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XQueryTree
1547(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong root_return, jlong parent_return, jlong children_return, jlong nchildren_return)
1548{
1549    AWT_CHECK_HAVE_LOCK_RETURN(0);
1550    return XQueryTree((Display*) jlong_to_ptr(display),
1551                      window,
1552                      (Window *) jlong_to_ptr(root_return),
1553                      (Window*) jlong_to_ptr(parent_return),
1554                      (Window**) jlong_to_ptr(children_return),
1555                      (unsigned int*) jlong_to_ptr(nchildren_return));
1556}
1557
1558
1559/*
1560 * Class:     sun_awt_X11_XlibWrapper
1561 * Method:    memcpy
1562 * Signature: (JJJ)V
1563 */
1564JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_memcpy
1565(JNIEnv *env, jclass clazz, jlong dest_ptr, jlong src_ptr, jlong length)
1566{
1567    memcpy(jlong_to_ptr(dest_ptr), jlong_to_ptr(src_ptr), length);
1568}
1569
1570
1571JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSetMinMaxHints
1572(JNIEnv *env, jclass clazz, jlong display, jlong window, jint x, jint y, jint width, jint height, jlong flags) {
1573    XSizeHints * hints;
1574    AWT_CHECK_HAVE_LOCK();
1575    hints = XAllocSizeHints();
1576    hints->flags = flags;
1577    hints->width = width;
1578    hints->min_width = width;
1579    hints->max_width = width;
1580    hints->height = height;
1581    hints->min_height = height;
1582    hints->max_height = height;
1583    hints->x = x;
1584    hints->y = y;
1585    XSetWMNormalHints((Display*) jlong_to_ptr(display), window, hints);
1586    XFree(hints);
1587}
1588
1589
1590JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XGetVisualInfo
1591(JNIEnv *env, jclass clazz, jlong display, jlong vinfo_mask, jlong vinfo_template,
1592 jlong nitems_return)
1593{
1594    AWT_CHECK_HAVE_LOCK_RETURN(0);
1595    return ptr_to_jlong(XGetVisualInfo((Display*) jlong_to_ptr(display),
1596                                       (long) vinfo_mask,
1597                                       (XVisualInfo*) jlong_to_ptr(vinfo_template),
1598                                       (int*) jlong_to_ptr(nitems_return)));
1599}
1600
1601JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XAllocSizeHints
1602  (JNIEnv *env, jclass clazz)
1603{
1604    AWT_CHECK_HAVE_LOCK_RETURN(0);
1605    return ptr_to_jlong(XAllocSizeHints());
1606}
1607
1608/*
1609 * Class:     sun_awt_X11_XlibWrapper
1610 * Method:    XIconifyWindow
1611 * Signature: (JJJ)V
1612 */
1613JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XBell
1614(JNIEnv *env, jclass clazz, jlong display, jint percent)
1615{
1616    AWT_CHECK_HAVE_LOCK();
1617    XBell((Display*)jlong_to_ptr(display), percent);
1618}
1619
1620
1621/*
1622 * Class:     sun_awt_X11_XlibWrapper
1623 * Method:    XAllocColor
1624 * Signature: (JJJ)Z
1625 */
1626JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XAllocColor
1627(JNIEnv *env, jclass clazz, jlong display , jlong colormap, jlong xcolor) {
1628
1629    Status status;
1630    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1631    status = XAllocColor((Display *) jlong_to_ptr(display), (Colormap) colormap, (XColor *) jlong_to_ptr(xcolor));
1632
1633    if (status == 0) return JNI_FALSE;
1634    else return JNI_TRUE;
1635}
1636
1637
1638/*
1639 * Class:     sun_awt_X11_XlibWrapper
1640 * Method:    XCreateBitmapFromData
1641 * Signature: (JJJII)J
1642 */
1643JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XCreateBitmapFromData
1644(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jlong data, jint width, jint height) {
1645    AWT_CHECK_HAVE_LOCK_RETURN(0);
1646
1647    return (jlong) XCreateBitmapFromData((Display *) jlong_to_ptr(display), (Drawable) drawable,
1648                                         (char *) jlong_to_ptr(data), width, height);
1649}
1650
1651
1652/*
1653 * Class:     sun_awt_X11_XlibWrapper
1654 * Method:    XFreePixmap
1655 * Signature: (JJ)V
1656 */
1657JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XFreePixmap
1658(JNIEnv *env, jclass clazz, jlong display, jlong pixmap) {
1659    AWT_CHECK_HAVE_LOCK();
1660    XFreePixmap((Display *)jlong_to_ptr(display), (Pixmap) pixmap);
1661}
1662
1663/*
1664 * Class:     sun_awt_X11_XlibWrapper
1665 * Method:    XReparentWindow
1666 * Signature: (JJJII)V
1667 */
1668JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XReparentWindow
1669(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong parent, jint x, jint y) {
1670    AWT_CHECK_HAVE_LOCK();
1671    XReparentWindow((Display*)jlong_to_ptr(display), window, parent, x, y);
1672}
1673
1674/*
1675 * Class:     sun_awt_X11_XlibWrapper
1676 * Method:    XConvertSelection
1677 * Signature: (JJJJJJ)V
1678 */
1679JNIEXPORT void JNICALL
1680Java_sun_awt_X11_XlibWrapper_XConvertSelection(JNIEnv *env, jclass clazz,
1681                           jlong display, jlong selection,
1682                           jlong target, jlong property,
1683                           jlong requestor, jlong time) {
1684    AWT_CHECK_HAVE_LOCK();
1685    XConvertSelection((Display*)jlong_to_ptr(display), selection, target, property, requestor,
1686              time);
1687}
1688
1689/*
1690 * Class:     sun_awt_X11_XlibWrapper
1691 * Method:    XSetSelectionOwner
1692 * Signature: (JJJJ)V
1693 */
1694JNIEXPORT void JNICALL
1695Java_sun_awt_X11_XlibWrapper_XSetSelectionOwner(JNIEnv *env, jclass clazz,
1696                        jlong display, jlong selection,
1697                        jlong owner, jlong time) {
1698    AWT_CHECK_HAVE_LOCK();
1699    XSetSelectionOwner((Display*)jlong_to_ptr(display), selection, owner, time);
1700}
1701
1702/*
1703 * Class:     sun_awt_X11_XlibWrapper
1704 * Method:    XGetSelectionOwner
1705 * Signature: (JJ)J
1706 */
1707JNIEXPORT jlong JNICALL
1708Java_sun_awt_X11_XlibWrapper_XGetSelectionOwner(JNIEnv *env, jclass clazz,
1709                        jlong display, jlong selection) {
1710    AWT_CHECK_HAVE_LOCK_RETURN(0);
1711    return (jlong)XGetSelectionOwner((Display*)jlong_to_ptr(display), selection);
1712}
1713
1714/*
1715 * Class:     sun_awt_X11_XlibWrapper
1716 * Method:    XGetAtomName
1717 * Signature: (JJ)Ljava/lang/String;
1718 */
1719JNIEXPORT jstring JNICALL
1720Java_sun_awt_X11_XlibWrapper_XGetAtomName(JNIEnv *env, jclass clazz,
1721                      jlong display, jlong atom)
1722{
1723    jstring string = NULL;
1724    char* name;
1725    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
1726    name = (char*) XGetAtomName((Display*)jlong_to_ptr(display), atom);
1727
1728    if (name == NULL) {
1729        fprintf(stderr, "Atom was %d\n", (int)atom);
1730        JNU_ThrowNullPointerException(env, "Failed to retrieve atom name.");
1731        return NULL;
1732    }
1733
1734    string = (*env)->NewStringUTF(env, (const char *)name);
1735
1736    XFree(name);
1737
1738    return string;
1739}
1740
1741/*
1742 * Class:     sun_awt_X11_XlibWrapper
1743 * Method:    XMaxRequestSize
1744 * Signature: (J)J
1745 */
1746JNIEXPORT jlong JNICALL
1747Java_sun_awt_X11_XlibWrapper_XMaxRequestSize(JNIEnv *env, jclass clazz,
1748                         jlong display) {
1749    AWT_CHECK_HAVE_LOCK_RETURN(0);
1750    return XMaxRequestSize((Display*) jlong_to_ptr(display));
1751}
1752
1753JNIEXPORT jlong JNICALL
1754Java_sun_awt_X11_XlibWrapper_XAllocWMHints(JNIEnv *env, jclass clazz)
1755{
1756    AWT_CHECK_HAVE_LOCK_RETURN(0);
1757    return ptr_to_jlong(XAllocWMHints());
1758}
1759
1760JNIEXPORT jlong JNICALL
1761Java_sun_awt_X11_XlibWrapper_XCreatePixmap(JNIEnv *env, jclass clazz, jlong display, jlong drawable, jint width, jint height, jint depth)
1762{
1763    AWT_CHECK_HAVE_LOCK_RETURN(0);
1764    return XCreatePixmap((Display*)jlong_to_ptr(display), (Drawable)drawable, width, height, depth);
1765}
1766JNIEXPORT jlong JNICALL
1767Java_sun_awt_X11_XlibWrapper_XCreateImage
1768  (JNIEnv *env, jclass clazz, jlong display, jlong visual_ptr,
1769   jint depth, jint format, jint offset, jlong data, jint width,
1770   jint height, jint bitmap_pad, jint bytes_per_line)
1771{
1772    AWT_CHECK_HAVE_LOCK_RETURN(0);
1773    return ptr_to_jlong(XCreateImage((Display*) jlong_to_ptr(display), (Visual*) jlong_to_ptr(visual_ptr),
1774                depth, format, offset, (char*) jlong_to_ptr(data),
1775                width, height, bitmap_pad, bytes_per_line));
1776}
1777JNIEXPORT jlong JNICALL
1778Java_sun_awt_X11_XlibWrapper_XCreateGC
1779  (JNIEnv *env, jclass clazz, jlong display, jlong drawable,
1780   jlong valuemask, jlong values)
1781{
1782    AWT_CHECK_HAVE_LOCK_RETURN(0);
1783    return ptr_to_jlong(XCreateGC((Display*) jlong_to_ptr(display), (Drawable)drawable, valuemask, (XGCValues*) jlong_to_ptr(values)));
1784}
1785
1786JNIEXPORT void JNICALL
1787Java_sun_awt_X11_XlibWrapper_XDestroyImage(JNIEnv *env, jclass clazz, jlong image)
1788{
1789    XImage *img = (XImage*) jlong_to_ptr(image);
1790    AWT_CHECK_HAVE_LOCK();
1791
1792    // Fix for bug 4903671 :
1793    // We should be careful to not double free the memory pointed to data
1794    // Since we use unsafe to allocate it, we should use unsafe to free it.
1795    // So we should NULL the data pointer before calling XDestroyImage so
1796    // that X does not free the pointer for us.
1797    img->data = NULL;
1798    XDestroyImage(img);
1799}
1800JNIEXPORT void JNICALL
1801Java_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)
1802{
1803    AWT_CHECK_HAVE_LOCK();
1804    XPutImage((Display*)jlong_to_ptr(display), (Drawable)drawable, (GC) jlong_to_ptr(gc), (XImage*) jlong_to_ptr(image), src_x, src_y,
1805              dest_x, dest_y, width, height);
1806}
1807JNIEXPORT void JNICALL
1808Java_sun_awt_X11_XlibWrapper_XFreeGC(JNIEnv *env, jclass clazz, jlong display, jlong gc)
1809{
1810    AWT_CHECK_HAVE_LOCK();
1811    XFreeGC((Display*) jlong_to_ptr(display), (GC) jlong_to_ptr(gc));
1812}
1813JNIEXPORT void JNICALL
1814Java_sun_awt_X11_XlibWrapper_XSetWindowBackgroundPixmap(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong pixmap)
1815{
1816    AWT_CHECK_HAVE_LOCK();
1817    XSetWindowBackgroundPixmap((Display*) jlong_to_ptr(display), (Window)window, (Pixmap)pixmap);
1818}
1819JNIEXPORT void JNICALL
1820Java_sun_awt_X11_XlibWrapper_XClearWindow(JNIEnv *env, jclass clazz, jlong display, jlong window)
1821{
1822    AWT_CHECK_HAVE_LOCK();
1823    XClearWindow((Display*) jlong_to_ptr(display), (Window)window);
1824}
1825
1826JNIEXPORT jint JNICALL
1827Java_sun_awt_X11_XlibWrapper_XGetIconSizes(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong ret_sizes, jlong ret_count)
1828{
1829    XIconSize** psize = (XIconSize**) jlong_to_ptr(ret_sizes);
1830    int * pcount = (int *) jlong_to_ptr(ret_count);
1831    Status res;
1832    AWT_CHECK_HAVE_LOCK_RETURN(0);
1833    res = XGetIconSizes((Display*) jlong_to_ptr(display), (Window)window, psize, pcount);
1834    return res;
1835}
1836
1837JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeQueryExtension
1838  (JNIEnv *env, jclass clazz, jlong display, jlong major_version_return,
1839   jlong minor_version_return)
1840{
1841    AWT_CHECK_HAVE_LOCK_RETURN(0);
1842    return XdbeQueryExtension((Display*) jlong_to_ptr(display), (int *) jlong_to_ptr(major_version_return),
1843                  (int *) jlong_to_ptr(minor_version_return));
1844}
1845
1846JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XQueryExtension
1847  (JNIEnv *env, jclass clazz, jlong display, jstring jstr, jlong mop_return,
1848   jlong feve_return, jlong err_return)
1849{
1850    char *cname;
1851    Boolean bu;
1852    if (!JNU_IsNull(env, jstr)) {
1853        cname = (char *)JNU_GetStringPlatformChars(env, jstr, NULL);
1854        CHECK_NULL_RETURN(cname, JNI_FALSE);
1855    } else {
1856        cname = "";
1857    }
1858
1859    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1860    bu = XQueryExtension((Display*) jlong_to_ptr(display), cname, (int *) jlong_to_ptr(mop_return),
1861                (int *) jlong_to_ptr(feve_return),  (int *) jlong_to_ptr(err_return));
1862    if (!JNU_IsNull(env, jstr)) {
1863        JNU_ReleaseStringPlatformChars(env, jstr, (const char *) cname);
1864    }
1865    return bu ? JNI_TRUE : JNI_FALSE;
1866}
1867
1868JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_IsKeypadKey
1869  (JNIEnv *env, jclass clazz, jlong keysym)
1870{
1871    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
1872    if(IsKeypadKey(keysym)) {
1873        return JNI_TRUE;
1874    }
1875    return JNI_FALSE;
1876}
1877
1878JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XdbeAllocateBackBufferName
1879  (JNIEnv *env, jclass clazz, jlong display, jlong window, jint swap_action)
1880{
1881    AWT_CHECK_HAVE_LOCK_RETURN(0);
1882    return XdbeAllocateBackBufferName((Display*) jlong_to_ptr(display), (Window) window,
1883                      (XdbeSwapAction) swap_action);
1884}
1885
1886JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeDeallocateBackBufferName
1887  (JNIEnv *env, jclass clazz, jlong display, jlong buffer)
1888{
1889    AWT_CHECK_HAVE_LOCK_RETURN(0);
1890    return XdbeDeallocateBackBufferName((Display*) jlong_to_ptr(display), (XdbeBackBuffer) buffer);
1891}
1892
1893JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeBeginIdiom
1894  (JNIEnv *env, jclass clazz, jlong display)
1895{
1896    AWT_CHECK_HAVE_LOCK_RETURN(0);
1897    return XdbeBeginIdiom((Display*) jlong_to_ptr(display));
1898}
1899
1900JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeEndIdiom
1901  (JNIEnv *env, jclass clazz, jlong display)
1902{
1903    AWT_CHECK_HAVE_LOCK_RETURN(0);
1904    return XdbeEndIdiom((Display*) jlong_to_ptr(display));
1905}
1906
1907JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_XdbeSwapBuffers
1908  (JNIEnv *env, jclass clazz, jlong display, jlong swap_info, jint num_windows)
1909{
1910    AWT_CHECK_HAVE_LOCK_RETURN(0);
1911    return XdbeSwapBuffers((Display*) jlong_to_ptr(display), (XdbeSwapInfo *) jlong_to_ptr(swap_info), num_windows);
1912}
1913JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XQueryKeymap
1914(JNIEnv *env, jclass clazz, jlong display, jlong vector)
1915{
1916
1917    AWT_CHECK_HAVE_LOCK();
1918    XQueryKeymap( (Display *) jlong_to_ptr(display), (char *) jlong_to_ptr(vector));
1919}
1920
1921// XKeycodeToKeysym is deprecated but for compatibility we keep the API.
1922JNIEXPORT jlong JNICALL
1923Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz,
1924                                              jlong display, jint keycode,
1925                                              jint index) {
1926    AWT_CHECK_HAVE_LOCK_RETURN(0);
1927    return keycodeToKeysym((Display*)jlong_to_ptr(display), (unsigned int)keycode, (int)index);
1928}
1929
1930JNIEXPORT jint JNICALL
1931Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,
1932                                              jlong display) {
1933    XkbStateRec sr;
1934    AWT_CHECK_HAVE_LOCK_RETURN(0);
1935    memset(&sr, 0, sizeof(XkbStateRec));
1936    XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);
1937//    printf("-------------------------------------VVVV\n");
1938//    printf("                 group:0x%0X\n",sr.group);
1939//    printf("            base_group:0x%0X\n",sr.base_group);
1940//    printf("         latched_group:0x%0X\n",sr.latched_group);
1941//    printf("          locked_group:0x%0X\n",sr.locked_group);
1942//    printf("                  mods:0x%0X\n",sr.mods);
1943//    printf("             base_mods:0x%0X\n",sr.base_mods);
1944//    printf("          latched_mods:0x%0X\n",sr.latched_mods);
1945//    printf("           locked_mods:0x%0X\n",sr.locked_mods);
1946//    printf("          compat_state:0x%0X\n",sr.compat_state);
1947//    printf("             grab_mods:0x%0X\n",sr.grab_mods);
1948//    printf("      compat_grab_mods:0x%0X\n",sr.compat_grab_mods);
1949//    printf("           lookup_mods:0x%0X\n",sr.lookup_mods);
1950//    printf("    compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);
1951//    printf("           ptr_buttons:0x%0X\n",sr.ptr_buttons);
1952//    printf("-------------------------------------^^^^\n");
1953    return (jint)(sr.group);
1954}
1955JNIEXPORT jlong JNICALL
1956Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,
1957                                              jlong display, jint keycode,
1958                                              jint group, jint level) {
1959    AWT_CHECK_HAVE_LOCK_RETURN(0);
1960    return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);
1961}
1962
1963JNIEXPORT jint JNICALL
1964Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,
1965                                              jlong display, jlong keysym) {
1966    AWT_CHECK_HAVE_LOCK_RETURN(0);
1967    return XKeysymToKeycode((Display*) jlong_to_ptr(display), (KeySym)keysym);
1968}
1969
1970JNIEXPORT jlong JNICALL
1971Java_sun_awt_X11_XlibWrapper_XGetModifierMapping(JNIEnv *env, jclass clazz,
1972                                              jlong display) {
1973    AWT_CHECK_HAVE_LOCK_RETURN(0);
1974    return ptr_to_jlong(XGetModifierMapping((Display*) jlong_to_ptr(display)));
1975}
1976
1977JNIEXPORT void JNICALL
1978Java_sun_awt_X11_XlibWrapper_XFreeModifiermap(JNIEnv *env, jclass clazz,
1979                                              jlong keymap) {
1980    AWT_CHECK_HAVE_LOCK();
1981    XFreeModifiermap((XModifierKeymap*) jlong_to_ptr(keymap));
1982}
1983/*
1984 * Class:     sun_awt_X11_XlibWrapper
1985 * Method:    XRefreshKeyboardMapping
1986 * Signature: (J)V
1987 */
1988JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRefreshKeyboardMapping
1989(JNIEnv *env, jclass clazz, jlong event_ptr)
1990{
1991    AWT_CHECK_HAVE_LOCK();
1992    XRefreshKeyboardMapping((XMappingEvent*) jlong_to_ptr(event_ptr));
1993}
1994
1995JNIEXPORT void JNICALL
1996Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab(JNIEnv *env, jclass clazz,
1997                                                      jlong display, jint mask,
1998                                                      jlong cursor, jlong time) {
1999    AWT_CHECK_HAVE_LOCK();
2000    XChangeActivePointerGrab((Display*)jlong_to_ptr(display), (unsigned int)mask,
2001                             (Cursor)cursor, (Time)time);
2002}
2003
2004/******************* Secondary loop support ************************************/
2005#define AWT_SECONDARY_LOOP_TIMEOUT 250
2006
2007static Bool exitSecondaryLoop = True;
2008
2009/*
2010 * This predicate procedure allows the Toolkit thread to process specific events
2011 * while it is blocked waiting for the event dispatch thread to process
2012 * a SunDropTargetEvent. We need this to prevent deadlock when the client code
2013 * processing SunDropTargetEvent sets or gets the contents of the system
2014 * clipboard/selection. In this case the event dispatch thread waits for the
2015 * Toolkit thread to process PropertyNotify or SelectionNotify events.
2016 */
2017static Bool
2018secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) {
2019    return (
2020                event->type == SelectionNotify ||
2021                event->type == SelectionClear  ||
2022                event->type == PropertyNotify  ||
2023                (event->type == ConfigureNotify
2024                    && event->xany.window == *(Window*) xawt_root_window)
2025            ) ? True : False;
2026}
2027
2028
2029JNIEXPORT jboolean JNICALL
2030Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz,
2031                                                     jlong display, jlong ptr) {
2032    uint32_t timeout = 1;
2033
2034    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
2035    exitSecondaryLoop = False;
2036    Window xawt_root_window = get_xawt_root_shell(env);
2037
2038    while (!exitSecondaryLoop) {
2039        if (XCheckIfEvent((Display*) jlong_to_ptr(display),
2040                (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) {
2041            return JNI_TRUE;
2042        }
2043        timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;
2044        AWT_WAIT(timeout);
2045    }
2046    return JNI_FALSE;
2047}
2048
2049JNIEXPORT void JNICALL
2050Java_sun_awt_X11_XlibWrapper_ExitSecondaryLoop(JNIEnv *env, jclass clazz) {
2051    DASSERT(!exitSecondaryLoop);
2052    AWT_CHECK_HAVE_LOCK();
2053    exitSecondaryLoop = True;
2054    AWT_NOTIFY_ALL();
2055}
2056/*******************************************************************************/
2057
2058JNIEXPORT jobjectArray JNICALL
2059Java_sun_awt_X11_XlibWrapper_XTextPropertyToStringList(JNIEnv *env,
2060                                                       jclass clazz,
2061                                                       jbyteArray bytes,
2062                                                       jlong encodingAtom) {
2063    XTextProperty tp;
2064    jbyte         *value;
2065
2066    char**        strings  = (char **)NULL;
2067    int32_t       nstrings = 0;
2068    jobjectArray  ret = NULL;
2069    int32_t       i;
2070    jsize         len;
2071    jboolean      isCopy = JNI_FALSE;
2072    static jclass stringClass = NULL;
2073    jclass        stringClassLocal = NULL;
2074
2075    AWT_CHECK_HAVE_LOCK_RETURN(NULL);
2076
2077    if (JNU_IsNull(env, stringClass)) {
2078        stringClassLocal = (*env)->FindClass(env, "java/lang/String");
2079
2080        if ((*env)->ExceptionCheck(env)) {
2081            (*env)->ExceptionDescribe(env);
2082            (*env)->ExceptionClear(env);
2083            DASSERT(False);
2084        }
2085
2086        if (JNU_IsNull(env, stringClassLocal)) {
2087            return NULL;
2088        }
2089
2090        stringClass = (*env)->NewGlobalRef(env, stringClassLocal); /* never freed! */
2091        (*env)->DeleteLocalRef(env, stringClassLocal);
2092
2093        if (JNU_IsNull(env, stringClass)) {
2094            JNU_ThrowOutOfMemoryError(env, "");
2095            return NULL;
2096        }
2097    }
2098
2099    /*
2100     * If the length of the byte array is 0 just return a null
2101     */
2102    len = (*env)->GetArrayLength(env, bytes);
2103    if (len == 0) {
2104        return (*env)->NewObjectArray(env, 0, stringClass, NULL);
2105    }
2106
2107    value = (*env)->GetByteArrayElements(env, bytes, &isCopy);
2108    if (JNU_IsNull(env, value)) {
2109        return NULL;
2110    }
2111
2112    tp.encoding = encodingAtom;
2113    tp.value    = (unsigned char *)value;
2114    tp.nitems   = len;
2115    tp.format   = 8;
2116
2117    /*
2118     * Convert the byte stream into a list of X11 strings
2119     */
2120    if (XTextPropertyToStringList(&tp, &strings, &nstrings) == 0) {
2121        (*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);
2122        return NULL;
2123    }
2124
2125    (*env)->ReleaseByteArrayElements(env, bytes, value, JNI_ABORT);
2126
2127    if (nstrings == 0) {
2128        return (*env)->NewObjectArray(env, 0, stringClass, NULL);
2129    }
2130
2131    ret = (*env)->NewObjectArray(env, nstrings, stringClass, NULL);
2132
2133    if ((*env)->ExceptionCheck(env)) {
2134        (*env)->ExceptionDescribe(env);
2135        (*env)->ExceptionClear(env);
2136        goto wayout;
2137    }
2138
2139    if (JNU_IsNull(env, ret)) {
2140        goto wayout;
2141    }
2142
2143    for (i = 0; i < nstrings; i++) {
2144        jstring string = (*env)->NewStringUTF(env,
2145                                              (const char *)strings[i]);
2146        if ((*env)->ExceptionCheck(env)) {
2147            (*env)->ExceptionDescribe(env);
2148            (*env)->ExceptionClear(env);
2149            goto wayout;
2150        }
2151
2152        if (JNU_IsNull(env, string)) {
2153            goto wayout;
2154        }
2155
2156        (*env)->SetObjectArrayElement(env, ret, i, string);
2157
2158        if ((*env)->ExceptionCheck(env)) {
2159            (*env)->ExceptionDescribe(env);
2160            (*env)->ExceptionClear(env);
2161            goto wayout;
2162        }
2163
2164        (*env)->DeleteLocalRef(env, string);
2165    }
2166
2167 wayout:
2168    /*
2169     * Clean up and return
2170     */
2171    XFreeStringList(strings);
2172    return ret;
2173}
2174
2175
2176JNIEXPORT void JNICALL
2177Java_sun_awt_X11_XlibWrapper_XPutBackEvent(JNIEnv *env,
2178                                           jclass clazz,
2179                                           jlong display,
2180                                           jlong event) {
2181    XPutBackEvent((Display*)jlong_to_ptr(display), (XEvent*) jlong_to_ptr(event));
2182}
2183
2184JNIEXPORT jlong JNICALL
2185Java_sun_awt_X11_XlibWrapper_getAddress(JNIEnv *env,
2186                                           jclass clazz,
2187                                           jobject o) {
2188    return ptr_to_jlong(o);
2189}
2190
2191JNIEXPORT void JNICALL
2192Java_sun_awt_X11_XlibWrapper_copyIntArray(JNIEnv *env,
2193                                           jclass clazz,
2194                                           jlong dest, jobject array, jint size) {
2195    jboolean isCopy = JNI_FALSE;
2196    jint * ints = (*env)->GetIntArrayElements(env, array, &isCopy);
2197    memcpy(jlong_to_ptr(dest), ints, size);
2198    if (isCopy) {
2199        (*env)->ReleaseIntArrayElements(env, array, ints, JNI_ABORT);
2200    }
2201}
2202
2203JNIEXPORT void JNICALL
2204Java_sun_awt_X11_XlibWrapper_copyLongArray(JNIEnv *env,
2205                                           jclass clazz,
2206                                           jlong dest, jobject array, jint size) {
2207    jboolean isCopy = JNI_FALSE;
2208    jlong * longs = (*env)->GetLongArrayElements(env, array, &isCopy);
2209    memcpy(jlong_to_ptr(dest), longs, size);
2210    if (isCopy) {
2211        (*env)->ReleaseLongArrayElements(env, array, longs, JNI_ABORT);
2212    }
2213}
2214
2215JNIEXPORT jint JNICALL
2216Java_sun_awt_X11_XlibWrapper_XSynchronize(JNIEnv *env, jclass clazz, jlong display, jboolean onoff)
2217{
2218    return (jint) XSynchronize((Display*)jlong_to_ptr(display), (onoff == JNI_TRUE ? True : False));
2219}
2220
2221JNIEXPORT jboolean JNICALL
2222Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension
2223(JNIEnv *env, jclass clazz, jlong display, jlong event_base_return, jlong error_base_return)
2224{
2225    jboolean status;
2226
2227    AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE);
2228
2229    status = XShapeQueryExtension((Display *)jlong_to_ptr(display),
2230            (int *)jlong_to_ptr(event_base_return), (int *)jlong_to_ptr(error_base_return));
2231    return status;
2232}
2233
2234/*
2235 * Class:     XlibWrapper
2236 * Method:    SetRectangularShape
2237 */
2238
2239JNIEXPORT void JNICALL
2240Java_sun_awt_X11_XlibWrapper_SetRectangularShape
2241(JNIEnv *env, jclass clazz, jlong display, jlong window,
2242 jint x1, jint y1, jint x2, jint y2,
2243 jobject region)
2244{
2245    AWT_CHECK_HAVE_LOCK();
2246
2247    // If all the params are zeros, the shape must be simply reset.
2248    // Otherwise, the shape may be not rectangular.
2249    if (region || x1 || x2 || y1 || y2) {
2250        XRectangle rects[256];
2251        XRectangle *pRect = rects;
2252
2253        int numrects = RegionToYXBandedRectangles(env, x1, y1, x2, y2, region,
2254                &pRect, 256);
2255
2256        XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2257                ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2258        XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2259                ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2260
2261        if (pRect != rects) {
2262            free(pRect);
2263        }
2264    } else {
2265        // Reset the shape to a rectangular form.
2266        XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2267                ShapeClip, 0, 0, None, ShapeSet);
2268        XShapeCombineMask((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2269                ShapeBounding, 0, 0, None, ShapeSet);
2270    }
2271}
2272
2273/*
2274 * Class:     XlibWrapper
2275 * Method:    SetZOrder
2276 */
2277
2278JNIEXPORT void JNICALL
2279Java_sun_awt_X11_XlibWrapper_SetZOrder
2280(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)
2281{
2282    unsigned int value_mask = CWStackMode;
2283
2284    XWindowChanges wc;
2285    wc.sibling = (Window)jlong_to_ptr(above);
2286
2287    AWT_CHECK_HAVE_LOCK();
2288
2289    if (above == 0) {
2290        wc.stack_mode = Above;
2291    } else {
2292        wc.stack_mode = Below;
2293        value_mask |= CWSibling;
2294    }
2295
2296    XConfigureWindow((Display *)jlong_to_ptr(display),
2297                     (Window)jlong_to_ptr(window),
2298                     value_mask, &wc );
2299}
2300
2301/*
2302 * Class:     XlibWrapper
2303 * Method:    SetBitmapShape
2304 */
2305JNIEXPORT void JNICALL
2306Java_sun_awt_X11_XlibWrapper_SetBitmapShape
2307(JNIEnv *env, jclass clazz, jlong display, jlong window,
2308 jint width, jint height, jintArray bitmap)
2309{
2310    jsize len;
2311    jint *values;
2312    jboolean isCopy = JNI_FALSE;
2313    size_t worstBufferSize = (size_t)((width / 2 + 1) * height);
2314    RECT_T * pRect;
2315    int numrects;
2316
2317    if (!IS_SAFE_SIZE_MUL(width / 2 + 1, height)) {
2318        return;
2319    }
2320
2321    AWT_CHECK_HAVE_LOCK();
2322
2323    len = (*env)->GetArrayLength(env, bitmap);
2324    if (len == 0 || len < width * height) {
2325        return;
2326    }
2327
2328    values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);
2329    if (JNU_IsNull(env, values)) {
2330        return;
2331    }
2332
2333    pRect = (RECT_T *)SAFE_SIZE_ARRAY_ALLOC(malloc, worstBufferSize, sizeof(RECT_T));
2334    if (!pRect) {
2335        return;
2336    }
2337
2338    /* Note: the values[0] and values[1] are supposed to contain the width
2339     * and height (see XIconInfo.getIntData() for details). So, we do +2.
2340     */
2341    numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,
2342            (unsigned char *)(values + 2), pRect);
2343
2344    XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2345            ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2346    XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
2347            ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
2348
2349    free(pRect);
2350
2351    (*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);
2352}
2353