aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_unicode.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/process_keycode/process_unicode.c')
-rw-r--r--quantum/process_keycode/process_unicode.c209
1 files changed, 180 insertions, 29 deletions
diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c
index ad5d7f86b..06c1694f2 100644
--- a/quantum/process_keycode/process_unicode.c
+++ b/quantum/process_keycode/process_unicode.c
@@ -13,45 +13,196 @@ uint16_t hex_to_keycode(uint8_t hex)
13 } 13 }
14} 14}
15 15
16void set_unicode_mode(uint8_t os_target) 16void set_unicode_input_mode(uint8_t os_target)
17{ 17{
18 input_mode = os_target; 18 input_mode = os_target;
19} 19}
20 20
21__attribute__((weak))
22void unicode_input_start (void) {
23 switch(input_mode) {
24 case UC_OSX:
25 register_code(KC_LALT);
26 break;
27 case UC_LNX:
28 register_code(KC_LCTL);
29 register_code(KC_LSFT);
30 register_code(KC_U);
31 unregister_code(KC_U);
32 unregister_code(KC_LSFT);
33 unregister_code(KC_LCTL);
34 break;
35 case UC_WIN:
36 register_code(KC_LALT);
37 register_code(KC_PPLS);
38 unregister_code(KC_PPLS);
39 break;
40 }
41 wait_ms(UNICODE_TYPE_DELAY);
42}
43
44__attribute__((weak))
45void unicode_input_finish (void) {
46 switch(input_mode) {
47 case UC_OSX:
48 case UC_WIN:
49 unregister_code(KC_LALT);
50 break;
51 case UC_LNX:
52 register_code(KC_SPC);
53 unregister_code(KC_SPC);
54 break;
55 }
56}
57
58void register_hex(uint16_t hex) {
59 for(int i = 3; i >= 0; i--) {
60 uint8_t digit = ((hex >> (i*4)) & 0xF);
61 register_code(hex_to_keycode(digit));
62 unregister_code(hex_to_keycode(digit));
63 }
64}
65
21bool process_unicode(uint16_t keycode, keyrecord_t *record) { 66bool process_unicode(uint16_t keycode, keyrecord_t *record) {
22 if (keycode > QK_UNICODE && record->event.pressed) { 67 if (keycode > QK_UNICODE && record->event.pressed) {
23 uint16_t unicode = keycode & 0x7FFF; 68 uint16_t unicode = keycode & 0x7FFF;
24 switch(input_mode) { 69 unicode_input_start();
25 case UC_OSX: 70 register_hex(unicode);
26 register_code(KC_LALT); 71 unicode_input_finish();
27 break; 72 }
28 case UC_LNX: 73 return true;
29 register_code(KC_LCTL); 74}
30 register_code(KC_LSFT); 75
31 register_code(KC_U); 76#ifdef UCIS_ENABLE
32 unregister_code(KC_U); 77qk_ucis_state_t qk_ucis_state;
33 break; 78
34 case UC_WIN: 79void qk_ucis_start(void) {
35 register_code(KC_LALT); 80 qk_ucis_state.count = 0;
36 register_code(KC_PPLS); 81 qk_ucis_state.in_progress = true;
37 unregister_code(KC_PPLS); 82
38 break; 83 qk_ucis_start_user();
84}
85
86__attribute__((weak))
87void qk_ucis_start_user(void) {
88 unicode_input_start();
89 register_hex(0x2328);
90 unicode_input_finish();
91}
92
93static bool is_uni_seq(char *seq) {
94 uint8_t i;
95
96 for (i = 0; seq[i]; i++) {
97 uint16_t code;
98 if (('1' <= seq[i]) && (seq[i] <= '0'))
99 code = seq[i] - '1' + KC_1;
100 else
101 code = seq[i] - 'a' + KC_A;
102
103 if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code)
104 return false;
105 }
106
107 return (qk_ucis_state.codes[i] == KC_ENT ||
108 qk_ucis_state.codes[i] == KC_SPC);
109}
110
111__attribute__((weak))
112void qk_ucis_symbol_fallback (void) {
113 for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
114 uint8_t code = qk_ucis_state.codes[i];
115 register_code(code);
116 unregister_code(code);
117 wait_ms(UNICODE_TYPE_DELAY);
118 }
119}
120
121void register_ucis(const char *hex) {
122 for(int i = 0; hex[i]; i++) {
123 uint8_t kc = 0;
124 char c = hex[i];
125
126 switch (c) {
127 case '0':
128 kc = KC_0;
129 break;
130 case '1' ... '9':
131 kc = c - '1' + KC_1;
132 break;
133 case 'a' ... 'f':
134 kc = c - 'a' + KC_A;
135 break;
136 case 'A' ... 'F':
137 kc = c - 'A' + KC_A;
138 break;
39 } 139 }
40 for(int i = 3; i >= 0; i--) { 140
41 uint8_t digit = ((unicode >> (i*4)) & 0xF); 141 if (kc) {
42 register_code(hex_to_keycode(digit)); 142 register_code (kc);
43 unregister_code(hex_to_keycode(digit)); 143 unregister_code (kc);
144 wait_ms (UNICODE_TYPE_DELAY);
44 } 145 }
45 switch(input_mode) { 146 }
46 case UC_OSX: 147}
47 case UC_WIN: 148
48 unregister_code(KC_LALT); 149bool process_ucis (uint16_t keycode, keyrecord_t *record) {
49 break; 150 uint8_t i;
50 case UC_LNX: 151
51 unregister_code(KC_LCTL); 152 if (!qk_ucis_state.in_progress)
52 unregister_code(KC_LSFT); 153 return true;
154
155 if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH &&
156 !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
157 return false;
158 }
159
160 if (!record->event.pressed)
161 return true;
162
163 qk_ucis_state.codes[qk_ucis_state.count] = keycode;
164 qk_ucis_state.count++;
165
166 if (keycode == KC_BSPC) {
167 if (qk_ucis_state.count >= 2) {
168 qk_ucis_state.count -= 2;
169 return true;
170 } else {
171 qk_ucis_state.count--;
172 return false;
173 }
174 }
175
176 if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
177 bool symbol_found = false;
178
179 for (i = qk_ucis_state.count; i > 0; i--) {
180 register_code (KC_BSPC);
181 unregister_code (KC_BSPC);
182 wait_ms(UNICODE_TYPE_DELAY);
183 }
184
185 if (keycode == KC_ESC) {
186 qk_ucis_state.in_progress = false;
187 return false;
188 }
189
190 unicode_input_start();
191 for (i = 0; ucis_symbol_table[i].symbol; i++) {
192 if (is_uni_seq (ucis_symbol_table[i].symbol)) {
193 symbol_found = true;
194 register_ucis(ucis_symbol_table[i].code + 2);
53 break; 195 break;
196 }
54 } 197 }
198 if (!symbol_found) {
199 qk_ucis_symbol_fallback();
200 }
201 unicode_input_finish();
202
203 qk_ucis_state.in_progress = false;
204 return false;
55 } 205 }
56 return true; 206 return true;
57} \ No newline at end of file 207}
208#endif