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