aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_unicodemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/process_keycode/process_unicodemap.c')
-rw-r--r--quantum/process_keycode/process_unicodemap.c36
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
20void register_hex32(uint32_t hex) { 19void 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))
41void unicodemap_input_error() {} 40uint16_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
43bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { 55bool 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 }