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 | } |
