aboutsummaryrefslogtreecommitdiff
path: root/quantum/process_keycode/process_ucis.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/process_keycode/process_ucis.c')
-rw-r--r--quantum/process_keycode/process_ucis.c213
1 files changed, 101 insertions, 112 deletions
diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c
index fd4508b53..024077317 100644
--- a/quantum/process_keycode/process_ucis.c
+++ b/quantum/process_keycode/process_ucis.c
@@ -19,144 +19,133 @@
19qk_ucis_state_t qk_ucis_state; 19qk_ucis_state_t qk_ucis_state;
20 20
21void qk_ucis_start(void) { 21void qk_ucis_start(void) {
22 qk_ucis_state.count = 0; 22 qk_ucis_state.count = 0;
23 qk_ucis_state.in_progress = true; 23 qk_ucis_state.in_progress = true;
24 24
25 qk_ucis_start_user(); 25 qk_ucis_start_user();
26} 26}
27 27
28__attribute__((weak)) 28__attribute__((weak)) void qk_ucis_start_user(void) {
29void qk_ucis_start_user(void) { 29 unicode_input_start();
30 unicode_input_start(); 30 register_hex(0x2328);
31 register_hex(0x2328); 31 unicode_input_finish();
32 unicode_input_finish();
33} 32}
34 33
35__attribute__((weak)) 34__attribute__((weak)) void qk_ucis_success(uint8_t symbol_index) {}
36void qk_ucis_success(uint8_t symbol_index) {
37}
38 35
39static bool is_uni_seq(char *seq) { 36static bool is_uni_seq(char *seq) {
40 uint8_t i; 37 uint8_t i;
41 38
42 for (i = 0; seq[i]; i++) { 39 for (i = 0; seq[i]; i++) {
43 uint16_t code; 40 uint16_t code;
44 if (('1' <= seq[i]) && (seq[i] <= '0')) 41 if (('1' <= seq[i]) && (seq[i] <= '0'))
45 code = seq[i] - '1' + KC_1; 42 code = seq[i] - '1' + KC_1;
46 else 43 else
47 code = seq[i] - 'a' + KC_A; 44 code = seq[i] - 'a' + KC_A;
48 45
49 if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) 46 if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) return false;
50 return false; 47 }
51 }
52 48
53 return (qk_ucis_state.codes[i] == KC_ENT || 49 return (qk_ucis_state.codes[i] == KC_ENT || qk_ucis_state.codes[i] == KC_SPC);
54 qk_ucis_state.codes[i] == KC_SPC);
55} 50}
56 51
57__attribute__((weak)) 52__attribute__((weak)) void qk_ucis_symbol_fallback(void) {
58void qk_ucis_symbol_fallback (void) { 53 for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
59 for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { 54 uint8_t code = qk_ucis_state.codes[i];
60 uint8_t code = qk_ucis_state.codes[i]; 55 register_code(code);
61 register_code(code); 56 unregister_code(code);
62 unregister_code(code); 57 wait_ms(UNICODE_TYPE_DELAY);
63 wait_ms(UNICODE_TYPE_DELAY); 58 }
64 }
65} 59}
66 60
67__attribute__((weak)) 61__attribute__((weak)) void qk_ucis_cancel(void) {}
68void qk_ucis_cancel(void) {
69}
70 62
71void register_ucis(const char *hex) { 63void register_ucis(const char *hex) {
72 for(int i = 0; hex[i]; i++) { 64 for (int i = 0; hex[i]; i++) {
73 uint8_t kc = 0; 65 uint8_t kc = 0;
74 char c = hex[i]; 66 char c = hex[i];
75 67
76 switch (c) { 68 switch (c) {
77 case '0': 69 case '0':
78 kc = KC_0; 70 kc = KC_0;
79 break; 71 break;
80 case '1' ... '9': 72 case '1' ... '9':
81 kc = c - '1' + KC_1; 73 kc = c - '1' + KC_1;
82 break; 74 break;
83 case 'a' ... 'f': 75 case 'a' ... 'f':
84 kc = c - 'a' + KC_A; 76 kc = c - 'a' + KC_A;
85 break; 77 break;
86 case 'A' ... 'F': 78 case 'A' ... 'F':
87 kc = c - 'A' + KC_A; 79 kc = c - 'A' + KC_A;
88 break; 80 break;
81 }
82
83 if (kc) {
84 register_code(kc);
85 unregister_code(kc);
86 wait_ms(UNICODE_TYPE_DELAY);
87 }
89 } 88 }
90
91 if (kc) {
92 register_code (kc);
93 unregister_code (kc);
94 wait_ms (UNICODE_TYPE_DELAY);
95 }
96 }
97} 89}
98 90
99bool process_ucis (uint16_t keycode, keyrecord_t *record) { 91bool process_ucis(uint16_t keycode, keyrecord_t *record) {
100 uint8_t i; 92 uint8_t i;
101 93
102 if (!qk_ucis_state.in_progress) 94 if (!qk_ucis_state.in_progress) return true;
103 return true;
104 95
105 if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && 96 if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
106 !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) { 97 return false;
107 return false;
108 }
109
110 if (!record->event.pressed)
111 return true;
112
113 qk_ucis_state.codes[qk_ucis_state.count] = keycode;
114 qk_ucis_state.count++;
115
116 if (keycode == KC_BSPC) {
117 if (qk_ucis_state.count >= 2) {
118 qk_ucis_state.count -= 2;
119 return true;
120 } else {
121 qk_ucis_state.count--;
122 return false;
123 } 98 }
124 }
125 99
126 if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { 100 if (!record->event.pressed) return true;
127 bool symbol_found = false;
128 101
129 for (i = qk_ucis_state.count; i > 0; i--) { 102 qk_ucis_state.codes[qk_ucis_state.count] = keycode;
130 register_code (KC_BSPC); 103 qk_ucis_state.count++;
131 unregister_code (KC_BSPC);
132 wait_ms(UNICODE_TYPE_DELAY);
133 }
134
135 if (keycode == KC_ESC) {
136 qk_ucis_state.in_progress = false;
137 qk_ucis_cancel();
138 return false;
139 }
140 104
141 unicode_input_start(); 105 if (keycode == KC_BSPC) {
142 for (i = 0; ucis_symbol_table[i].symbol; i++) { 106 if (qk_ucis_state.count >= 2) {
143 if (is_uni_seq (ucis_symbol_table[i].symbol)) { 107 qk_ucis_state.count -= 2;
144 symbol_found = true; 108 return true;
145 register_ucis(ucis_symbol_table[i].code + 2); 109 } else {
146 break; 110 qk_ucis_state.count--;
147 } 111 return false;
148 } 112 }
149 if (!symbol_found) {
150 qk_ucis_symbol_fallback();
151 } 113 }
152 unicode_input_finish();
153 114
154 if (symbol_found) { 115 if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
155 qk_ucis_success(i); 116 bool symbol_found = false;
117
118 for (i = qk_ucis_state.count; i > 0; i--) {
119 register_code(KC_BSPC);
120 unregister_code(KC_BSPC);
121 wait_ms(UNICODE_TYPE_DELAY);
122 }
123
124 if (keycode == KC_ESC) {
125 qk_ucis_state.in_progress = false;
126 qk_ucis_cancel();
127 return false;
128 }
129
130 unicode_input_start();
131 for (i = 0; ucis_symbol_table[i].symbol; i++) {
132 if (is_uni_seq(ucis_symbol_table[i].symbol)) {
133 symbol_found = true;
134 register_ucis(ucis_symbol_table[i].code + 2);
135 break;
136 }
137 }
138 if (!symbol_found) {
139 qk_ucis_symbol_fallback();
140 }
141 unicode_input_finish();
142
143 if (symbol_found) {
144 qk_ucis_success(i);
145 }
146
147 qk_ucis_state.in_progress = false;
148 return false;
156 } 149 }
157 150 return true;
158 qk_ucis_state.in_progress = false;
159 return false;
160 }
161 return true;
162} 151}