aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-10-26 00:48:00 -0400
committerGitHub <noreply@github.com>2016-10-26 00:48:00 -0400
commit108d0e89a619f1e002089ff7a41d1cfb58a4fd6a (patch)
treebb583ce4bfc00efc0ee462aeb0f71c9705881582
parent3b34cf7e6c06c5aa07ed452b17ba9530afe4fa9e (diff)
parente7d5dc89f2890007d776f6b613dc9deb473cff22 (diff)
downloadqmk_firmware-108d0e89a619f1e002089ff7a41d1cfb58a4fd6a.tar.gz
qmk_firmware-108d0e89a619f1e002089ff7a41d1cfb58a4fd6a.zip
Merge pull request #842 from priyadi/unicode_map_length
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