aboutsummaryrefslogtreecommitdiff
path: root/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java
diff options
context:
space:
mode:
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.java28
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.
*/