summary refs log tree commit diff
path: root/quantum/process_keycode/process_ucis.c
diff options
context:
space:
mode:
authorJason Laqua <jlaqua118@gmail.com>2020-06-18 02:07:34 -0500
committerGitHub <noreply@github.com>2020-06-18 08:07:34 +0100
commitf7eb030e917a8fa360ad7cc7bb26d804cf4c5f6c (patch)
tree8415ddb70ed9fa1cfea2651a6ef950483648d851 /quantum/process_keycode/process_ucis.c
parentaae1814319c4992471d074ed18b8b7b4842b0a66 (diff)
Standardize how unicode is processed (fixes #8768) (#8770)
Co-authored-by: Konstantin Đorđević <vomindoraan@gmail.com>
Diffstat (limited to 'quantum/process_keycode/process_ucis.c')
-rw-r--r--quantum/process_keycode/process_ucis.c97
1 files changed, 38 insertions, 59 deletions
diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c
index 024077317f..2541d6eb26 100644
--- a/quantum/process_keycode/process_ucis.c
+++ b/quantum/process_keycode/process_ucis.c
@@ -27,7 +27,7 @@ void qk_ucis_start(void) {
 
 __attribute__((weak)) void qk_ucis_start_user(void) {
     unicode_input_start();
-    register_hex(0x2328);
+    register_hex(0x2328);  // ⌨
     unicode_input_finish();
 }
 
@@ -35,74 +35,54 @@ __attribute__((weak)) void qk_ucis_success(uint8_t symbol_index) {}
 
 static bool is_uni_seq(char *seq) {
     uint8_t i;
-
     for (i = 0; seq[i]; i++) {
-        uint16_t code;
-        if (('1' <= seq[i]) && (seq[i] <= '0'))
-            code = seq[i] - '1' + KC_1;
-        else
-            code = seq[i] - 'a' + KC_A;
-
-        if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) return false;
+        uint16_t keycode;
+        if ('1' <= seq[i] && seq[i] <= '0') {
+            keycode = seq[i] - '1' + KC_1;
+        } else {
+            keycode = seq[i] - 'a' + KC_A;
+        }
+        if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != keycode) {
+            return false;
+        }
     }
-
-    return (qk_ucis_state.codes[i] == KC_ENT || qk_ucis_state.codes[i] == KC_SPC);
+    return qk_ucis_state.codes[i] == KC_ENT || qk_ucis_state.codes[i] == KC_SPC;
 }
 
 __attribute__((weak)) void qk_ucis_symbol_fallback(void) {
     for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) {
-        uint8_t code = qk_ucis_state.codes[i];
-        register_code(code);
-        unregister_code(code);
+        uint8_t keycode = qk_ucis_state.codes[i];
+        register_code(keycode);
+        unregister_code(keycode);
         wait_ms(UNICODE_TYPE_DELAY);
     }
 }
 
 __attribute__((weak)) void qk_ucis_cancel(void) {}
 
-void register_ucis(const char *hex) {
-    for (int i = 0; hex[i]; i++) {
-        uint8_t kc = 0;
-        char    c  = hex[i];
-
-        switch (c) {
-            case '0':
-                kc = KC_0;
-                break;
-            case '1' ... '9':
-                kc = c - '1' + KC_1;
-                break;
-            case 'a' ... 'f':
-                kc = c - 'a' + KC_A;
-                break;
-            case 'A' ... 'F':
-                kc = c - 'A' + KC_A;
-                break;
-        }
-
-        if (kc) {
-            register_code(kc);
-            unregister_code(kc);
-            wait_ms(UNICODE_TYPE_DELAY);
-        }
+void register_ucis(const uint32_t *code_points) {
+    for (int i = 0; i < UCIS_MAX_CODE_POINTS && code_points[i]; i++) {
+        register_unicode(code_points[i]);
+        wait_ms(UNICODE_TYPE_DELAY);
     }
 }
 
 bool process_ucis(uint16_t keycode, keyrecord_t *record) {
-    uint8_t i;
-
-    if (!qk_ucis_state.in_progress) return true;
+    if (!qk_ucis_state.in_progress || !record->event.pressed) {
+        return true;
+    }
 
-    if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) {
+    bool special = keycode == KC_SPC || keycode == KC_ENT ||
+                   keycode == KC_ESC || keycode == KC_BSPC;
+    if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && !special) {
         return false;
     }
 
-    if (!record->event.pressed) return true;
-
     qk_ucis_state.codes[qk_ucis_state.count] = keycode;
     qk_ucis_state.count++;
 
-    if (keycode == KC_BSPC) {
+    switch (keycode) {
+    case KC_BSPC:
         if (qk_ucis_state.count >= 2) {
             qk_ucis_state.count -= 2;
             return true;
@@ -110,12 +90,11 @@ bool process_ucis(uint16_t keycode, keyrecord_t *record) {
             qk_ucis_state.count--;
             return false;
         }
-    }
 
-    if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) {
-        bool symbol_found = false;
-
-        for (i = qk_ucis_state.count; i > 0; i--) {
+    case KC_SPC:
+    case KC_ENT:
+    case KC_ESC:
+        for (uint8_t i = 0; i < qk_ucis_state.count; i++) {
             register_code(KC_BSPC);
             unregister_code(KC_BSPC);
             wait_ms(UNICODE_TYPE_DELAY);
@@ -127,25 +106,25 @@ bool process_ucis(uint16_t keycode, keyrecord_t *record) {
             return false;
         }
 
-        unicode_input_start();
+        uint8_t i;
+        bool    symbol_found = false;
         for (i = 0; ucis_symbol_table[i].symbol; i++) {
             if (is_uni_seq(ucis_symbol_table[i].symbol)) {
                 symbol_found = true;
-                register_ucis(ucis_symbol_table[i].code + 2);
+                register_ucis(ucis_symbol_table[i].code_points);
                 break;
             }
         }
-        if (!symbol_found) {
-            qk_ucis_symbol_fallback();
-        }
-        unicode_input_finish();
-
         if (symbol_found) {
             qk_ucis_success(i);
+        } else {
+            qk_ucis_symbol_fallback();
         }
 
         qk_ucis_state.in_progress = false;
         return false;
+
+    default:
+        return true;
     }
-    return true;
 }