diff options
author | Konstantin Đorđević <vomindoraan@gmail.com> | 2019-05-03 18:33:00 +0200 |
---|---|---|
committer | Drashna Jaelre <drashna@live.com> | 2019-05-03 09:33:00 -0700 |
commit | bdc8d89e6b8f49528b716d9bd3343a4f9e9327bd (patch) | |
tree | 72673090e6ebc1669df953b83213231d7ffb8375 /quantum/process_keycode/process_unicodemap.c | |
parent | 41beecfc1847bd0039c508753a212fa18f207e3f (diff) | |
download | qmk_firmware-bdc8d89e6b8f49528b716d9bd3343a4f9e9327bd.tar.gz qmk_firmware-bdc8d89e6b8f49528b716d9bd3343a4f9e9327bd.zip |
New keycode macro (XP) for shifted character pairs using UNICODEMAP + bug fixes and improvements (#4803)
* Expose unicode_saved_mods
* Add UNICODEMAP shift pair functionality and XS keycode
* Add XS to keycode reference documentation
* Pick pair index based on both Shift and Caps Lock state
* Add XS to Unicode feature docs
* Clean up process_unicode* headers
* Extract unicode_map index calculation into function
* Pick pair index as XOR rather than OR of Shift and Caps states
* unicode_input_start() has to be called before the unicode_map index is calculated
* Replace unicodemap_input_error() with more generic unicode_input_cancel()
* Replace register+tap+unregister with tap_code16(LCTL(LSFT(KC_U)))
* UNICODE_OSX_KEY → UNICODE_KEY_OSX, UNICODE_WINC_KEY → UNICODE_KEY_WINC
* Make keycode range checks more robust
* Fix keycode range checks for different input modes
* Add UNICODE_KEY_LNX, update docs
* QK_UNICODEMAP_SHIFT → QK_UNICODEMAP_PAIR
* XS → XP, update docs
* Tweak Unicode docs
* Use recently added MOD_MASK_SHIFT and IS_HOST_LED_ON helpers
* Update Unicode table in docs/keycodes.md
* Update Unicode docs per review comments
* Replace references to Mac OS X with macOS in Unicode docs
* As of v0.9.0, WinCompose supports all possible code points
* Expand descriptions in XP docs
* Update keycode table and cycling docs
* Further expand cycling docs
Diffstat (limited to 'quantum/process_keycode/process_unicodemap.c')
-rw-r--r-- | quantum/process_keycode/process_unicodemap.c | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c index 327402761..b88787986 100644 --- a/quantum/process_keycode/process_unicodemap.c +++ b/quantum/process_keycode/process_unicodemap.c | |||
@@ -15,7 +15,6 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "process_unicodemap.h" | 17 | #include "process_unicodemap.h" |
18 | #include "process_unicode_common.h" | ||
19 | 18 | ||
20 | void register_hex32(uint32_t hex) { | 19 | void register_hex32(uint32_t hex) { |
21 | bool onzerostart = true; | 20 | bool onzerostart = true; |
@@ -38,28 +37,39 @@ void register_hex32(uint32_t hex) { | |||
38 | } | 37 | } |
39 | 38 | ||
40 | __attribute__((weak)) | 39 | __attribute__((weak)) |
41 | void unicodemap_input_error() {} | 40 | uint16_t unicodemap_index(uint16_t keycode) { |
41 | if (keycode >= QK_UNICODEMAP_PAIR) { | ||
42 | // Keycode is a pair: extract index based on Shift / Caps Lock state | ||
43 | uint16_t index = keycode - QK_UNICODEMAP_PAIR; | ||
44 | |||
45 | bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); | ||
46 | if (shift ^ caps) { index >>= 7; } | ||
47 | |||
48 | return index & 0x7F; | ||
49 | } else { | ||
50 | // Keycode is a regular index | ||
51 | return keycode - QK_UNICODEMAP; | ||
52 | } | ||
53 | } | ||
42 | 54 | ||
43 | bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { | 55 | bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { |
44 | if ((keycode & QK_UNICODEMAP) == QK_UNICODEMAP && record->event.pressed) { | 56 | if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) { |
45 | uint16_t index = keycode - QK_UNICODEMAP; | 57 | unicode_input_start(); |
46 | uint32_t code = pgm_read_dword(unicode_map + index); | 58 | |
59 | uint32_t code = pgm_read_dword(unicode_map + unicodemap_index(keycode)); | ||
47 | uint8_t input_mode = get_unicode_input_mode(); | 60 | uint8_t input_mode = get_unicode_input_mode(); |
48 | 61 | ||
49 | if (code > 0xFFFF && code <= 0x10FFFF && input_mode == UC_OSX) { | 62 | if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) { |
50 | // Convert to UTF-16 surrogate pair | 63 | // Character is out of range supported by the platform |
64 | unicode_input_cancel(); | ||
65 | } else if (code > 0xFFFF && input_mode == UC_OSX) { | ||
66 | // Convert to UTF-16 surrogate pair on Mac | ||
51 | code -= 0x10000; | 67 | code -= 0x10000; |
52 | uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; | 68 | uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; |
53 | |||
54 | unicode_input_start(); | ||
55 | register_hex32(hi + 0xD800); | 69 | register_hex32(hi + 0xD800); |
56 | register_hex32(lo + 0xDC00); | 70 | register_hex32(lo + 0xDC00); |
57 | unicode_input_finish(); | 71 | unicode_input_finish(); |
58 | } else if ((code > 0x10FFFF && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { | ||
59 | // Character is out of range supported by the OS | ||
60 | unicodemap_input_error(); | ||
61 | } else { | 72 | } else { |
62 | unicode_input_start(); | ||
63 | register_hex32(code); | 73 | register_hex32(code); |
64 | unicode_input_finish(); | 74 | unicode_input_finish(); |
65 | } | 75 | } |