Compare commits

...

1 Commits
v1.2.0 ... 1031

Author SHA1 Message Date
Vitaly Provodin
26d2443d5f Revert "IDEA-242347: Remove redundant conversion for Latin unicode"
This reverts commit 5017e2e3
2020-08-08 10:58:42 +07:00
3 changed files with 182 additions and 39 deletions

View File

@@ -446,13 +446,53 @@ static unichar NsGetDeadKeyChar(unsigned short keyCode)
return 0;
}
static const int UNICODE_OFFSET = 0x01000000;
static NSDictionary* getDiacriticUnicharToVkCodeDictionary() {
static BOOL isLatinUnicode(unichar ch) {
// Latin-1 Supplement 0x0080 - 0x00FF
// Latin Extended-A 0x0100 - 0x017F
// Latin Extended-B 0x0180 - 0x024F
return 0x0080 <= ch && ch <= 0x024F;
static NSDictionary* diacriticUnicharToVkCodeDictionary = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
diacriticUnicharToVkCodeDictionary =
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_GRAVE], @"à",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_ACUTE], @"á",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_CIRCUMFLEX], @"â",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_TILDE], @"ã",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_DIAERESIS], @"ä",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_A_WITH_RING_ABOVE], @"å",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_AE], @"æ",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_C_WITH_CEDILLA], @"ç",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_E_WITH_GRAVE], @"è",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_E_WITH_ACUTE], @"é",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_E_WITH_CIRCUMFLEX], @"ê",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_E_WITH_DIAERESIS], @"ë",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_I_WITH_GRAVE], @"ì",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_I_WITH_ACUTE], @"í",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_I_WITH_CIRCUMFLEX], @"î",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_I_WITH_DIAERESIS], @"ï",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_ETH], @"ð",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_N_WITH_TILDE], @"ñ",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_GRAVE], @"ò",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_ACUTE], @"ó",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_CIRCUMFLEX], @"ô",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_TILDE], @"õ",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_DIAERESIS], @"ö",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_DIVISION_SIGN], @"÷",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_O_WITH_SLASH], @"ø",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_U_WITH_GRAVE], @"ù",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_U_WITH_ACUTE], @"ú",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_U_WITH_CIRCUMFLEX], @"û",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_U_WITH_DIAERESIS], @"ü",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_Y_WITH_ACUTE], @"ý",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_THORN], @"þ",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_Y_WITH_DIAERESIS], @"ÿ",
[NSNumber numberWithInt:sun_awt_event_KeyEvent_VK_ESZETT], @"ß",
nil
];
// This is ok to retain a singleton object
[diacriticUnicharToVkCodeDictionary retain];
});
return diacriticUnicharToVkCodeDictionary;
}
static NSDictionary* getUnicharToVkCodeDictionary() {
@@ -485,19 +525,10 @@ static NSDictionary* getUnicharToVkCodeDictionary() {
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_COMMA], @",",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_SLASH], @"/",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_PERIOD], @".",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_ASTERISK], @"*",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_PLUS], @"+",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_MULTIPLY], @"*",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_ADD], @"+",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_COMMA], @",",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_NUMBER_SIGN], @"#",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_DOLLAR], @"$",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_CIRCUMFLEX], @"^",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_LEFT_PARENTHESIS], @"(",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_RIGHT_PARENTHESIS], @")",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_UNDERSCORE], @"_",
[NSNumber numberWithInt:java_awt_event_KeyEvent_VK_AMPERSAND], @"&",
[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], @"<",
nil
];
// This is ok to retain a singleton object
@@ -583,21 +614,17 @@ NsCharToJavaVirtualKeyCode(unichar ch, BOOL isDeadChar,
if ([[NSCharacterSet punctuationCharacterSet] characterIsMember:ch] ||
[[NSCharacterSet symbolCharacterSet] characterIsMember:ch])
{
// punctuationCharacterSet and symbolCharacterSet are too big
// to store them all in UnicharToVkCodeDictionary
int tmpKeyCode = [[unicharToVkCodeDictionary objectForKey:[NSString stringWithFormat:@"%C",ch]] intValue];
if (tmpKeyCode != 0) {
*keyCode = tmpKeyCode;
// we cannot find key location from a char, so let's use key code
*postsTyped = YES;
*keyLocation = keyTable[key].javaKeyLocation;
return;
}
*keyCode = [[unicharToVkCodeDictionary objectForKey:[NSString stringWithFormat:@"%C",ch]] intValue];
// we cannot find key location from a char, so let's use key code
*postsTyped = YES;
*keyLocation = keyTable[key].javaKeyLocation;
return;
}
// Latin-1 suplement & Latin Extended A & B
if (isLatinUnicode(ch)) {
*keyCode = ((int) ch) + UNICODE_OFFSET;
NSDictionary* diacriticUnicharToVkCodeDictionary = getDiacriticUnicharToVkCodeDictionary();
NSNumber * jkc = [diacriticUnicharToVkCodeDictionary objectForKey:[NSString stringWithFormat:@"%C",ch]];
if (jkc != nil) {
*keyCode = [jkc intValue];
// we cannot find key location from a char, so let's use key code
*postsTyped = YES;
*keyLocation = keyTable[key].javaKeyLocation;

View File

@@ -0,0 +1,76 @@
package sun.awt.event;
import java.lang.annotation.Native;
public class KeyEvent {
/** */
@Native
public static final int START_OF_LATIN_DIACRITIC_LETTERS = 0x01000000;
/** */
public static final int VK_ESZETT = START_OF_LATIN_DIACRITIC_LETTERS + 0xDF;
/** */
public static final int VK_A_WITH_GRAVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE0;
/** */
public static final int VK_A_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE1;
/** */
public static final int VK_A_WITH_CIRCUMFLEX = START_OF_LATIN_DIACRITIC_LETTERS + 0xE2;
/** */
public static final int VK_A_WITH_TILDE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE3;
/** */
public static final int VK_A_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xE4;
/** */
public static final int VK_A_WITH_RING_ABOVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE5;
/** */
public static final int VK_AE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE6;
/** */
public static final int VK_C_WITH_CEDILLA = START_OF_LATIN_DIACRITIC_LETTERS + 0xE7;
/** */
public static final int VK_E_WITH_GRAVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE8;
/** */
public static final int VK_E_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xE9;
/** */
public static final int VK_E_WITH_CIRCUMFLEX = START_OF_LATIN_DIACRITIC_LETTERS + 0xEA;
/** */
public static final int VK_E_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xEB;
/** */
public static final int VK_I_WITH_GRAVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xEC;
/** */
public static final int VK_I_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xED;
/** */
public static final int VK_I_WITH_CIRCUMFLEX = START_OF_LATIN_DIACRITIC_LETTERS + 0xEE;
/** */
public static final int VK_I_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xEF;
/** */
public static final int VK_ETH = START_OF_LATIN_DIACRITIC_LETTERS + 0xF0;
/** */
public static final int VK_N_WITH_TILDE = START_OF_LATIN_DIACRITIC_LETTERS + 0xF1;
/** */
public static final int VK_O_WITH_GRAVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xF2;
/** */
public static final int VK_O_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xF3;
/** */
public static final int VK_O_WITH_CIRCUMFLEX = START_OF_LATIN_DIACRITIC_LETTERS + 0xF4;
/** */
public static final int VK_O_WITH_TILDE = START_OF_LATIN_DIACRITIC_LETTERS + 0xF5;
/** */
public static final int VK_O_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xF6;
/** */
public static final int VK_DIVISION_SIGN = START_OF_LATIN_DIACRITIC_LETTERS + 0xF7;
/** */
public static final int VK_O_WITH_SLASH = START_OF_LATIN_DIACRITIC_LETTERS + 0xF8;
/** */
public static final int VK_U_WITH_GRAVE = START_OF_LATIN_DIACRITIC_LETTERS + 0xF9;
/** */
public static final int VK_U_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xFA;
/** */
public static final int VK_U_WITH_CIRCUMFLEX = START_OF_LATIN_DIACRITIC_LETTERS + 0xFB;
/** */
public static final int VK_U_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xFC;
/** */
public static final int VK_Y_WITH_ACUTE = START_OF_LATIN_DIACRITIC_LETTERS + 0xFD;
/** */
public static final int VK_THORN = START_OF_LATIN_DIACRITIC_LETTERS + 0xFE;
/** */
public static final int VK_Y_WITH_DIAERESIS = START_OF_LATIN_DIACRITIC_LETTERS + 0xFF;
}

View File

@@ -18,6 +18,7 @@ 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
@@ -53,22 +54,18 @@ public class Key {
int getKeyCode() {
KeyChar keyChar = mappedKeyChars.getKeyChar();
char ch = keyChar.getChar();
if (keyChar.isDead() && deadKeyCodesMap.containsKey(ch)) {
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)) {
// KeyEvent.getExtendedKeyCodeForChar(ch) does not return corresponding VK_ constant for dead keys
return deadKeyCodesMap.get(ch);
} else if (isLatinUnicode(ch)) {
final int UNICODE_OFFSET = 0x01000000;
return UNICODE_OFFSET + (int) ch;
} else {
return KeyEvent.getExtendedKeyCodeForChar(ch);
}
}
private boolean isLatinUnicode(char ch) {
// Latin-1 Supplement & Latin Extended A & B
return ch >= 0x0080 && ch <= 0x024F;
}
// Returns key char for the current layout
public char getChar(Modifier modifier) {
return mappedKeyChars.getKeyChar(modifier).getChar();
@@ -94,6 +91,49 @@ 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>() {
{