jdk/src/solaris/classes/sun/awt/X11/XToolkit.java
changeset 439 3488710b02f8
parent 107 ed0c7cfb3666
child 1190 f27065d0d9f0
child 1969 07500c30ab46
equal deleted inserted replaced
438:2ae294e4518c 439:3488710b02f8
    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