JBR-2669: set unicode for both keyCode and extendedKeyCode

(cherry picked from commit ba3f14c83a)
This commit is contained in:
Denis Konoplev
2020-08-19 21:56:40 +03:00
committed by alexey.ushakov@jetbrains.com
parent 3bd74e0999
commit ad932992f9

View File

@@ -58,6 +58,7 @@ import sun.awt.PeerEvent;
import sun.awt.SunToolkit;
import sun.awt.X11ComponentPeer;
import sun.awt.X11GraphicsConfig;
import sun.awt.event.KeyEventProcessing;
import sun.awt.event.TouchEvent;
import sun.java2d.SunGraphics2D;
import sun.java2d.SurfaceData;
@@ -1225,6 +1226,12 @@ class XWindow extends XBaseWindow implements X11ComponentPeer {
return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0);
//return (uni > 0? uni + 0x01000000 : 0);
}
// java keycodes for unicode values consistent with MacOS and Windows
private static int addUnicodeOffset(int uni) {
return uni > 0 ? uni + 0x01000000 : 0;
}
void logIncomingKeyEvent(XKeyEvent ev) {
if (keyEventLog.isLoggable(PlatformLogger.Level.FINE)) {
keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev);
@@ -1313,17 +1320,18 @@ class XWindow extends XBaseWindow implements X11ComponentPeer {
);
}
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
int jkeyToReturn;
if (KeyEventProcessing.useNationalLayouts) {
// if jkeyToReturn is VK_UNDEFINED then look for keycode in extended key code
jkeyToReturn = jkc.getJavaKeycode();
jkeyToReturn = getNationalKeyCode(jkc, unicodeFromPrimaryKeysym);
jkeyExtended = jkeyToReturn;
} else {
jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
}
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED,
isDeadKey ? jkeyExtended : jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
@@ -1402,16 +1410,18 @@ class XWindow extends XBaseWindow implements X11ComponentPeer {
// is undefined, we still will have a guess of what was engraved on a keytop.
int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0);
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
int jkeyToReturn;
if (KeyEventProcessing.useNationalLayouts) {
// if jkeyToReturn is VK_UNDEFINED then look for keycode in extended key code
jkeyToReturn = jkc.getJavaKeycode();
jkeyToReturn = getNationalKeyCode(jkc, unicodeFromPrimaryKeysym);
jkeyExtended = jkeyToReturn;
} else {
jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
}
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED,
isDeadKey ? jkeyExtended : jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
@@ -1423,6 +1433,14 @@ class XWindow extends XBaseWindow implements X11ComponentPeer {
}
private static int getNationalKeyCode(XKeysym.Keysym2JavaKeycode jkc, int unicodeFromPrimaryKeysym) {
// use this key code for both keyCode and extendedKeyCode
// compatible with MacOS and Windows
return jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
addUnicodeOffset(unicodeFromPrimaryKeysym) :
jkc.getJavaKeycode();
}
private boolean isDeadKey(long keysym){
return XKeySymConstants.XK_dead_grave <= keysym && keysym <= XKeySymConstants.XK_dead_semivoiced_sound;