aboutsummaryrefslogtreecommitdiffstats
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
parent2e2b9962cdc20e9f46dd0194f25a68ffa05e7d36 (diff)
downloadqmk_firmware-e7d5dc89f2890007d776f6b613dc9deb473cff22.tar.gz
UNICODE_MAP: remove 5 char limit; ignore leading zeroes; handle OS limitations
-rw-r--r--quantum/process_keycode/process_unicode.c34
-rw-r--r--readme.md10
2 files changed, 35 insertions, 9 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;
}
diff --git a/readme.md b/readme.md
index 62d479ff1..9264f9376 100644
--- a/readme.md
+++ b/readme.md
@@ -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`