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 
 604     static int getDataModel() {
 605         return dataModel;
 606     }
 607 
 608     static String hintsToString(long flags) {
 609         StringBuffer buf = new StringBuffer();
 610         if ((flags & XUtilConstants.PMaxSize) != 0) {
 611             buf.append("PMaxSize ");
 612         }
 613         if ((flags & XUtilConstants.PMinSize) != 0) {
 614             buf.append("PMinSize ");
 615         }
 616         if ((flags & XUtilConstants.USSize) != 0) {
 617             buf.append("USSize ");
 618         }
 619         if ((flags & XUtilConstants.USPosition) != 0) {
 620             buf.append("USPosition ");
 621         }
 622         if ((flags & XUtilConstants.PPosition) != 0) {
 623             buf.append("PPosition ");
 624         }
 625         if ((flags & XUtilConstants.PSize) != 0) {
 626             buf.append("PSize ");
 627         }
 628         if ((flags & XUtilConstants.PWinGravity) != 0) {
 629             buf.append("PWinGravity ");
 630         }
 631         return buf.toString();
 632     }
 633     static String getEventToString( int type ) {
 634         if( (type >= 0) && (type < eventToString.length)) {
 635             return eventToString[type];
 636         }else if( type == XToolkit.getXKBBaseEventCode() ) {
 637             //XXX TODO various xkb types
 638             return "XkbEvent";
 639         }
 640         return eventToString[0];
 641     }
 642 
 643     private static boolean getBuildInternal() {
 644         String javaVersion = XToolkit.getSystemProperty("java.version");
 645         return javaVersion != null && javaVersion.contains("internal");
 646     }
 647 
 648     static native void PrintXErrorEvent(long display, long event_ptr);
 649 
 650     /**
 651      * The interface to be implemented by a predicate object used with the
 652      * CheckIfEvent() method.
 653      */
 654     public static interface CheckEventPredicate {
 655 
 656         /**
 657          * Returns true if the event matches some criteria, false otherwise.
 658          */
 659         boolean doesMatch(XEvent event);
 660     }
 661 
 662     /**
 663      * Invokes the XCheckIfEvent().
 664      * The returned event (if any) MUST BE disposed by the caller.
 665      *
 666      * @return the matched event or null if no match found.
 667      */
 668     public static XEvent CheckIfEvent(long display, CheckEventPredicate predicate) {
 669         XEvent ev = new XEvent();
 670 
 671         if (CheckIfEvent(display, ev, ev.pData, predicate)) {
 672             return ev;
 673         } else {
 674             ev.dispose();
 675             return null;
 676         }
 677     }
 678 
 679     /*
 680      * NOTE: The passed event_return MUST be equal to the event.pData.
 681      */
 682     private static native boolean CheckIfEvent(long display, XEvent event,
 683             long event_return, CheckEventPredicate predicate);
 684 }