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. |