summaryrefslogtreecommitdiff
path: root/quantum
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 /quantum
parent3b34cf7e6c06c5aa07ed452b17ba9530afe4fa9e (diff)
parente7d5dc89f2890007d776f6b613dc9deb473cff22 (diff)
Merge pull request #842 from priyadi/unicode_map_length
UNICODE_MAP: remove 5 char limit; ignore leading zeroes; handle OS limitations
Diffstat (limited to 'quantum')
-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 37dd471ffd..a71af5437b 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;
}