aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_unicodemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/process_keycode/process_unicodemap.c')
-rw-r--r--quantum/process_keycode/process_unicodemap.c95
1 files changed, 48 insertions, 47 deletions
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
index b88787986..4364f156c 100644
--- a/quantum/process_keycode/process_unicodemap.c
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -17,62 +17,63 @@
17#include "process_unicodemap.h" 17#include "process_unicodemap.h"
18 18
19void register_hex32(uint32_t hex) { 19void register_hex32(uint32_t hex) {
20 bool onzerostart = true; 20 bool onzerostart = true;
21 for(int i = 7; i >= 0; i--) { 21 for (int i = 7; i >= 0; i--) {
22 if (i <= 3) { 22 if (i <= 3) {
23 onzerostart = false; 23 onzerostart = false;
24 }
25 uint8_t digit = ((hex >> (i * 4)) & 0xF);
26 if (digit == 0) {
27 if (!onzerostart) {
28 register_code(hex_to_keycode(digit));
29 unregister_code(hex_to_keycode(digit));
30 }
31 } else {
32 register_code(hex_to_keycode(digit));
33 unregister_code(hex_to_keycode(digit));
34 onzerostart = false;
35 }
24 } 36 }
25 uint8_t digit = ((hex >> (i*4)) & 0xF);
26 if (digit == 0) {
27 if (!onzerostart) {
28 register_code(hex_to_keycode(digit));
29 unregister_code(hex_to_keycode(digit));
30 }
31 } else {
32 register_code(hex_to_keycode(digit));
33 unregister_code(hex_to_keycode(digit));
34 onzerostart = false;
35 }
36 }
37} 37}
38 38
39__attribute__((weak)) 39__attribute__((weak)) uint16_t unicodemap_index(uint16_t keycode) {
40uint16_t unicodemap_index(uint16_t keycode) { 40 if (keycode >= QK_UNICODEMAP_PAIR) {
41 if (keycode >= QK_UNICODEMAP_PAIR) { 41 // Keycode is a pair: extract index based on Shift / Caps Lock state
42 // Keycode is a pair: extract index based on Shift / Caps Lock state 42 uint16_t index = keycode - QK_UNICODEMAP_PAIR;
43 uint16_t index = keycode - QK_UNICODEMAP_PAIR;
44 43
45 bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK); 44 bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK);
46 if (shift ^ caps) { index >>= 7; } 45 if (shift ^ caps) {
46 index >>= 7;
47 }
47 48
48 return index & 0x7F; 49 return index & 0x7F;
49 } else { 50 } else {
50 // Keycode is a regular index 51 // Keycode is a regular index
51 return keycode - QK_UNICODEMAP; 52 return keycode - QK_UNICODEMAP;
52 } 53 }
53} 54}
54 55
55bool process_unicodemap(uint16_t keycode, keyrecord_t *record) { 56bool process_unicodemap(uint16_t keycode, keyrecord_t *record) {
56 if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) { 57 if (keycode >= QK_UNICODEMAP && keycode <= QK_UNICODEMAP_PAIR_MAX && record->event.pressed) {
57 unicode_input_start(); 58 unicode_input_start();
58 59
59 uint32_t code = pgm_read_dword(unicode_map + unicodemap_index(keycode)); 60 uint32_t code = pgm_read_dword(unicode_map + unicodemap_index(keycode));
60 uint8_t input_mode = get_unicode_input_mode(); 61 uint8_t input_mode = get_unicode_input_mode();
61 62
62 if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) { 63 if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) {
63 // Character is out of range supported by the platform 64 // Character is out of range supported by the platform
64 unicode_input_cancel(); 65 unicode_input_cancel();
65 } else if (code > 0xFFFF && input_mode == UC_OSX) { 66 } else if (code > 0xFFFF && input_mode == UC_OSX) {
66 // Convert to UTF-16 surrogate pair on Mac 67 // Convert to UTF-16 surrogate pair on Mac
67 code -= 0x10000; 68 code -= 0x10000;
68 uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10; 69 uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10;
69 register_hex32(hi + 0xD800); 70 register_hex32(hi + 0xD800);
70 register_hex32(lo + 0xDC00); 71 register_hex32(lo + 0xDC00);
71 unicode_input_finish(); 72 unicode_input_finish();
72 } else { 73 } else {
73 register_hex32(code); 74 register_hex32(code);
74 unicode_input_finish(); 75 unicode_input_finish();
76 }
75 } 77 }
76 } 78 return true;
77 return true;
78} 79}