aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_unicodemap.c
diff options
context:
space:
mode:
authorKonstantin Đorđević <vomindoraan@gmail.com>2019-05-03 18:33:00 +0200
committerDrashna Jaelre <drashna@live.com>2019-05-03 09:33:00 -0700
commitbdc8d89e6b8f49528b716d9bd3343a4f9e9327bd (patch)
tree72673090e6ebc1669df953b83213231d7ffb8375 /quantum/process_keycode/process_unicodemap.c
parent41beecfc1847bd0039c508753a212fa18f207e3f (diff)
downloadqmk_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.c36
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
20void register_hex32(uint32_t hex) { 19void 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))
41void unicodemap_input_error() {} 40uint16_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
43bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { 55bool 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 }