diff options
author | milestogo <milestogo@users.noreply.github.com> | 2017-03-08 15:51:30 -0800 |
---|---|---|
committer | milestogo <milestogo@users.noreply.github.com> | 2017-03-08 15:51:30 -0800 |
commit | feb858c5a9afff06ff54ec401359f8bfd5abdd73 (patch) | |
tree | cf61bfad47984bb4987540404f0ec349defbff1a /quantum/process_keycode/process_unicodemap.c | |
parent | b5bfb5104b63766ab9a54509302a3f4b0b1d7b16 (diff) | |
parent | ffb04bad660ba7c487e4b923e4391b6c7dd5eddd (diff) | |
download | qmk_firmware-feb858c5a9afff06ff54ec401359f8bfd5abdd73.tar.gz qmk_firmware-feb858c5a9afff06ff54ec401359f8bfd5abdd73.zip |
Merge branch 'master' into sculpt2
Diffstat (limited to 'quantum/process_keycode/process_unicodemap.c')
-rw-r--r-- | quantum/process_keycode/process_unicodemap.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c new file mode 100644 index 0000000000..68a593a186 --- /dev/null +++ b/quantum/process_keycode/process_unicodemap.c @@ -0,0 +1,56 @@ +#include "process_unicodemap.h" +#include "process_unicode_common.h" + +__attribute__((weak)) +const uint32_t PROGMEM unicode_map[] = { +}; + +void register_hex32(uint32_t hex) { + bool onzerostart = true; + for(int i = 7; i >= 0; i--) { + if (i <= 3) { + onzerostart = false; + } + uint8_t digit = ((hex >> (i*4)) & 0xF); + if (digit == 0) { + if (!onzerostart) { + 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 = false; + } + } +} + +__attribute__((weak)) +void unicode_map_input_error() {} + +bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { + uint8_t input_mode = get_unicode_input_mode(); + if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { + const uint32_t* map = unicode_map; + uint16_t index = keycode - QK_UNICODE_MAP; + uint32_t code = pgm_read_dword_far(&map[index]); + if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) { + // Convert to UTF-16 surrogate pair + code -= 0x10000; + uint32_t lo = code & 0x3ff; + uint32_t hi = (code & 0xffc00) >> 10; + unicode_input_start(); + register_hex32(hi + 0xd800); + register_hex32(lo + 0xdc00); + unicode_input_finish(); + } else if ((code > 0x10ffff && 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; +}
\ No newline at end of file |