src/solaris/classes/sun/awt/X11/XWindow.java
Print this page
@@ -1113,11 +1113,14 @@
//
// Press event might be not processed to this time because
// (1) either XIM could not handle it or
// (2) it was Latin 1:1 mapping.
//
- XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev);
+ // Preserve modifiers to get Java key code for dead keys
+ boolean isDeadKey = isDeadKey(keysym[0]);
+ XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym[0])
+ : XKeysym.getJavaKeycode(ev);
if( jkc == null ) {
jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
}
// Take the first keysym from a keysym array associated with the XKeyevent
@@ -1139,11 +1142,11 @@
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED,
ev.get_time(),
- jkeyToReturn,
+ isDeadKey ? jkeyExtended : jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
unicodeFromPrimaryKeysym,
jkeyExtended);
@@ -1174,22 +1177,24 @@
}
handleKeyRelease(ev);
}
// un-private it if you need to call it from elsewhere
private void handleKeyRelease(XKeyEvent ev) {
- long keysym[] = new long[2];
int unicodeKey = 0;
- keysym[0] = XConstants.NoSymbol;
if (keyEventLog.isLoggable(PlatformLogger.FINE)) {
logIncomingKeyEvent( ev );
}
// Keysym should be converted to Unicode, if possible and necessary,
// and Java KeyEvent keycode should be calculated.
// For release we should post released event.
//
- XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev);
+ // Preserve modifiers to get Java key code for dead keys
+ long keysym = xkeycodeToKeysym(ev);
+ boolean isDeadKey = isDeadKey(keysym);
+ XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym)
+ : XKeysym.getJavaKeycode(ev);
if( jkc == null ) {
jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
}
if (keyEventLog.isLoggable(PlatformLogger.FINE)) {
keyEventLog.fine(">>>Fire Event:"+
@@ -1217,20 +1222,25 @@
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED,
ev.get_time(),
- jkeyToReturn,
+ isDeadKey ? jkeyExtended : jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
unicodeFromPrimaryKeysym,
jkeyExtended);
}
+
+ private boolean isDeadKey(long keysym){
+ return XKeySymConstants.XK_dead_grave <= keysym && keysym <= XKeySymConstants.XK_dead_semivoiced_sound;
+ }
+
/*
* XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are
* unreliable, since mapping changes can happen for a virtual desktop
* switch or MacOS style shading that became quite popular under X as
* well. Yes, it probably should not be this way, as it violates