mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 09:29:38 +01:00
JBR-4990: Fix regression tests for national keyboard layouts on macOS
(cherry picked from commit 5835150f63)
This commit is contained in:
@@ -474,6 +474,8 @@ static NSDictionary* getUnicharToVkCodeDictionary() {
|
||||
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_QUOTEDBL], @"\"",
|
||||
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_EXCLAMATION_MARK], @"!",
|
||||
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_LESS], @"<",
|
||||
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_INVERTED_EXCLAMATION_MARK], @"\u00a1",
|
||||
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_DOLLAR], @"$",
|
||||
nil
|
||||
];
|
||||
// This is ok to retain a singleton object
|
||||
|
||||
@@ -161,6 +161,14 @@ public class ExtendedKeyCodes {
|
||||
regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
|
||||
regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
|
||||
|
||||
// Some key codes are commented out.
|
||||
// They are uppercase versions of lowercase latin letters already present in this key code set.
|
||||
// This makes key codes consistent with what we see in the events from the OS.
|
||||
//
|
||||
// For example, the VK_SEMICOLON key on the German keyboard layout is the letter O umlaut
|
||||
// when it is pressed, key code equals 0x01000000+0x00F6, but in the upstream OpenJDK,
|
||||
// the key code returned by getExtendedKeyCodeForChar equals 0x01000000+0x00D6
|
||||
|
||||
extendedKeyCodesSet.add(0x01000000+0x0060);
|
||||
extendedKeyCodesSet.add(0x01000000+0x007C);
|
||||
extendedKeyCodesSet.add(0x01000000+0x007E);
|
||||
@@ -185,14 +193,14 @@ public class ExtendedKeyCodes {
|
||||
extendedKeyCodesSet.add(0x01000000+0x00BD);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00BE);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00BF);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00C4);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00C5);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00C6);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00C7);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00D1);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00D6);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00C4);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00C5);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00C6);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00C7);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00D1);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00D6);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00D7);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00D8);
|
||||
// extendedKeyCodesSet.add(0x01000000+0x00D8);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00DF);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00E0);
|
||||
extendedKeyCodesSet.add(0x01000000+0x00E1);
|
||||
|
||||
@@ -25,7 +25,6 @@ import java.awt.event.KeyEvent;
|
||||
import java.util.HashMap;
|
||||
|
||||
import static java.awt.event.KeyEvent.*;
|
||||
import static sun.awt.event.KeyEvent.*; /* comment this line to compile with jbrsdk8 */
|
||||
|
||||
/*
|
||||
* Class containing common key functionality
|
||||
@@ -61,11 +60,7 @@ public class Key {
|
||||
int getKeyCode() {
|
||||
KeyChar keyChar = mappedKeyChars.getKeyChar();
|
||||
char ch = keyChar.getChar();
|
||||
if (latinKeyCodesMap.containsKey(ch)) {
|
||||
// TODO Fix this in jbruntime
|
||||
// KeyEvent.getExtendedKeyCodeForChar(ch) does not return corresponding VK_ constant for non-English keys
|
||||
return latinKeyCodesMap.get(ch);
|
||||
} else if (keyChar.isDead() && deadKeyCodesMap.containsKey(ch)) {
|
||||
if (keyChar.isDead() && deadKeyCodesMap.containsKey(ch)) {
|
||||
// KeyEvent.getExtendedKeyCodeForChar(ch) does not return corresponding VK_ constant for dead keys
|
||||
return deadKeyCodesMap.get(ch);
|
||||
} else {
|
||||
@@ -98,49 +93,6 @@ public class Key {
|
||||
return mappedKeyChars.getKeyChar(modifier).isDead();
|
||||
}
|
||||
|
||||
// TODO Remove this map when KeyEvent.getExtendedKeyCodeForChar(ch) is fixed for latin keys in jbruntime
|
||||
// Map storing latin chars and corresponding VK_ codes
|
||||
private static final HashMap<Character, Integer> latinKeyCodesMap = new HashMap<Character, Integer>() {
|
||||
{
|
||||
// Please see:
|
||||
// jbruntime/src/java.desktop/share/classes/sun/awt/event/KeyEvent.java
|
||||
|
||||
put((char) 0x00DF, VK_ESZETT);
|
||||
put((char) 0x00E0, VK_A_WITH_GRAVE);
|
||||
put((char) 0x00E1, VK_A_WITH_ACUTE);
|
||||
put((char) 0x00E2, VK_A_WITH_CIRCUMFLEX);
|
||||
put((char) 0x00E3, VK_A_WITH_TILDE);
|
||||
put((char) 0x00E4, VK_A_WITH_DIAERESIS);
|
||||
put((char) 0x00E5, VK_A_WITH_RING_ABOVE);
|
||||
put((char) 0x00E6, VK_AE);
|
||||
put((char) 0x00E7, VK_C_WITH_CEDILLA);
|
||||
put((char) 0x00E8, VK_E_WITH_GRAVE);
|
||||
put((char) 0x00E9, VK_E_WITH_ACUTE);
|
||||
put((char) 0x00EA, VK_E_WITH_CIRCUMFLEX);
|
||||
put((char) 0x00EB, VK_E_WITH_DIAERESIS);
|
||||
put((char) 0x00EC, VK_I_WITH_GRAVE);
|
||||
put((char) 0x00ED, VK_I_WITH_GRAVE);
|
||||
put((char) 0x00EE, VK_I_WITH_CIRCUMFLEX);
|
||||
put((char) 0x00EF, VK_I_WITH_DIAERESIS);
|
||||
put((char) 0x00F0, VK_ETH);
|
||||
put((char) 0x00F1, VK_N_WITH_TILDE);
|
||||
put((char) 0x00F2, VK_O_WITH_GRAVE);
|
||||
put((char) 0x00F3, VK_O_WITH_ACUTE);
|
||||
put((char) 0x00F4, VK_O_WITH_CIRCUMFLEX);
|
||||
put((char) 0x00F5, VK_O_WITH_TILDE);
|
||||
put((char) 0x00F6, VK_O_WITH_DIAERESIS);
|
||||
put((char) 0x00F7, VK_DIVISION_SIGN);
|
||||
put((char) 0x00F8, VK_O_WITH_SLASH);
|
||||
put((char) 0x00F9, VK_U_WITH_GRAVE);
|
||||
put((char) 0x00FA, VK_U_WITH_ACUTE);
|
||||
put((char) 0x00FB, VK_U_WITH_CIRCUMFLEX);
|
||||
put((char) 0x00FC, VK_U_WITH_DIAERESIS);
|
||||
put((char) 0x00FD, VK_Y_WITH_ACUTE);
|
||||
put((char) 0x00FE, VK_THORN);
|
||||
put((char) 0x00FF, VK_Y_WITH_DIAERESIS);
|
||||
}
|
||||
};
|
||||
|
||||
// Map storing possible dead key chars and corresponding VK_ codes
|
||||
private static final HashMap<Character, Integer> deadKeyCodesMap = new HashMap<Character, Integer>() {
|
||||
{
|
||||
@@ -174,4 +126,9 @@ public class Key {
|
||||
put((char) 0x309C, VK_DEAD_SEMIVOICED_SOUND);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.vkName;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
* Enumerates keys under test for com.apple.keylayout.German (macOS 10.14.5)
|
||||
*/
|
||||
public enum Layout_GERMAN implements LayoutKey {
|
||||
|
||||
// Enum name must be the same as KeyEvent.VK_ constant name corresponding to the key on US keyboard layout
|
||||
// Note that '\u0000' may be used if no char is mapped to a key + modifier or if one wants to skip its testing
|
||||
|
||||
|
||||
@@ -32,7 +32,8 @@ import java.util.stream.Collectors;
|
||||
public enum Modifier {
|
||||
|
||||
E(),
|
||||
//A(KeyEvent.VK_ALT),
|
||||
A(KeyEvent.VK_ALT),
|
||||
// TODO: uncomment the following line this once JBR-3860 is fixed
|
||||
//S(KeyEvent.VK_SHIFT),
|
||||
//SA(KeyEvent.VK_SHIFT, KeyEvent.VK_ALT),
|
||||
|
||||
@@ -112,4 +113,18 @@ public enum Modifier {
|
||||
}
|
||||
return Arrays.stream(modifiers).boxed().map(i -> KeyEvent.getKeyText(i)).collect(Collectors.joining(" "));
|
||||
}
|
||||
|
||||
public String toPlaintextString() {
|
||||
if (modifiers.length == 0) {
|
||||
return "no";
|
||||
}
|
||||
|
||||
var result = new StringBuilder();
|
||||
var list = Arrays.stream(modifiers).boxed().toList();
|
||||
if (list.contains(KeyEvent.VK_CONTROL)) result.append("Control");
|
||||
if (list.contains(KeyEvent.VK_ALT)) result.append("Option");
|
||||
if (list.contains(KeyEvent.VK_SHIFT)) result.append("Shift");
|
||||
if (list.contains(KeyEvent.VK_META)) result.append("Command");
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -390,6 +390,7 @@ public class NationalLayoutTest {
|
||||
|
||||
// Go over all keys defined for the layout
|
||||
for(LayoutKey layoutKey : layout.getLayoutKeys()) {
|
||||
System.err.printf("KEYPRESS: key=%s, modifier=%s\n", layoutKey.getKey(), modifier.toPlaintextString());
|
||||
|
||||
// Clean up synchronized lists which store pressed key codes and typed chars
|
||||
keysPressed = new CopyOnWriteArrayList();
|
||||
@@ -399,6 +400,11 @@ public class NationalLayoutTest {
|
||||
// Get Key object from LayoutKey enum
|
||||
Key key = layoutKey.getKey();
|
||||
|
||||
if (key.isDead() || key.isDead(modifier)) {
|
||||
// TODO: Disable skipping testing dead keys once they work properly on macOS
|
||||
continue;
|
||||
}
|
||||
|
||||
// Obtain the key code for the current layout
|
||||
int keyCode = key.getKeyCode();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user