~ruther/qmk_firmware

e7d5dc89f2890007d776f6b613dc9deb473cff22 — Priyadi Iman Nurcahyo 8 years ago 2e2b996
UNICODE_MAP: remove 5 char limit; ignore leading zeroes; handle OS limitations
2 files changed, 35 insertions(+), 9 deletions(-)

M quantum/process_keycode/process_unicode.c
M readme.md
M quantum/process_keycode/process_unicode.c => quantum/process_keycode/process_unicode.c +27 -7
@@ 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;
}

M readme.md => readme.md +8 -2
@@ 326,8 326,14 @@ This allows you to send unicode symbols via `UC(<unicode>)` in your keymap. Only
`UNICODEMAP_ENABLE`

This allows sending unicode symbols using `X(<unicode>)` in your keymap. Codes
up to 0xFFFFF are supported, including emojis. But you need to maintain a
separate mapping table in your keymap file.
up to 0xFFFFFFFF are supported, including emojis. You will need to maintain
a separate mapping table in your keymap file.

Known limitations:
- Under Mac OS, only codes up to 0xFFFF are supported.
- Under Linux ibus, only codes up to 0xFFFFF are supported (but anything important is still under this limit for now).

Characters out of range supported by the OS will be ignored.

`BLUETOOTH_ENABLE`