Unicode, Unicodemap and UCIS refactor (#21659)
This commit is contained in:
parent
95681b8ff4
commit
70e34e491c
34 changed files with 1196 additions and 386 deletions
96
quantum/unicode/ucis.c
Normal file
96
quantum/unicode/ucis.c
Normal file
|
@ -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]);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue