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