diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_unicode.c | 39 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode.h | 9 | 
2 files changed, 37 insertions, 11 deletions
| diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index 37dd471ffd..cd3a610b4d 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -42,6 +42,11 @@ void unicode_input_start (void) {      register_code(KC_PPLS);      unregister_code(KC_PPLS);      break; +  case UC_WINC: +    register_code(KC_RALT); +    unregister_code(KC_RALT); +    register_code(KC_U); +    unregister_code(KC_U);    }    wait_ms(UNICODE_TYPE_DELAY);  } @@ -83,22 +88,42 @@ __attribute__((weak))  const uint32_t PROGMEM unicode_map[] = {  }; -// 5 digit max because of linux limitation  void register_hex32(uint32_t hex) { -  for(int i = 4; i >= 0; i--) { +  uint8_t onzerostart = 1; +  for(int i = 7; i >= 0; i--) { +    if (i <= 3) { +      onzerostart = 0; +    }      uint8_t digit = ((hex >> (i*4)) & 0xF); -    register_code(hex_to_keycode(digit)); -    unregister_code(hex_to_keycode(digit)); +    if (digit == 0) { +      if (onzerostart == 0) { +        register_code(hex_to_keycode(digit)); +        unregister_code(hex_to_keycode(digit)); +      } +    } else { +      register_code(hex_to_keycode(digit)); +      unregister_code(hex_to_keycode(digit)); +      onzerostart = 0; +    }    }  } +__attribute__((weak)) +void unicode_map_input_error() {} +  bool process_unicode_map(uint16_t keycode, keyrecord_t *record) {    if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) {      const uint32_t* map = unicode_map;      uint16_t index = keycode & 0x7FF; -    unicode_input_start(); -    register_hex32(pgm_read_dword_far(&map[index])); -    unicode_input_finish(); +    uint32_t code = pgm_read_dword_far(&map[index]); +    if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { +      // when character is out of range supported by the OS +      unicode_map_input_error(); +    } else { +      unicode_input_start(); +      register_hex32(code); +      unicode_input_finish(); +    }    }    return true;  } diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index a6c7e45845..065eeb5f6a 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -3,10 +3,11 @@  #include "quantum.h" -#define UC_OSX 0 -#define UC_LNX 1 -#define UC_WIN 2 -#define UC_BSD 3 +#define UC_OSX 0  // Mac OS X +#define UC_LNX 1  // Linux +#define UC_WIN 2  // Windows 'HexNumpad' +#define UC_BSD 3  // BSD (not implemented) +#define UC_WINC 4 // WinCompose https://github.com/samhocevar/wincompose  #ifndef UNICODE_TYPE_DELAY  #define UNICODE_TYPE_DELAY 10 | 
