aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode
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 /quantum/process_keycode
parent2e2b9962cdc20e9f46dd0194f25a68ffa05e7d36 (diff)
downloadqmk_firmware-e7d5dc89f2890007d776f6b613dc9deb473cff22.tar.gz
qmk_firmware-e7d5dc89f2890007d776f6b613dc9deb473cff22.zip
UNICODE_MAP: remove 5 char limit; ignore leading zeroes; handle OS limitations
Diffstat (limited to 'quantum/process_keycode')
-rw-r--r--quantum/process_keycode/process_unicode.c34
1 files changed, 27 insertions, 7 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}