1 #include "process_ucis.h"
3 qk_ucis_state_t qk_ucis_state;
5 void qk_ucis_start(void) {
6 qk_ucis_state.count = 0;
7 qk_ucis_state.in_progress = true;
13 void qk_ucis_start_user(void) {
14 unicode_input_start();
16 unicode_input_finish();
19 static bool is_uni_seq(char *seq) {
22 for (i = 0; seq[i]; i++) {
24 if (('1' <= seq[i]) && (seq[i] <= '0'))
25 code = seq[i] - '1' + KC_1;
27 code = seq[i] - 'a' + KC_A;
29 if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code)
33 return (qk_ucis_state.codes[i] == KC_ENT ||
34 qk_ucis_state.codes[i] == KC_SPC);
38 void qk_ucis_symbol_fallback (void) {
39 for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
40 uint8_t code = qk_ucis_state.codes[i];
42 unregister_code(code);
43 wait_ms(UNICODE_TYPE_DELAY);
47 void register_ucis(const char *hex) {
48 for(int i = 0; hex[i]; i++) {
70 wait_ms (UNICODE_TYPE_DELAY);
75 bool process_ucis (uint16_t keycode, keyrecord_t *record) {
78 if (!qk_ucis_state.in_progress)
81 if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH &&
82 !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
86 if (!record->event.pressed)
89 qk_ucis_state.codes[qk_ucis_state.count] = keycode;
90 qk_ucis_state.count++;
92 if (keycode == KC_BSPC) {
93 if (qk_ucis_state.count >= 2) {
94 qk_ucis_state.count -= 2;
97 qk_ucis_state.count--;
102 if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
103 bool symbol_found = false;
105 for (i = qk_ucis_state.count; i > 0; i--) {
106 register_code (KC_BSPC);
107 unregister_code (KC_BSPC);
108 wait_ms(UNICODE_TYPE_DELAY);
111 if (keycode == KC_ESC) {
112 qk_ucis_state.in_progress = false;
116 unicode_input_start();
117 for (i = 0; ucis_symbol_table[i].symbol; i++) {
118 if (is_uni_seq (ucis_symbol_table[i].symbol)) {
120 register_ucis(ucis_symbol_table[i].code + 2);
125 qk_ucis_symbol_fallback();
127 unicode_input_finish();
129 qk_ucis_state.in_progress = false;