diff options
Diffstat (limited to 'quantum/process_keycode/process_unicodemap.c')
-rw-r--r-- | quantum/process_keycode/process_unicodemap.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 327402761..b88787986 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c | |||
@@ -15,7 +15,6 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "process_unicodemap.h" | 17 | #include "process_unicodemap.h" |
18 | #include "process_unicode_common.h" | ||
19 | 18 | ||
20 | void register_hex32(uint32_t hex) { | 19 | void register_hex32(uint32_t hex) { |
21 | bool onzerostart = true; | 20 | bool onzerostart = true; |
@@ -38,28 +37,39 @@ void register_hex32(uint32_t hex) { | |||
38 | } | 37 | } |
39 | 38 | ||
40 | __attribute__((weak)) | 39 | __attribute__((weak)) |
41 | void unicodemap_input_error() {} | 40 | uint16_t unicodemap_index(uint16_t keycode) { |
41 | if (keycode >= QK_UNICODEMAP_PAIR) { | ||
42 | // Keycode is a pair: extract index based on Shift / Caps Lock state | ||
43 | uint16_t index = keycode - QK_UNICODEMAP_PAIR; | ||
44 | |||
45 | bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); | ||
46 | if (shift ^ caps) { index >>= 7; } | ||
47 | |||
48 | return index & 0x7F; | ||
49 | } else { | ||
50 | // Keycode is a regular index | ||
51 | return keycode - QK_UNICODEMAP; | ||
52 | } | ||
53 | } | ||
42 | 54 | ||
43 | bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { | 55 | bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { |
44 | if ((keycode & QK_UNICODEMAP) == QK_UNICODEMAP && record->event.pressed) { | 56 | if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) { |
45 | uint16_t index = keycode - QK_UNICODEMAP; | 57 | unicode_input_start(); |
46 | uint32_t code = pgm_read_dword(unicode_map + index); | 58 | |
59 | uint32_t code = pgm_read_dword(unicode_map + unicodemap_index(keycode)); | ||
47 | uint8_t input_mode = get_unicode_input_mode(); | 60 | uint8_t input_mode = get_unicode_input_mode(); |
48 | 61 | ||
49 | if (code > 0xFFFF && code <= 0x10FFFF && input_mode == UC_OSX) { | 62 | if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) { |
50 | // Convert to UTF-16 surrogate pair | 63 | // Character is out of range supported by the platform |
64 | unicode_input_cancel(); | ||
65 | } else if (code > 0xFFFF && input_mode == UC_OSX) { | ||
66 | // Convert to UTF-16 surrogate pair on Mac | ||
51 | code -= 0x10000; | 67 | code -= 0x10000; |
52 | uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; | 68 | uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; |
53 | |||
54 | unicode_input_start(); | ||
55 | register_hex32(hi + 0xD800); | 69 | register_hex32(hi + 0xD800); |
56 | register_hex32(lo + 0xDC00); | 70 | register_hex32(lo + 0xDC00); |
57 | unicode_input_finish(); | 71 | unicode_input_finish(); |
58 | } else if ((code > 0x10FFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { | ||
59 | // Character is out of range supported by the OS | ||
60 | unicodemap_input_error(); | ||
61 | } else { | 72 | } else { |
62 | unicode_input_start(); | ||
63 | register_hex32(code); | 73 | register_hex32(code); |
64 | unicode_input_finish(); | 74 | unicode_input_finish(); |
65 | } | 75 | } |