1 /* 2 * Copyright 2002-2009 Sun Microsystems, Inc. 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. Sun designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 22 * CA 95054 USA or visit www.sun.com if you need additional information or 23 * have any questions. 24 */ 25 26 package sun.awt.X11; 27 28 import java.security.AccessController; 29 import java.security.PrivilegedAction; 30 import sun.misc.*; 31 32 final public class XlibWrapper 33 { 34 static Unsafe unsafe = Unsafe.getUnsafe(); 35 // strange constants 36 static final int MAXSIZE = 32767; 37 static final int MINSIZE = 1; 38 39 // define a private constructor here to prevent this class and all 40 // its descendants from being created 41 private XlibWrapper() 42 { 43 } 44 45 /* 46 Display *XOpenDisplay(display_name) 47 char *display_name; 48 49 */ 50 public final static String eventToString[]= 51 {"<none:0>", "<none:1>", "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease", 52 "MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", "FocusOut", 53 "KeymapNotify", "Expose", "GraphicsExpose", "NoExpose", "VisibilityNotify", 54 "CreateNotify", "DestroyNotify", "UnmapNotify", "MapNotify", "MapRequest", 55 "ReparentNotify", "ConfigureNotify", "ConfigureRequest", "GravityNotify", 56 "ResizeRequest", "CirculateNotify", "CirculateRequest", "PropertyNotify", 57 "SelectionClear", "SelectionRequest", "SelectionNotify", "ColormapNotify", 58 "ClientMessage", "MappingNotify", "LASTEvent"}; 59 60 static native void XFree(long ptr); 61 static native void memcpy(long dest_ptr, long src_ptr, long length); 62 static native long getAddress(Object o); 63 static native void copyIntArray(long dest_ptr, Object array, int size_bytes); 64 static native void copyLongArray(long dest_ptr, Object array, int size_bytes); 65 66 /** 67 * Gets byte string from str_ptr and copies it into byte array 68 * String should be NULL terminated 69 */ 70 static native byte[] getStringBytes(long str_ptr); 71 72 static native long XOpenDisplay(long display); 73 74 static native void XCloseDisplay(long display); 75 76 static native long XDisplayString(long display); 77 78 static native void XSetCloseDownMode(long display, int close_mode); 79 80 static native long DefaultScreen(long display); 81 82 static native long ScreenOfDisplay(long display, long screen_number); 83 84 static native int DoesBackingStore(long screen); 85 86 static native long DisplayWidth(long display, long screen); 87 static native long DisplayWidthMM(long display, long screen); 88 89 static native long DisplayHeight(long display, long screen); 90 static native long DisplayHeightMM(long display, long screen); 91 92 static native long RootWindow(long display, long screen_number); 93 static native int ScreenCount(long display); 94 95 96 /* 97 Window XCreateWindow(display, parent, x, y, width, height, 98 border_width, depth, 99 class, visual, valuemask, attributes) 100 Display *display; 101 Window parent; 102 int x, y; 103 unsigned int width, height; 104 unsigned int border_width; 105 int depth; 106 unsigned int class; 107 Visual *visual 108 unsigned long valuemask; 109 XSetWindowAttributes *attributes; 110 */ 111 112 static native long XCreateWindow(long display, long parent, int x,int y, int width, int height, int border_width, int depth, long wclass, long visual, long valuemask, long attributes); 113 114 static native void XDestroyWindow(long display, long window); 115 116 static native int XGrabPointer(long display, long grab_window, 117 int owner_events, int event_mask, int pointer_mode, 118 int keyboard_mode, long confine_to, long cursor, long time); 119 120 static native void XUngrabPointer(long display, long time); 121 122 static native int XGrabKeyboard(long display, long grab_window, 123 int owner_events, int pointer_mode, 124 int keyboard_mode, long time); 125 126 static native void XUngrabKeyboard(long display, long time); 127 128 static native void XGrabServer(long display); 129 static native void XUngrabServer(long display); 130 131 /* 132 133 void XSetWMProperties(display, w, window_name, icon_name, 134 argv, argc, normal_hints, wm_hints, class_hints) 135 Display *display; 136 Window w; 137 XTextProperty *window_name; 138 XTextProperty *icon_name; 139 char **argv; 140 int argc; 141 XSizeHints *normal_hints; 142 XWMHints *wm_hints; 143 XClassHint *class_hints; 144 */ 145 146 /* 147 148 XMapWindow(display, w) 149 Display *display; 150 Window w; 151 */ 152 153 static native void XMapWindow(long display, long window); 154 static native void XMapRaised(long display, long window); 155 static native void XRaiseWindow(long display, long window); 156 157 static native void XLowerWindow(long display, long window); 158 static native void XRestackWindows(long display, long windows, int length); 159 static native void XConfigureWindow(long display, long window, 160 long value_mask, long values); 161 static native void XSetInputFocus(long display, long window); 162 static native void XSetInputFocus2(long display, long window, long time); 163 static native long XGetInputFocus(long display); 164 165 /* 166 167 XUnmapWindow(display, w) 168 Display *display; 169 Window w; 170 */ 171 172 static native void XUnmapWindow(long display, long window); 173 174 175 176 177 /* 178 XSelectInput(display, w, event_mask) 179 Display *display; 180 Window w; 181 long event_mask; 182 183 */ 184 static native void XSelectInput(long display, long window, long event_mask); 185 186 /* 187 XNextEvent(display, event_return) 188 Display *display; 189 XEvent *event_return; 190 191 */ 192 193 static native void XNextEvent(long display,long ptr); 194 195 /* 196 XMaskEvent(display, event_mask, event_return) 197 Display *display; 198 long event_mask; 199 XEvent *event_return; 200 */ 201 static native void XMaskEvent(long display, long event_mask, long event_return); 202 203 static native void XWindowEvent(long display, long window, long event_mask, long event_return); 204 205 /* 206 Bool XFilterEvent(event, w) 207 XEvent *event; 208 Window w; 209 */ 210 static native boolean XFilterEvent(long ptr, long window); 211 212 /* 213 Bool XSupportsLocale() 214 */ 215 static native boolean XSupportsLocale(); 216 217 /* 218 char *XSetLocaleModifiers(modifier_list) 219 char *modifier_list; 220 */ 221 static native String XSetLocaleModifiers(String modifier_list); 222 223 224 static native int XTranslateCoordinates( 225 long display, long src_w, long dest_w, 226 long src_x, long src_y, 227 long dest_x_return, long dest_y_return, 228 long child_return); 229 230 /* 231 XPeekEvent(display, event_return) 232 Display *display; 233 XEvent *event_return; 234 235 */ 236 237 static native void XPeekEvent(long display,long ptr); 238 239 /* 240 XFlush(display) 241 Display *display; 242 */ 243 244 static native void XFlush(long display); 245 246 /* 247 XSync(display, discard) 248 Display *display; 249 Bool discard; 250 */ 251 252 static native void XSync(long display,int discard); 253 254 255 /* XMoveResizeWindow(display, w, x, y, width, height) 256 Display *display; 257 Window w; 258 int x, y; 259 unsigned int width, height; 260 */ 261 static native void XMoveResizeWindow(long display, long window, int x, int y, int width, int height); 262 static native void XResizeWindow(long display, long window, int width, int height); 263 static native void XMoveWindow(long display, long window, int x, int y); 264 265 /* 266 Bool XQueryPointer(display, w, root_return, child_return, 267 root_x_return, root_y_return, 268 win_x_return, win_y_return, 269 mask_return) 270 Display *display; 271 Window w; 272 Window *root_return, *child_return; 273 int *root_x_return, *root_y_return; 274 int *win_x_return, *win_y_return; 275 unsigned int *mask_return; 276 */ 277 278 static native boolean XQueryPointer (long display, long window, long root_return, long child_return, long root_x_return, long root_y_return, long win_x_return, long win_y_return, long mask_return); 279 280 /* XFreeCursor(display, cursor) 281 Display *display; 282 Cursor cursor; 283 */ 284 285 static native void XFreeCursor(long display, long cursor); 286 287 /* 288 XSetWindowBackground(display, w, background_pixel) 289 Display *display; 290 Window w; 291 unsigned long background_pixel; 292 */ 293 294 static native void XSetWindowBackground(long display, long window, long background_pixel); 295 296 static native int XEventsQueued(long display, int mode); 297 298 /* 299 Atom XInternAtom(display, atom_name, only_if_exists) 300 Display *display; 301 char *atom_name; 302 Bool only_if_exists; 303 */ 304 305 static native int XInternAtoms(long display, String[] names, boolean only_if_exists, long atoms); 306 307 static native void SetProperty(long display, long window, long atom, String str); 308 static native String GetProperty(long display ,long window, long atom); 309 static native long InternAtom(long display, String string, int only_if_exists); 310 static native int XGetWindowProperty(long display, long window, long atom, 311 long long_offset, long long_length, 312 long delete, long req_type, long actualy_type, 313 long actualy_format, long nitems_ptr, 314 long bytes_after, long data_ptr); 315 native static void XChangePropertyImpl(long display, long window, long atom, 316 long type, int format, int mode, long data, 317 int nelements); 318 static void XChangeProperty(long display, long window, long atom, 319 long type, int format, int mode, long data, 320 int nelements) { 321 // TODO: handling of XChangePropertyImpl return value, if not Success - don't cache 322 if (XPropertyCache.isCachingSupported() && 323 XToolkit.windowToXWindow(window) != null && 324 WindowPropertyGetter.isCacheableProperty(XAtom.get(atom)) && 325 mode == XConstants.PropModeReplace) 326 { 327 int length = (format / 8) * nelements; 328 XPropertyCache.storeCache( 329 new XPropertyCache.PropertyCacheEntry(format, 330 nelements, 331 0, 332 data, 333 length), 334 window, 335 XAtom.get(atom)); 336 } 337 XChangePropertyImpl(display, window, atom, type, format, mode, data, nelements); 338 } 339 340 static native void XChangePropertyS(long display, long window, long atom, 341 long type, int format, int mode, String value); 342 static native void XDeleteProperty(long display, long window, long atom); 343 344 static native void XSetTransientFor(long display, long window, long transient_for_window); 345 static native void XSetWMHints(long display, long window, long wmhints); 346 static native void XGetWMHints(long display, long window, long wmhints); 347 static native long XAllocWMHints(); 348 static native int XGetPointerMapping(long display, long map, int buttonNumber); 349 static native String XGetDefault(long display, String program, String option); 350 static native long getScreenOfWindow(long display, long window); 351 static native long XScreenNumberOfScreen(long screen); 352 static native int XIconifyWindow(long display, long window, long screenNumber); 353 static native String ServerVendor(long display); 354 static native int VendorRelease(long display); 355 356 static native void XBell(long display, int percent); 357 358 /* 359 Cursor XCreateFontCursor(display, shape) 360 Display *display; 361 unsigned int shape; 362 363 we always pass int as shape param. 364 perhaps later we will need to change type of shape to long. 365 */ 366 367 static native int XCreateFontCursor(long display, int shape); 368 369 /* 370 Pixmap XCreateBitmapFromData(display, d, data, width, 371 height) 372 Display *display; 373 Drawable d; 374 char *data; 375 unsigned int width, height; 376 */ 377 378 static native long XCreateBitmapFromData(long display, long drawable, long data, int width, int height); 379 380 /* 381 XFreePixmap(display, pixmap) 382 Display *display; 383 Pixmap pixmap; 384 */ 385 386 static native void XFreePixmap(long display, long pixmap); 387 388 /* 389 Cursor XCreatePixmapCursor(display, source, mask, 390 foreground_color, background_color, x, y) 391 Display *display; 392 Pixmap source; 393 Pixmap mask; 394 XColor *foreground_color; 395 XColor *background_color; 396 unsigned int x, y; 397 */ 398 static native long XCreatePixmapCursor(long display, long source, long mask, long fore, long back, int x, int y); 399 400 401 /* 402 Status XQueryBestCursor(display, d, width, height, 403 width_return, height_return) 404 Display *display; 405 Drawable d; 406 unsigned int width, height; 407 unsigned int *width_return, *height_return; 408 409 */ 410 411 static native boolean XQueryBestCursor(long display, long drawable, int width, int height, long width_return, long height_return); 412 413 414 /* 415 Status XAllocColor(display, colormap, screen_in_out) 416 Display *display; 417 Colormap colormap; 418 XColor *screen_in_out; 419 */ 420 421 static native boolean XAllocColor( long display, long colormap, long screen_in_out); 422 423 424 static native long SetToolkitErrorHandler(); 425 static native void XSetErrorHandler(long handler); 426 static native int CallErrorHandler(long handler, long display, long event_ptr); 427 428 /* 429 XChangeWindowAttributes(display, w, valuemask, attributes) 430 Display *display; 431 Window w; 432 unsigned long valuemask; 433 XSetWindowAttributes *attributes; 434 */ 435 436 static native void XChangeWindowAttributes(long display, long window, long valuemask, long attributes); 437 static native int XGetWindowAttributes(long display, long window, long attr_ptr); 438 static native int XGetGeometry(long display, long drawable, long root_return, long x_return, long y_return, 439 long width_return, long height_return, long border_width_return, long depth_return); 440 441 static native int XGetWMNormalHints(long display, long window, long hints, long supplied_return); 442 static native void XSetWMNormalHints(long display, long window, long hints); 443 static native void XSetMinMaxHints(long display, long window, int x, int y, int width, int height, long flags); 444 static native long XAllocSizeHints(); 445 446 static native int XSendEvent(long display, long window, boolean propagate, long event_mask, long event); 447 static native void XPutBackEvent(long display, long event); 448 static native int XQueryTree(long display, long window, long root_return, long parent_return, long children_return, long nchildren_return); 449 static native long XGetVisualInfo(long display, long vinfo_mask, long vinfo_template, long nitems_return); 450 static native void XReparentWindow(long display, long window, long parent, int x, int y); 451 452 static native void XConvertSelection(long display, long selection, 453 long target, long property, 454 long requestor, long time); 455 456 static native void XSetSelectionOwner(long display, long selection, 457 long owner, long time); 458 459 static native long XGetSelectionOwner(long display, long selection); 460 461 static native String XGetAtomName(long display, long atom); 462 463 static native long XMaxRequestSize(long display); 464 465 466 static native long XCreatePixmap(long display, long drawable, int width, int height, int depth); 467 static native long XCreateImage(long display, long visual_ptr, int depth, int format, 468 int offset, long data, int width, int height, int bitmap_pad, 469 int bytes_per_line); 470 static native void XDestroyImage(long image); 471 static native void XPutImage(long display, long drawable, long gc, long image, 472 int src_x, int src_y, int dest_x, int dest_y, 473 int width, int height); 474 static native long XCreateGC(long display, long drawable, long valuemask, long values); 475 static native void XFreeGC(long display, long gc); 476 static native void XSetWindowBackgroundPixmap(long display, long window, long pixmap); 477 static native void XClearWindow(long display, long window); 478 static native int XGetIconSizes(long display, long window, long ret_sizes, long ret_count); 479 static native int XdbeQueryExtension(long display, long major_version_return, 480 long minor_version_return); 481 static native boolean XQueryExtension(long display, String name, long mop_return, 482 long feve_return, long err_return); 483 static native boolean IsKeypadKey(long keysym); 484 static native long XdbeAllocateBackBufferName(long display, long window, int swap_action); 485 static native int XdbeDeallocateBackBufferName(long display, long buffer); 486 static native int XdbeBeginIdiom(long display); 487 static native int XdbeEndIdiom(long display); 488 static native int XdbeSwapBuffers(long display, long swap_info, int num_windows); 489 490 static native void XQueryKeymap(long display, long vector); 491 static native long XKeycodeToKeysym(long display, int keycode, int index); 492 493 static native int XKeysymToKeycode(long display, long keysym); 494 495 // xkb-related 496 static native int XkbGetEffectiveGroup(long display); 497 static native long XkbKeycodeToKeysym(long display, int keycode, int group, int level); 498 static native void XkbSelectEvents(long display, long device, long bits_to_change, long values_for_bits); 499 static native void XkbSelectEventDetails(long display, long device, long event_type, 500 long bits_to_change, long values_for_bits); 501 static native boolean XkbQueryExtension(long display, long opcode_rtrn, long event_rtrn, 502 long error_rtrn, long major_in_out, long minor_in_out); 503 static native boolean XkbLibraryVersion(long lib_major_in_out, long lib_minor_in_out); 504 static native long XkbGetMap(long display, long which, long device_spec); 505 static native long XkbGetUpdatedMap(long display, long which, long xkb); 506 static native void XkbFreeKeyboard(long xkb, long which, boolean free_all); 507 static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn); 508 509 510 static native void XConvertCase(long keysym, 511 long keysym_lowercase, 512 long keysym_uppercase); 513 514 static native long XGetModifierMapping(long display); 515 516 static native void XFreeModifiermap(long keymap); 517 518 static native void XChangeActivePointerGrab(long display, int mask, 519 long cursor, long time); 520 521 /* 522 int (*XSynchronize(Display *display, Bool onoff))(); 523 display Specifies the connection to the X server. 524 onoff Specifies a Boolean value that indicates whether to enable or disable synchronization. 525 */ 526 public static native int XSynchronize(long display, boolean onoff); 527 528 /** 529 * Extracts an X event that can be processed in a secondary loop. 530 * Should only be called on the toolkit thread. 531 * Returns false if this secondary event was terminated. 532 */ 533 static native boolean XNextSecondaryLoopEvent(long display, long ptr); 534 /** 535 * Terminates the topmost secondary loop (if any). 536 * Should never be called on the toolkit thread. 537 */ 538 static native void ExitSecondaryLoop(); 539 540 /** 541 * Calls XTextPropertyToStringList on the specified byte array and returns 542 * the array of strings. 543 */ 544 static native String[] XTextPropertyToStringList(byte[] bytes, long encoding_atom); 545 546 /** 547 * XSHAPE extension support. 548 */ 549 static native boolean XShapeQueryExtension(long display, long event_base_return, long error_base_return); 550 static native void SetRectangularShape(long display, long window, 551 int lox, int loy, int hix, int hiy, 552 sun.java2d.pipe.Region region); 553 /** Each int in the bitmap array is one pixel with a 32-bit color: 554 * R, G, B, and Alpha. 555 */ 556 static native void SetBitmapShape(long display, long window, 557 int width, int height, int[] bitmap); 558 559 static native void SetZOrder(long display, long window, long above); 560 561 /* Global memory area used for X lib parameter passing */ 562 563 final static long lbuffer = unsafe.allocateMemory(64); // array to hold 8 longs 564 final static long ibuffer = unsafe.allocateMemory(32); // array to hold 8 ints 565 566 static final long larg1 = lbuffer; 567 static final long larg2 = larg1+8; 568 static final long larg3 = larg2+8; 569 static final long larg4 = larg3+8; 570 static final long larg5 = larg4+8; 571 static final long larg6 = larg5+8; 572 static final long larg7 = larg6+8; 573 static final long larg8 = larg7+8; 574 575 static final long iarg1 = ibuffer; 576 static final long iarg2 = iarg1+4; 577 static final long iarg3 = iarg2+4; 578 static final long iarg4 = iarg3+4; 579 static final long iarg5 = iarg4+4; 580 static final long iarg6 = iarg5+4; 581 static final long iarg7 = iarg6+4; 582 static final long iarg8 = iarg7+4; 583 584 585 static int dataModel; 586 static final boolean isBuildInternal; 587 588 static { 589 String dataModelProp = (String)AccessController.doPrivileged( 590 new PrivilegedAction() { 591 public Object run() { 592 return System.getProperty("sun.arch.data.model"); 593 } 594 }); 595 try { 596 dataModel = Integer.parseInt(dataModelProp); 597 } catch (Exception e) { 598 dataModel = 32; 599 } 600 601 isBuildInternal = getBuildInternal(); 602 603 // System.loadLibrary("mawt"); 604 } 605 606 static int getDataModel() { 607 return dataModel; 608 } 609 610 static String hintsToString(long flags) { 611 StringBuffer buf = new StringBuffer(); 612 if ((flags & XUtilConstants.PMaxSize) != 0) { 613 buf.append("PMaxSize "); 614 } 615 if ((flags & XUtilConstants.PMinSize) != 0) { 616 buf.append("PMinSize "); 617 } 618 if ((flags & XUtilConstants.USSize) != 0) { 619 buf.append("USSize "); 620 } 621 if ((flags & XUtilConstants.USPosition) != 0) { 622 buf.append("USPosition "); 623 } 624 if ((flags & XUtilConstants.PPosition) != 0) { 625 buf.append("PPosition "); 626 } 627 if ((flags & XUtilConstants.PSize) != 0) { 628 buf.append("PSize "); 629 } 630 if ((flags & XUtilConstants.PWinGravity) != 0) { 631 buf.append("PWinGravity "); 632 } 633 return buf.toString(); 634 } 635 static String getEventToString( int type ) { 636 if( (type >= 0) && (type < eventToString.length)) { 637 return eventToString[type]; 638 }else if( type == XToolkit.getXKBBaseEventCode() ) { 639 //XXX TODO various xkb types 640 return "XkbEvent"; 641 } 642 return eventToString[0]; 643 } 644 645 private static boolean getBuildInternal() { 646 String javaVersion = XToolkit.getSystemProperty("java.version"); 647 return javaVersion != null && javaVersion.contains("internal"); 648 } 649 650 static native void PrintXErrorEvent(long display, long event_ptr); 651 } --- EOF ---