summaryrefslogtreecommitdiff
path: root/quantum/keymap_unicode.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/keymap_unicode.c')
-rw-r--r--quantum/keymap_unicode.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/quantum/keymap_unicode.c b/quantum/keymap_unicode.c
index cda167d2c1..0511ffc178 100644
--- a/quantum/keymap_unicode.c
+++ b/quantum/keymap_unicode.c
@@ -39,20 +39,36 @@ void action_custom(keyrecord_t *record, uint32_t code)
register_code(KC_LALT);
#endif
- uint32_t unicode = code;
- bool leading_zero = false;
- for(int i = 6; i >= 0; i--) {
- uint8_t digit = ((unicode >> (int)(i*4)) & 0xF);
- if (digit > 0 || leading_zero || (i < 4)) {
- leading_zero = true;
+ if (code <= 0xFFFF) {
+ uint16_t unicode = (code & 0xFFFF);
+ for(int i = 3; i >= 0; i--) {
+ uint8_t digit = ((unicode >> (i*4)) & 0xF);
+ register_code(hextokeycode(digit));
+ unregister_code(hextokeycode(digit));
+ }
+ } else {
+ code = (code - 0x10000);
+ uint16_t high_uc = (0xD800 | (code >> 10));
+ uint16_t low_uc = (0xDC00 | (code & 0x3FF));
+ for(int i = 3; i >= 0; i--) {
+ uint8_t digit = ((high_uc >> (i*4)) & 0xF);
+ register_code(hextokeycode(digit));
+ unregister_code(hextokeycode(digit));
+ }
+
+ // #ifdef UNICODE_OSX
+ // unregister_code(KC_LALT);
+ // register_code(KC_LALT);
+ // #endif
+
+ register_code(KC_LSFT);
+ register_code(KC_EQL);
+ unregister_code(KC_EQL);
+ unregister_code(KC_LSFT);
+ for(int i = 3; i >= 0; i--) {
+ uint8_t digit = ((low_uc >> (i*4)) & 0xF);
register_code(hextokeycode(digit));
unregister_code(hextokeycode(digit));
- if (i == 4) {
- register_code(KC_LSFT);
- register_code(KC_EQL);
- unregister_code(KC_EQL);
- unregister_code(KC_LSFT);
- }
}
}