52 import sun.awt.*; |
52 import sun.awt.*; |
53 import sun.font.FontManager; |
53 import sun.font.FontManager; |
54 import sun.misc.PerformanceLogger; |
54 import sun.misc.PerformanceLogger; |
55 import sun.print.PrintJob2D; |
55 import sun.print.PrintJob2D; |
56 |
56 |
57 public final class XToolkit extends UNIXToolkit implements Runnable, XConstants |
57 public final class XToolkit extends UNIXToolkit implements Runnable { |
58 { |
|
59 private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit"); |
58 private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit"); |
60 private static Logger eventLog = Logger.getLogger("sun.awt.X11.event.XToolkit"); |
59 private static Logger eventLog = Logger.getLogger("sun.awt.X11.event.XToolkit"); |
61 private static final Logger timeoutTaskLog = Logger.getLogger("sun.awt.X11.timeoutTask.XToolkit"); |
60 private static final Logger timeoutTaskLog = Logger.getLogger("sun.awt.X11.timeoutTask.XToolkit"); |
62 private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XToolkit"); |
61 private static Logger keyEventLog = Logger.getLogger("sun.awt.X11.kye.XToolkit"); |
63 private static final Logger backingStoreLog = Logger.getLogger("sun.awt.X11.backingStore.XToolkit"); |
62 private static final Logger backingStoreLog = Logger.getLogger("sun.awt.X11.backingStore.XToolkit"); |
167 * BadWindow error. |
166 * BadWindow error. |
168 */ |
167 */ |
169 static XErrorHandler IgnoreBadWindowHandler = new XErrorHandler() { |
168 static XErrorHandler IgnoreBadWindowHandler = new XErrorHandler() { |
170 public int handleError(long display, XErrorEvent err) { |
169 public int handleError(long display, XErrorEvent err) { |
171 XERROR_SAVE(err); |
170 XERROR_SAVE(err); |
172 if (err.get_error_code() == BadWindow) { |
171 if (err.get_error_code() == XConstants.BadWindow) { |
173 return 0; |
172 return 0; |
174 } else { |
173 } else { |
175 return SAVED_ERROR_HANDLER(display, err); |
174 return SAVED_ERROR_HANDLER(display, err); |
176 } |
175 } |
177 } |
176 } |
423 |
422 |
424 private void processGlobalMotionEvent(XEvent e) { |
423 private void processGlobalMotionEvent(XEvent e) { |
425 // Only our windows guaranteely generate MotionNotify, so we |
424 // Only our windows guaranteely generate MotionNotify, so we |
426 // should track enter/leave, to catch the moment when to |
425 // should track enter/leave, to catch the moment when to |
427 // switch to XQueryPointer |
426 // switch to XQueryPointer |
428 if (e.get_type() == MotionNotify) { |
427 if (e.get_type() == XConstants.MotionNotify) { |
429 XMotionEvent ev = e.get_xmotion(); |
428 XMotionEvent ev = e.get_xmotion(); |
430 awtLock(); |
429 awtLock(); |
431 try { |
430 try { |
432 if (lastCursorPos == null) { |
431 if (lastCursorPos == null) { |
433 lastCursorPos = new Point(ev.get_x_root(), ev.get_y_root()); |
432 lastCursorPos = new Point(ev.get_x_root(), ev.get_y_root()); |
435 lastCursorPos.setLocation(ev.get_x_root(), ev.get_y_root()); |
434 lastCursorPos.setLocation(ev.get_x_root(), ev.get_y_root()); |
436 } |
435 } |
437 } finally { |
436 } finally { |
438 awtUnlock(); |
437 awtUnlock(); |
439 } |
438 } |
440 } else if (e.get_type() == LeaveNotify) { |
439 } else if (e.get_type() == XConstants.LeaveNotify) { |
441 // Leave from our window |
440 // Leave from our window |
442 awtLock(); |
441 awtLock(); |
443 try { |
442 try { |
444 lastCursorPos = null; |
443 lastCursorPos = null; |
445 } finally { |
444 } finally { |
446 awtUnlock(); |
445 awtUnlock(); |
447 } |
446 } |
448 } else if (e.get_type() == EnterNotify) { |
447 } else if (e.get_type() == XConstants.EnterNotify) { |
449 // Entrance into our window |
448 // Entrance into our window |
450 XCrossingEvent ev = e.get_xcrossing(); |
449 XCrossingEvent ev = e.get_xcrossing(); |
451 awtLock(); |
450 awtLock(); |
452 try { |
451 try { |
453 if (lastCursorPos == null) { |
452 if (lastCursorPos == null) { |
490 |
489 |
491 private void dispatchEvent(XEvent ev) { |
490 private void dispatchEvent(XEvent ev) { |
492 final XAnyEvent xany = ev.get_xany(); |
491 final XAnyEvent xany = ev.get_xany(); |
493 |
492 |
494 if (windowToXWindow(xany.get_window()) != null && |
493 if (windowToXWindow(xany.get_window()) != null && |
495 (ev.get_type() == MotionNotify || ev.get_type() == EnterNotify || ev.get_type() == LeaveNotify)) |
494 (ev.get_type() == XConstants.MotionNotify || ev.get_type() == XConstants.EnterNotify || ev.get_type() == XConstants.LeaveNotify)) |
496 { |
495 { |
497 processGlobalMotionEvent(ev); |
496 processGlobalMotionEvent(ev); |
498 } |
497 } |
499 |
498 |
500 XBaseWindow.dispatchToWindow(ev); |
499 XBaseWindow.dispatchToWindow(ev); |
547 } else { |
546 } else { |
548 callTimeoutTasks(); |
547 callTimeoutTasks(); |
549 // If no events are queued, waitForEvents() causes calls to |
548 // If no events are queued, waitForEvents() causes calls to |
550 // awtUnlock(), awtJNI_ThreadYield, poll, awtLock(), |
549 // awtUnlock(), awtJNI_ThreadYield, poll, awtLock(), |
551 // so it spends most of its time in poll, without holding the lock. |
550 // so it spends most of its time in poll, without holding the lock. |
552 while ((XlibWrapper.XEventsQueued(getDisplay(), XlibWrapper.QueuedAfterReading) == 0) && |
551 while ((XlibWrapper.XEventsQueued(getDisplay(), XConstants.QueuedAfterReading) == 0) && |
553 (XlibWrapper.XEventsQueued(getDisplay(), XlibWrapper.QueuedAfterFlush) == 0)) { |
552 (XlibWrapper.XEventsQueued(getDisplay(), XConstants.QueuedAfterFlush) == 0)) { |
554 callTimeoutTasks(); |
553 callTimeoutTasks(); |
555 waitForEvents(getNextTaskTime()); |
554 waitForEvents(getNextTaskTime()); |
556 } |
555 } |
557 XlibWrapper.XNextEvent(getDisplay(),ev.pData); |
556 XlibWrapper.XNextEvent(getDisplay(),ev.pData); |
558 } |
557 } |
559 |
558 |
560 if (ev.get_type() != NoExpose) { |
559 if (ev.get_type() != XConstants.NoExpose) { |
561 eventNumber++; |
560 eventNumber++; |
562 } |
561 } |
563 |
562 |
564 if (XDropTargetEventProcessor.processEvent(ev) || |
563 if (XDropTargetEventProcessor.processEvent(ev) || |
565 XDragSourceContextPeer.processEvent(ev)) { |
564 XDragSourceContextPeer.processEvent(ev)) { |
580 if (ownerWindow != null) { |
579 if (ownerWindow != null) { |
581 w = ownerWindow.getContentWindow(); |
580 w = ownerWindow.getContentWindow(); |
582 } |
581 } |
583 } |
582 } |
584 } |
583 } |
585 if( keyEventLog.isLoggable(Level.FINE) && (ev.get_type() == KeyPress || ev.get_type() == KeyRelease) ) { |
584 if( keyEventLog.isLoggable(Level.FINE) && (ev.get_type() == XConstants.KeyPress || ev.get_type() == XConstants.KeyRelease) ) { |
586 keyEventLog.fine("before XFilterEvent:"+ev); |
585 keyEventLog.fine("before XFilterEvent:"+ev); |
587 } |
586 } |
588 if (XlibWrapper.XFilterEvent(ev.getPData(), w)) { |
587 if (XlibWrapper.XFilterEvent(ev.getPData(), w)) { |
589 continue; |
588 continue; |
590 } |
589 } |
591 if( keyEventLog.isLoggable(Level.FINE) && (ev.get_type() == KeyPress || ev.get_type() == KeyRelease) ) { |
590 if( keyEventLog.isLoggable(Level.FINE) && (ev.get_type() == XConstants.KeyPress || ev.get_type() == XConstants.KeyRelease) ) { |
592 keyEventLog.fine("after XFilterEvent:"+ev); // IS THIS CORRECT? |
591 keyEventLog.fine("after XFilterEvent:"+ev); // IS THIS CORRECT? |
593 } |
592 } |
594 |
593 |
595 dispatchEvent(ev); |
594 dispatchEvent(ev); |
596 } catch (ThreadDeath td) { |
595 } catch (ThreadDeath td) { |
748 * Note that most of the modern window managers unmap |
747 * Note that most of the modern window managers unmap |
749 * application window if it is iconified. Thus, any |
748 * application window if it is iconified. Thus, any |
750 * _NET_WM_STRUT[_PARTIAL] hints for iconified windows |
749 * _NET_WM_STRUT[_PARTIAL] hints for iconified windows |
751 * are not included to the screen insets. |
750 * are not included to the screen insets. |
752 */ |
751 */ |
753 if (XlibUtil.getWindowMapState(window) == XlibWrapper.IsUnmapped) |
752 if (XlibUtil.getWindowMapState(window) == XConstants.IsUnmapped) |
754 { |
753 { |
755 continue; |
754 continue; |
756 } |
755 } |
757 |
756 |
758 long native_ptr = Native.allocateLongArray(4); |
757 long native_ptr = Native.allocateLongArray(4); |
1287 |
1286 |
1288 private static final XEventDispatcher timeFetcher = |
1287 private static final XEventDispatcher timeFetcher = |
1289 new XEventDispatcher() { |
1288 new XEventDispatcher() { |
1290 public void dispatchEvent(XEvent ev) { |
1289 public void dispatchEvent(XEvent ev) { |
1291 switch (ev.get_type()) { |
1290 switch (ev.get_type()) { |
1292 case PropertyNotify: |
1291 case XConstants.PropertyNotify: |
1293 XPropertyEvent xpe = ev.get_xproperty(); |
1292 XPropertyEvent xpe = ev.get_xproperty(); |
1294 |
1293 |
1295 awtLock(); |
1294 awtLock(); |
1296 try { |
1295 try { |
1297 timeStamp = xpe.get_time(); |
1296 timeStamp = xpe.get_time(); |
1320 } |
1319 } |
1321 timeStampUpdated = false; |
1320 timeStampUpdated = false; |
1322 XlibWrapper.XChangeProperty(XToolkit.getDisplay(), |
1321 XlibWrapper.XChangeProperty(XToolkit.getDisplay(), |
1323 XBaseWindow.getXAWTRootWindow().getWindow(), |
1322 XBaseWindow.getXAWTRootWindow().getWindow(), |
1324 _XA_JAVA_TIME_PROPERTY_ATOM.getAtom(), XAtom.XA_ATOM, 32, |
1323 _XA_JAVA_TIME_PROPERTY_ATOM.getAtom(), XAtom.XA_ATOM, 32, |
1325 PropModeAppend, |
1324 XConstants.PropModeAppend, |
1326 0, 0); |
1325 0, 0); |
1327 XlibWrapper.XFlush(XToolkit.getDisplay()); |
1326 XlibWrapper.XFlush(XToolkit.getDisplay()); |
1328 |
1327 |
1329 if (isToolkitThread()) { |
1328 if (isToolkitThread()) { |
1330 XEvent event = new XEvent(); |
1329 XEvent event = new XEvent(); |
1537 final int numLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Num_Lock); |
1536 final int numLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Num_Lock); |
1538 final int modeSwitch = keysymToPrimaryKeycode(XKeySymConstants.XK_Mode_switch); |
1537 final int modeSwitch = keysymToPrimaryKeycode(XKeySymConstants.XK_Mode_switch); |
1539 final int shiftLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Shift_Lock); |
1538 final int shiftLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Shift_Lock); |
1540 final int capsLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Caps_Lock); |
1539 final int capsLock = keysymToPrimaryKeycode(XKeySymConstants.XK_Caps_Lock); |
1541 |
1540 |
1542 final int modmask[] = { ShiftMask, LockMask, ControlMask, Mod1Mask, |
1541 final int modmask[] = { XConstants.ShiftMask, XConstants.LockMask, XConstants.ControlMask, XConstants.Mod1Mask, |
1543 Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; |
1542 XConstants.Mod2Mask, XConstants.Mod3Mask, XConstants.Mod4Mask, XConstants.Mod5Mask }; |
1544 |
1543 |
1545 log.fine("In setupModifierMap"); |
1544 log.fine("In setupModifierMap"); |
1546 awtLock(); |
1545 awtLock(); |
1547 try { |
1546 try { |
1548 XModifierKeymap modmap = new XModifierKeymap( |
1547 XModifierKeymap modmap = new XModifierKeymap( |
2045 XBaseWindow win = XBaseWindow.getXAWTRootWindow(); |
2044 XBaseWindow win = XBaseWindow.getXAWTRootWindow(); |
2046 |
2045 |
2047 if (oops_waiter == null) { |
2046 if (oops_waiter == null) { |
2048 oops_waiter = new XEventDispatcher() { |
2047 oops_waiter = new XEventDispatcher() { |
2049 public void dispatchEvent(XEvent e) { |
2048 public void dispatchEvent(XEvent e) { |
2050 if (e.get_type() == SelectionNotify) { |
2049 if (e.get_type() == XConstants.SelectionNotify) { |
2051 XSelectionEvent pe = e.get_xselection(); |
2050 XSelectionEvent pe = e.get_xselection(); |
2052 if (pe.get_property() == oops.getAtom()) { |
2051 if (pe.get_property() == oops.getAtom()) { |
2053 oops_updated = true; |
2052 oops_updated = true; |
2054 awtLockNotifyAll(); |
2053 awtLockNotifyAll(); |
2055 } else if (pe.get_selection() == XAtom.get("WM_S0").getAtom() && |
2054 } else if (pe.get_selection() == XAtom.get("WM_S0").getAtom() && |
2081 long event_number = getEventNumber(); |
2080 long event_number = getEventNumber(); |
2082 XAtom atom = XAtom.get("WM_S0"); |
2081 XAtom atom = XAtom.get("WM_S0"); |
2083 eventLog.log(Level.FINER, "WM_S0 selection owner {0}", new Object[] {XlibWrapper.XGetSelectionOwner(getDisplay(), atom.getAtom())}); |
2082 eventLog.log(Level.FINER, "WM_S0 selection owner {0}", new Object[] {XlibWrapper.XGetSelectionOwner(getDisplay(), atom.getAtom())}); |
2084 XlibWrapper.XConvertSelection(getDisplay(), atom.getAtom(), |
2083 XlibWrapper.XConvertSelection(getDisplay(), atom.getAtom(), |
2085 XAtom.get("VERSION").getAtom(), oops.getAtom(), |
2084 XAtom.get("VERSION").getAtom(), oops.getAtom(), |
2086 win.getWindow(), XlibWrapper.CurrentTime); |
2085 win.getWindow(), XConstants.CurrentTime); |
2087 XSync(); |
2086 XSync(); |
2088 |
2087 |
2089 |
2088 |
2090 eventLog.finer("Requested OOPS"); |
2089 eventLog.finer("Requested OOPS"); |
2091 |
2090 |