aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPriyadi Iman Nurcahyo <priyadi@priyadi.net>2016-10-23 05:36:26 +0700
committerPriyadi Iman Nurcahyo <priyadi@priyadi.net>2016-10-23 05:36:26 +0700
commite7d5dc89f2890007d776f6b613dc9deb473cff22 (patch)
treee74704cd33e57e98c9b3c18e0628cd1b67812b5c
parent2e2b9962cdc20e9f46dd0194f25a68ffa05e7d36 (diff)
downloadqmk_firmware-e7d5dc89f2890007d776f6b613dc9deb473cff22.tar.gz
qmk_firmware-e7d5dc89f2890007d776f6b613dc9deb473cff22.zip
UNICODE_MAP: remove 5 char limit; ignore leading zeroes; handle OS limitations
-rw-r--r--quantum/process_keycode/process_unicode.c34
-rw-r--r--readme.md10
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))
83const uint32_t PROGMEM unicode_map[] = { 83const uint32_t PROGMEM unicode_map[] = {
84}; 84};
85 85
86// 5 digit max because of linux limitation
87void register_hex32(uint32_t hex) { 86void 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))
107void unicode_map_input_error() {}
108
95bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { 109bool 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}
diff --git a/readme.md b/readme.md
index 62d479ff1..9264f9376 100644
--- a/readme.md
+++ b/readme.md
@@ -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
328This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes 328This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
329up to 0xFFFFF are supported, including emojis. But you need to maintain a 329up to 0xFFFFFFFF are supported, including emojis. You will need to maintain
330separate mapping table in your keymap file. 330a separate mapping table in your keymap file.
331
332Known 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
336Characters out of range supported by the OS will be ignored.
331 337
332`BLUETOOTH_ENABLE` 338`BLUETOOTH_ENABLE`
333 339