From 12fb240b56288f9602a601eecc01886481d18b75 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 8 Sep 2020 21:00:46 +0900 Subject: [PATCH 1/3] returns "Invalid key code specified." if specified character is not valid --- key/goKey.h | 2 ++ key/keycode_c.h | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/key/goKey.h b/key/goKey.h index 77c1927..c66338d 100644 --- a/key/goKey.h +++ b/key/goKey.h @@ -143,6 +143,8 @@ int CheckKeyCodes(char* k, MMKeyCode *key){ if (strlen(k) == 1) { *key = keyCodeForChar(*k); + if (*key == K_NOT_A_KEY) + return -2; return 0; } diff --git a/key/keycode_c.h b/key/keycode_c.h index cb19f51..25891a6 100644 --- a/key/keycode_c.h +++ b/key/keycode_c.h @@ -79,7 +79,7 @@ MMKeyCode keyCodeForChar(const char c){ 128, &kCFCopyStringDictionaryKeyCallBacks, NULL); - if (charToCodeDict == NULL) return UINT16_MAX; + if (charToCodeDict == NULL) return K_NOT_A_KEY; /* Loop through every keycode (0 - 127) to find its current mapping. */ for (i = 0; i < 128; ++i) { @@ -100,9 +100,18 @@ MMKeyCode keyCodeForChar(const char c){ } CFRelease(charStr); + + if (code == UINT16_MAX) { + return K_NOT_A_KEY; + } + return (MMKeyCode)code; #elif defined(IS_WINDOWS) - return VkKeyScan(c); + CGKeyCode code; + code = VkKeyScan(c); + if (code == 0xFFFF) + return K_NOT_A_KEY; + return code; #elif defined(USE_X11) MMKeyCode code; @@ -125,6 +134,9 @@ MMKeyCode keyCodeForChar(const char c){ } } + if (code == NoSymbol) + return K_NOT_A_KEY; + return code; #endif } From 05e614891db2d62f28c7253bad00e69c2111d832 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 8 Sep 2020 21:18:59 +0900 Subject: [PATCH 2/3] add keyCodeForCharFallBack --- key/keycode_c.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/key/keycode_c.h b/key/keycode_c.h index 25891a6..f6c4c38 100644 --- a/key/keycode_c.h +++ b/key/keycode_c.h @@ -10,6 +10,8 @@ * responsibility to release the returned object. */ CFStringRef createStringForKey(CGKeyCode keyCode); +MMKeyCode keyCodeForCharFallBack(const char c); + #elif defined(USE_X11) /* @@ -101,6 +103,11 @@ MMKeyCode keyCodeForChar(const char c){ CFRelease(charStr); + // TISGetInputSourceProperty may return nil so we need fallback + if (code == UINT16_MAX) { + code = keyCodeForCharFallBack(c); + } + if (code == UINT16_MAX) { return K_NOT_A_KEY; } @@ -174,4 +181,49 @@ CFStringRef createStringForKey(CGKeyCode keyCode){ return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1); } +MMKeyCode keyCodeForCharFallBack(const char c) { + switch (c) { + case 'A': return kVK_ANSI_A; + case 'B': return kVK_ANSI_B; + case 'C': return kVK_ANSI_C; + case 'D': return kVK_ANSI_D; + case 'E': return kVK_ANSI_E; + case 'F': return kVK_ANSI_F; + case 'G': return kVK_ANSI_G; + case 'H': return kVK_ANSI_H; + case 'I': return kVK_ANSI_I; + case 'J': return kVK_ANSI_J; + case 'K': return kVK_ANSI_K; + case 'L': return kVK_ANSI_L; + case 'M': return kVK_ANSI_M; + case 'N': return kVK_ANSI_N; + case 'O': return kVK_ANSI_O; + case 'P': return kVK_ANSI_P; + case 'Q': return kVK_ANSI_Q; + case 'R': return kVK_ANSI_R; + case 'S': return kVK_ANSI_S; + case 'T': return kVK_ANSI_T; + case 'U': return kVK_ANSI_U; + case 'V': return kVK_ANSI_V; + case 'W': return kVK_ANSI_W; + case 'X': return kVK_ANSI_X; + case 'Y': return kVK_ANSI_Y; + case 'Z': return kVK_ANSI_Z; + + + case '0': return kVK_ANSI_0; + case '1': return kVK_ANSI_1; + case '2': return kVK_ANSI_2; + case '3': return kVK_ANSI_3; + case '4': return kVK_ANSI_4; + case '5': return kVK_ANSI_5; + case '6': return kVK_ANSI_6; + case '7': return kVK_ANSI_7; + case '8': return kVK_ANSI_8; + case '9': return kVK_ANSI_9; + } + + return K_NOT_A_KEY; +} + #endif From 272bb3bb2ad36ea1c86450257ec6691ea351c5e0 Mon Sep 17 00:00:00 2001 From: anatawa12 Date: Tue, 8 Sep 2020 21:36:30 +0900 Subject: [PATCH 3/3] fix for windows --- key/keycode_c.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/key/keycode_c.h b/key/keycode_c.h index f6c4c38..413d8ce 100644 --- a/key/keycode_c.h +++ b/key/keycode_c.h @@ -114,7 +114,7 @@ MMKeyCode keyCodeForChar(const char c){ return (MMKeyCode)code; #elif defined(IS_WINDOWS) - CGKeyCode code; + MMKeyCode code; code = VkKeyScan(c); if (code == 0xFFFF) return K_NOT_A_KEY;