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