diff options
Diffstat (limited to 'src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java')
-rw-r--r-- | src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java b/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java index e2594b3e8ac..2d57707f465 100644 --- a/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java +++ b/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java @@ -1016,11 +1016,22 @@ public final class XToolkit extends UNIXToolkit implements Runnable { final boolean isKeyEvent = ( (ev.get_type() == XConstants.KeyPress) || (ev.get_type() == XConstants.KeyRelease) ); + final long keyEventSerial = isKeyEvent ? ev.get_xkey().get_serial() : -1; + if (keyEventLog.isLoggable(PlatformLogger.Level.FINE) && isKeyEvent) { keyEventLog.fine("before XFilterEvent:" + ev); } if (XlibWrapper.XFilterEvent(ev.getPData(), w)) { if (isKeyEvent) { + if (keyEventLog.isLoggable(PlatformLogger.Level.FINE)) { + keyEventLog.fine( + "Setting lastFilteredKeyEventSerial=={0} to {1}", + lastFilteredKeyEventSerial, keyEventSerial + ); + } + lastFilteredKeyEventSerial = keyEventSerial; + + XInputMethod.delayAllXICDestroyUntilAFurtherNotice(); XInputMethod.onXKeyEventFiltering(true); } continue; @@ -1032,6 +1043,14 @@ public final class XToolkit extends UNIXToolkit implements Runnable { if (isKeyEvent) { XInputMethod.onXKeyEventFiltering(false); + if (keyEventSerial == lastFilteredKeyEventSerial) { + // JBR-6456: Sudden keyboard death on Linux using iBus. + // If more than 1 key events are being processed by iBus + // (i.e. more than one in a row calls of XFilterEvent(...) with instances of XKeyEvent have + // returned true), + // we have to postpone destroying until the very last one is completely processed) + XInputMethod.delayedXICDestroyShouldBeDone(); + } } dispatchEvent(ev); @@ -1052,6 +1071,15 @@ public final class XToolkit extends UNIXToolkit implements Runnable { } } + + // JBR-6456: Sudden keyboard death on Linux using iBus. + // The field holds the value of sun.awt.X11.XKeyEvent#get_serial of the last key event, which + // XFilterEvent(...) returned True for. + // See the usages of the variable for more info. + // See sun.awt.X11.XInputMethod#disposeXIC for the detailed explanation of the whole fix. + private long lastFilteredKeyEventSerial = -1; + + /** * Listener installed to detect display changes. */ |