97 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			97 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]);
 | |
|     }
 | |
| }
 |