aboutsummaryrefslogtreecommitdiffstats
path: root/quantum/process_keycode
diff options
context:
space:
mode:
authorGravatar Priyadi Iman Nurcahyo <priyadi@priyadi.net>2016-10-23 05:36:26 +0700
committerGravatar Priyadi 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
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))
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;
}