diff options
Diffstat (limited to 'quantum/process_keycode/process_ucis.c')
-rw-r--r-- | quantum/process_keycode/process_ucis.c | 213 |
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 @@ | |||
19 | qk_ucis_state_t qk_ucis_state; | 19 | qk_ucis_state_t qk_ucis_state; |
20 | 20 | ||
21 | void qk_ucis_start(void) { | 21 | void 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) { |
29 | void 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) {} |
36 | void qk_ucis_success(uint8_t symbol_index) { | ||
37 | } | ||
38 | 35 | ||
39 | static bool is_uni_seq(char *seq) { | 36 | static 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) { |
58 | void 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) {} |
68 | void qk_ucis_cancel(void) { | ||
69 | } | ||
70 | 62 | ||
71 | void register_ucis(const char *hex) { | 63 | void 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 | ||
99 | bool process_ucis (uint16_t keycode, keyrecord_t *record) { | 91 | bool 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 | } |