mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-03 23:02:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			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]);
 | 
						|
    }
 | 
						|
}
 |