X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=quantum%2Fprocess_keycode%2Fprocess_unicode_common.c;h=4285d20a19fb3cb83a032d67110773b5ab442442;hb=7222e3691b18128c4822f6bb5db008010f5e41dd;hp=84b5d673dd48ce473531d9549bf2f9f9dec12fb2;hpb=49046f621bc8304c8c7ba7a065d2568f45ecc616;p=qmk_firmware.git diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 84b5d673d..4285d20a1 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -16,12 +16,13 @@ #include "process_unicode_common.h" #include "eeprom.h" +#include +#include static uint8_t input_mode; uint8_t mods; -void set_unicode_input_mode(uint8_t os_target) -{ +void set_unicode_input_mode(uint8_t os_target) { input_mode = os_target; eeprom_update_byte(EECONFIG_UNICODEMODE, os_target); } @@ -30,6 +31,14 @@ uint8_t get_unicode_input_mode(void) { return input_mode; } +void unicode_input_mode_init(void) { + static bool first_flag = false; + if (!first_flag) { + input_mode = eeprom_read_byte(EECONFIG_UNICODEMODE); + first_flag = true; + } +} + __attribute__((weak)) void unicode_input_start (void) { // save current mods @@ -49,6 +58,9 @@ void unicode_input_start (void) { case UC_OSX: register_code(KC_LALT); break; + case UC_OSX_RALT: + register_code(KC_RALT); + break; case UC_LNX: register_code(KC_LCTL); register_code(KC_LSFT); @@ -78,6 +90,9 @@ void unicode_input_finish (void) { case UC_WIN: unregister_code(KC_LALT); break; + case UC_OSX_RALT: + unregister_code(KC_RALT); + break; case UC_LNX: register_code(KC_SPC); unregister_code(KC_SPC); @@ -96,8 +111,7 @@ void unicode_input_finish (void) { } __attribute__((weak)) -uint16_t hex_to_keycode(uint8_t hex) -{ +uint16_t hex_to_keycode(uint8_t hex) { if (hex == 0x0) { return KC_0; } else if (hex < 0xA) { @@ -114,3 +128,28 @@ void register_hex(uint16_t hex) { unregister_code(hex_to_keycode(digit)); } } + +void send_unicode_hex_string(const char *str) { + if (!str) { return; } // Safety net + + while (*str) { + // Find the next code point (token) in the string + for (; *str == ' '; str++); + size_t n = strcspn(str, " "); // Length of the current token + char code_point[n+1]; + strncpy(code_point, str, n); + code_point[n] = '\0'; // Make sure it's null-terminated + + // Normalize the code point: make all hex digits lowercase + for (char *p = code_point; *p; p++) { + *p = tolower((unsigned char)*p); + } + + // Send the code point as a Unicode input string + unicode_input_start(); + send_string(code_point); + unicode_input_finish(); + + str += n; // Move to the first ' ' (or '\0') after the current token + } +}