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 3274027613..b887879860 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c @@ -15,7 +15,6 @@   */  #include "process_unicodemap.h" -#include "process_unicode_common.h"  void register_hex32(uint32_t hex) {    bool onzerostart = true; @@ -38,28 +37,39 @@ void register_hex32(uint32_t hex) {  }  __attribute__((weak)) -void unicodemap_input_error() {} +uint16_t unicodemap_index(uint16_t keycode) { +  if (keycode >= QK_UNICODEMAP_PAIR) { +    // Keycode is a pair: extract index based on Shift / Caps Lock state +    uint16_t index = keycode - QK_UNICODEMAP_PAIR; + +    bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); +    if (shift ^ caps) { index >>= 7; } + +    return index & 0x7F; +  } else { +    // Keycode is a regular index +    return keycode - QK_UNICODEMAP; +  } +}  bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { -  if ((keycode & QK_UNICODEMAP) == QK_UNICODEMAP && record->event.pressed) { -    uint16_t index = keycode - QK_UNICODEMAP; -    uint32_t code = pgm_read_dword(unicode_map + index); +  if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) { +    unicode_input_start(); + +    uint32_t code = pgm_read_dword(unicode_map + unicodemap_index(keycode));      uint8_t input_mode = get_unicode_input_mode(); -    if (code > 0xFFFF && code <= 0x10FFFF && input_mode == UC_OSX) { -      // Convert to UTF-16 surrogate pair +    if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) { +      // Character is out of range supported by the platform +      unicode_input_cancel(); +    } else if (code > 0xFFFF && input_mode == UC_OSX) { +      // Convert to UTF-16 surrogate pair on Mac        code -= 0x10000;        uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; - -      unicode_input_start();        register_hex32(hi + 0xD800);        register_hex32(lo + 0xDC00);        unicode_input_finish(); -    } else if ((code > 0x10FFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { -      // Character is out of range supported by the OS -      unicodemap_input_error();      } else { -      unicode_input_start();        register_hex32(code);        unicode_input_finish();      } | 
