forked from mirrors/qmk_firmware
96 lines
1.9 KiB
C
96 lines
1.9 KiB
C
// 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]);
|
|
}
|
|
}
|