diff options
| -rw-r--r-- | quantum/process_keycode/process_unicode.c | 34 | ||||
| -rw-r--r-- | readme.md | 10 |
2 files changed, 35 insertions, 9 deletions
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index 37dd471ff..a71af5437 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c | |||
| @@ -83,22 +83,42 @@ __attribute__((weak)) | |||
| 83 | const uint32_t PROGMEM unicode_map[] = { | 83 | const uint32_t PROGMEM unicode_map[] = { |
| 84 | }; | 84 | }; |
| 85 | 85 | ||
| 86 | // 5 digit max because of linux limitation | ||
| 87 | void register_hex32(uint32_t hex) { | 86 | void register_hex32(uint32_t hex) { |
| 88 | for(int i = 4; i >= 0; i--) { | 87 | uint8_t onzerostart = 1; |
| 88 | for(int i = 7; i >= 0; i--) { | ||
| 89 | if (i <= 3) { | ||
| 90 | onzerostart = 0; | ||
| 91 | } | ||
| 89 | uint8_t digit = ((hex >> (i*4)) & 0xF); | 92 | uint8_t digit = ((hex >> (i*4)) & 0xF); |
| 90 | register_code(hex_to_keycode(digit)); | 93 | if (digit == 0) { |
| 91 | unregister_code(hex_to_keycode(digit)); | 94 | if (onzerostart == 0) { |
| 95 | register_code(hex_to_keycode(digit)); | ||
| 96 | unregister_code(hex_to_keycode(digit)); | ||
| 97 | } | ||
| 98 | } else { | ||
| 99 | register_code(hex_to_keycode(digit)); | ||
| 100 | unregister_code(hex_to_keycode(digit)); | ||
| 101 | onzerostart = 0; | ||
| 102 | } | ||
| 92 | } | 103 | } |
| 93 | } | 104 | } |
| 94 | 105 | ||
| 106 | __attribute__((weak)) | ||
| 107 | void unicode_map_input_error() {} | ||
| 108 | |||
| 95 | bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { | 109 | bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { |
| 96 | if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { | 110 | if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { |
| 97 | const uint32_t* map = unicode_map; | 111 | const uint32_t* map = unicode_map; |
| 98 | uint16_t index = keycode & 0x7FF; | 112 | uint16_t index = keycode & 0x7FF; |
| 99 | unicode_input_start(); | 113 | uint32_t code = pgm_read_dword_far(&map[index]); |
| 100 | register_hex32(pgm_read_dword_far(&map[index])); | 114 | if ((code > 0xFFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { |
| 101 | unicode_input_finish(); | 115 | // when character is out of range supported by the OS |
| 116 | unicode_map_input_error(); | ||
| 117 | } else { | ||
| 118 | unicode_input_start(); | ||
| 119 | register_hex32(code); | ||
| 120 | unicode_input_finish(); | ||
| 121 | } | ||
| 102 | } | 122 | } |
| 103 | return true; | 123 | return true; |
| 104 | } | 124 | } |
| @@ -326,8 +326,14 @@ This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only | |||
| 326 | `UNICODEMAP_ENABLE` | 326 | `UNICODEMAP_ENABLE` |
| 327 | 327 | ||
| 328 | This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes | 328 | This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes |
| 329 | up to 0xFFFFF are supported, including emojis. But you need to maintain a | 329 | up to 0xFFFFFFFF are supported, including emojis. You will need to maintain |
| 330 | separate mapping table in your keymap file. | 330 | a separate mapping table in your keymap file. |
| 331 | |||
| 332 | Known limitations: | ||
| 333 | - Under Mac OS, only codes up to 0xFFFF are supported. | ||
| 334 | - Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now). | ||
| 335 | |||
| 336 | Characters out of range supported by the OS will be ignored. | ||
| 331 | 337 | ||
| 332 | `BLUETOOTH_ENABLE` | 338 | `BLUETOOTH_ENABLE` |
| 333 | 339 | ||
