summaryrefslogtreecommitdiffstats
path: root/quantum/unicode/ucis.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/unicode/ucis.c')
-rw-r--r--quantum/unicode/ucis.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/quantum/unicode/ucis.c b/quantum/unicode/ucis.c
new file mode 100644
index 0000000000..32be785206
--- /dev/null
+++ b/quantum/unicode/ucis.c
@@ -0,0 +1,96 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "ucis.h"
+#include "unicode.h"
+#include "action.h"
+
+uint8_t count = 0;
+bool active = false;
+char input[UCIS_MAX_INPUT_LENGTH] = {0};
+
+void ucis_start(void) {
+ count = 0;
+ active = true;
+
+ register_unicode(0x2328); // ⌨
+}
+
+bool ucis_active(void) {
+ return active;
+}
+
+uint8_t ucis_count(void) {
+ return count;
+}
+
+static char keycode_to_char(uint16_t keycode) {
+ if (keycode >= KC_A && keycode <= KC_Z) {
+ return 'a' + (keycode - KC_A);
+ } else if (keycode >= KC_1 && keycode <= KC_9) {
+ return '1' + (keycode - KC_1);
+ } else if (keycode == KC_0) {
+ return '0';
+ }
+ return 0;
+}
+
+bool ucis_add(uint16_t keycode) {
+ char c = keycode_to_char(keycode);
+ if (c) {
+ input[count++] = c;
+ return true;
+ }
+ return false;
+}
+
+bool ucis_remove_last(void) {
+ if (count) {
+ count--;
+ return true;
+ }
+
+ return false;
+}
+
+static bool match_mnemonic(char *mnemonic) {
+ for (uint8_t i = 0; input[i]; i++) {
+ if (i > count || input[i] != mnemonic[i]) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void ucis_finish(void) {
+ uint8_t i = 0;
+ bool found = false;
+ for (; ucis_symbol_table[i].mnemonic; i++) {
+ if (match_mnemonic(ucis_symbol_table[i].mnemonic)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found) {
+ for (uint8_t j = 0; j <= count; j++) {
+ tap_code(KC_BACKSPACE);
+ }
+ register_ucis(i);
+ }
+
+ active = false;
+}
+
+void ucis_cancel(void) {
+ count = 0;
+ active = false;
+}
+
+void register_ucis(uint8_t index) {
+ const uint32_t *code_points = ucis_symbol_table[index].code_points;
+
+ for (int i = 0; i < UCIS_MAX_CODE_POINTS && code_points[i]; i++) {
+ register_unicode(code_points[i]);
+ }
+}