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