src/solaris/classes/sun/awt/X11/XToolkit.java

Print this page




2333                  //System.out.println("XkbState:"+(xke.get_state()));
2334                  break;
2335             default:
2336                  //System.out.println("XkbEvent of xkb_type "+xkb_type);
2337                  break;
2338         }
2339     }
2340 
2341     private static long eventNumber;
2342     public static long getEventNumber() {
2343         awtLock();
2344         try {
2345             return eventNumber;
2346         } finally {
2347             awtUnlock();
2348         }
2349     }
2350 
2351     private static XEventDispatcher oops_waiter;
2352     private static boolean oops_updated;
2353     private static boolean oops_failed;
2354     private XAtom oops;
2355     private static final long WORKAROUND_SLEEP = 100;
2356 
2357     /**
2358      * @inheritDoc
2359      */
2360     protected boolean syncNativeQueue(final long timeout) {
2361         XBaseWindow win = XBaseWindow.getXAWTRootWindow();
2362 
2363         if (oops_waiter == null) {
2364             oops_waiter = new XEventDispatcher() {
2365                     public void dispatchEvent(XEvent e) {
2366                         if (e.get_type() == XConstants.SelectionNotify) {
























2367                             XSelectionEvent pe = e.get_xselection();
2368                             if (pe.get_property() == oops.getAtom()) {
2369                                 oops_updated = true;
2370                                 awtLockNotifyAll();
2371                             } else if (pe.get_selection() == XAtom.get("WM_S0").getAtom() &&
2372                                        pe.get_target() == XAtom.get("VERSION").getAtom() &&
2373                                        pe.get_property() == 0 &&
2374                                        XlibWrapper.XGetSelectionOwner(getDisplay(), XAtom.get("WM_S0").getAtom()) == 0)
2375                             {
2376                                 // WM forgot to acquire selection  or there is no WM
2377                                 oops_failed = true;
2378                                 awtLockNotifyAll();
2379                             }
2380 
2381                         }
2382                     }
2383                 };
2384         }
2385 
2386         if (oops == null) {
2387             oops = XAtom.get("OOPS");
2388         }
2389 
2390         awtLock();





2391         try {
2392             addEventDispatcher(win.getWindow(), oops_waiter);
2393 
2394             oops_updated = false;
2395             oops_failed = false;
2396             // Wait for selection notify for oops on win
2397             long event_number = getEventNumber();
2398             XAtom atom = XAtom.get("WM_S0");
2399             if (eventLog.isLoggable(PlatformLogger.Level.FINER)) {
2400                 eventLog.finer("WM_S0 selection owner {0}", XlibWrapper.XGetSelectionOwner(getDisplay(), atom.getAtom()));
2401             }
2402             XlibWrapper.XConvertSelection(getDisplay(), atom.getAtom(),
2403                                           XAtom.get("VERSION").getAtom(), oops.getAtom(),
2404                                           win.getWindow(), XConstants.CurrentTime);
2405             XSync();
2406 
2407             eventLog.finer("Requested OOPS");
2408 
2409             long start = System.currentTimeMillis();
2410             while (!oops_updated && !oops_failed) {
2411                 try {
2412                     awtLockWait(timeout);
2413                 } catch (InterruptedException e) {
2414                     throw new RuntimeException(e);
2415                 }
2416                 // This "while" is a protection from spurious
2417                 // wake-ups.  However, we shouldn't wait for too long
2418                 if ((System.currentTimeMillis() - start > timeout) && timeout >= 0) {
2419                     throw new OperationTimedOut(Long.toString(System.currentTimeMillis() - start));
2420                 }
2421             }
2422             if (oops_failed && getEventNumber() - event_number == 1) {
2423                 // If selection update failed we can simply wait some time
2424                 // hoping some events will arrive
2425                 awtUnlock();
2426                 eventLog.finest("Emergency sleep");
2427                 try {
2428                     Thread.sleep(WORKAROUND_SLEEP);
2429                 } catch (InterruptedException ie) {
2430                     throw new RuntimeException(ie);
2431                 } finally {
2432                     awtLock();
2433                 }
2434             }
2435             return getEventNumber() - event_number > 2;
2436         } finally {
2437             removeEventDispatcher(win.getWindow(), oops_waiter);
2438             eventLog.finer("Exiting syncNativeQueue");
2439             awtUnlock();
2440         }
2441     }
2442     public void grab(Window w) {
2443         if (w.getPeer() != null) {
2444             ((XWindowPeer)w.getPeer()).setGrab(true);
2445         }
2446     }
2447 
2448     public void ungrab(Window w) {
2449         if (w.getPeer() != null) {
2450            ((XWindowPeer)w.getPeer()).setGrab(false);
2451         }
2452     }
2453     /**
2454      * Returns if the java.awt.Desktop class is supported on the current
2455      * desktop.




2333                  //System.out.println("XkbState:"+(xke.get_state()));
2334                  break;
2335             default:
2336                  //System.out.println("XkbEvent of xkb_type "+xkb_type);
2337                  break;
2338         }
2339     }
2340 
2341     private static long eventNumber;
2342     public static long getEventNumber() {
2343         awtLock();
2344         try {
2345             return eventNumber;
2346         } finally {
2347             awtUnlock();
2348         }
2349     }
2350 
2351     private static XEventDispatcher oops_waiter;
2352     private static boolean oops_updated;

2353     private XAtom oops;

2354 
2355     /**
2356      * @inheritDoc
2357      */
2358     protected boolean syncNativeQueue(final long timeout) {
2359         XBaseWindow win = XBaseWindow.getXAWTRootWindow();
2360 
2361         if (oops_waiter == null) {
2362             oops_waiter = new XEventDispatcher() {
2363                     public void dispatchEvent(XEvent e) {
2364                         if (e.get_type() == XConstants.SelectionRequest) {
2365                             XSelectionRequestEvent xsre = e.get_xselectionrequest();
2366                             XSelectionEvent xse = new XSelectionEvent();
2367                             try {
2368                                 xse.set_type(XConstants.SelectionNotify);
2369                                 xse.set_send_event(true);
2370                                 xse.set_requestor(xsre.get_requestor());
2371                                 xse.set_selection(xsre.get_selection());
2372                                 xse.set_target(xsre.get_target());
2373                                 xse.set_property(xsre.get_property());
2374                                 xse.set_time(xsre.get_time());
2375 
2376                                 XToolkit.awtLock();
2377                                 try {
2378                                     XlibWrapper.XSendEvent(XToolkit.getDisplay(), win.getWindow(), false,
2379                                             XConstants.NoEventMask, xse.pData);
2380                                 } finally {
2381                                     XToolkit.awtUnlock();
2382                                 }
2383                             } finally {
2384                                 xse.dispose();
2385                             }
2386 
2387                         }
2388                         else if (e.get_type() == XConstants.SelectionNotify) {
2389                             XSelectionEvent pe = e.get_xselection();
2390                             if (pe.get_property() == oops.getAtom()) {
2391                                 oops_updated = true;
2392                                 awtLockNotifyAll();








2393                             }

2394                         }
2395                     }
2396                 };
2397         }
2398 
2399         if (oops == null) {
2400             oops = XAtom.get("OOPS");
2401         }
2402 
2403         awtLock();
2404 
2405         if (XlibWrapper.XGetSelectionOwner(getDisplay(), XAtom.get("XTOOLKIT").getAtom()) == 0) {
2406             XlibWrapper.XSetSelectionOwner(getDisplay(), XAtom.get("XTOOLKIT").getAtom(), win.getWindow(), XConstants.CurrentTime);
2407         }
2408 
2409         try {
2410             addEventDispatcher(win.getWindow(), oops_waiter);
2411 
2412             oops_updated = false;

2413             // Wait for selection notify for oops on win
2414             long event_number = getEventNumber();
2415             XAtom atom = XAtom.get("XTOOLKIT");



2416             XlibWrapper.XConvertSelection(getDisplay(), atom.getAtom(),
2417                                           XAtom.get("VERSION").getAtom(), oops.getAtom(),
2418                                           win.getWindow(), XConstants.CurrentTime);
2419             XSync();
2420 
2421             eventLog.finer("Requested OOPS");
2422 
2423             long start = System.currentTimeMillis();
2424             while (!oops_updated) {
2425                 try {
2426                     awtLockWait(timeout);
2427                 } catch (InterruptedException e) {
2428                     throw new RuntimeException(e);
2429                 }
2430                 // This "while" is a protection from spurious
2431                 // wake-ups.  However, we shouldn't wait for too long
2432                 if ((System.currentTimeMillis() - start > timeout) && timeout >= 0) {
2433                     throw new OperationTimedOut(Long.toString(System.currentTimeMillis() - start));
2434                 }
2435             }
2436             return getEventNumber() - event_number > 3;













2437         } finally {
2438             removeEventDispatcher(win.getWindow(), oops_waiter);
2439             eventLog.finer("Exiting syncNativeQueue");
2440             awtUnlock();
2441         }
2442     }
2443     public void grab(Window w) {
2444         if (w.getPeer() != null) {
2445             ((XWindowPeer)w.getPeer()).setGrab(true);
2446         }
2447     }
2448 
2449     public void ungrab(Window w) {
2450         if (w.getPeer() != null) {
2451            ((XWindowPeer)w.getPeer()).setGrab(false);
2452         }
2453     }
2454     /**
2455      * Returns if the java.awt.Desktop class is supported on the current
2456      * desktop.