diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_ucis.c | 133 | ||||
| -rw-r--r-- | quantum/process_keycode/process_ucis.h | 34 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode.c | 200 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode.h | 36 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicodemap.c | 54 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicodemap.h | 8 | 
6 files changed, 229 insertions, 236 deletions
| diff --git a/quantum/process_keycode/process_ucis.c b/quantum/process_keycode/process_ucis.c new file mode 100644 index 0000000000..4ad2533b08 --- /dev/null +++ b/quantum/process_keycode/process_ucis.c @@ -0,0 +1,133 @@ +#include "process_ucis.h" + +qk_ucis_state_t qk_ucis_state; + +void qk_ucis_start(void) { +  qk_ucis_state.count = 0; +  qk_ucis_state.in_progress = true; + +  qk_ucis_start_user(); +} + +__attribute__((weak)) +void qk_ucis_start_user(void) { +  unicode_input_start(); +  register_hex(0x2328); +  unicode_input_finish(); +} + +static bool is_uni_seq(char *seq) { +  uint8_t i; + +  for (i = 0; seq[i]; i++) { +    uint16_t code; +    if (('1' <= seq[i]) && (seq[i] <= '0')) +      code = seq[i] - '1' + KC_1; +    else +      code = seq[i] - 'a' + KC_A; + +    if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) +      return false; +  } + +  return (qk_ucis_state.codes[i] == KC_ENT || +          qk_ucis_state.codes[i] == KC_SPC); +} + +__attribute__((weak)) +void qk_ucis_symbol_fallback (void) { +  for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { +    uint8_t code = qk_ucis_state.codes[i]; +    register_code(code); +    unregister_code(code); +    wait_ms(UNICODE_TYPE_DELAY); +  } +} + +void register_ucis(const char *hex) { +  for(int i = 0; hex[i]; i++) { +    uint8_t kc = 0; +    char c = hex[i]; + +    switch (c) { +    case '0': +      kc = KC_0; +      break; +    case '1' ... '9': +      kc = c - '1' + KC_1; +      break; +    case 'a' ... 'f': +      kc = c - 'a' + KC_A; +      break; +    case 'A' ... 'F': +      kc = c - 'A' + KC_A; +      break; +    } + +    if (kc) { +      register_code (kc); +      unregister_code (kc); +      wait_ms (UNICODE_TYPE_DELAY); +    } +  } +} + +bool process_ucis (uint16_t keycode, keyrecord_t *record) { +  uint8_t i; + +  if (!qk_ucis_state.in_progress) +    return true; + +  if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && +      !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) { +    return false; +  } + +  if (!record->event.pressed) +    return true; + +  qk_ucis_state.codes[qk_ucis_state.count] = keycode; +  qk_ucis_state.count++; + +  if (keycode == KC_BSPC) { +    if (qk_ucis_state.count >= 2) { +      qk_ucis_state.count -= 2; +      return true; +    } else { +      qk_ucis_state.count--; +      return false; +    } +  } + +  if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { +    bool symbol_found = false; + +    for (i = qk_ucis_state.count; i > 0; i--) { +      register_code (KC_BSPC); +      unregister_code (KC_BSPC); +      wait_ms(UNICODE_TYPE_DELAY); +    } + +    if (keycode == KC_ESC) { +      qk_ucis_state.in_progress = false; +      return false; +    } + +    unicode_input_start(); +    for (i = 0; ucis_symbol_table[i].symbol; i++) { +      if (is_uni_seq (ucis_symbol_table[i].symbol)) { +        symbol_found = true; +        register_ucis(ucis_symbol_table[i].code + 2); +        break; +      } +    } +    if (!symbol_found) { +      qk_ucis_symbol_fallback(); +    } +    unicode_input_finish(); + +    qk_ucis_state.in_progress = false; +    return false; +  } +  return true; +}
\ No newline at end of file diff --git a/quantum/process_keycode/process_ucis.h b/quantum/process_keycode/process_ucis.h new file mode 100644 index 0000000000..520db8042b --- /dev/null +++ b/quantum/process_keycode/process_ucis.h @@ -0,0 +1,34 @@ +#ifndef PROCESS_UCIS_H +#define PROCESS_UCIS_H + +#include "quantum.h" + +#ifndef UCIS_MAX_SYMBOL_LENGTH +#define UCIS_MAX_SYMBOL_LENGTH 32 +#endif + +typedef struct { +  char *symbol; +  char *code; +} qk_ucis_symbol_t; + +typedef struct { +  uint8_t count; +  uint16_t codes[UCIS_MAX_SYMBOL_LENGTH]; +  bool in_progress:1; +} qk_ucis_state_t; + +extern qk_ucis_state_t qk_ucis_state; + +#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}} +#define UCIS_SYM(name, code) {name, #code} + +extern const qk_ucis_symbol_t ucis_symbol_table[]; + +void qk_ucis_start(void); +void qk_ucis_start_user(void); +void qk_ucis_symbol_fallback (void); +void register_ucis(const char *hex); +bool process_ucis (uint16_t keycode, keyrecord_t *record); + +#endif diff --git a/quantum/process_keycode/process_unicode.c b/quantum/process_keycode/process_unicode.c index 9d01a592d2..898e168a30 100644 --- a/quantum/process_keycode/process_unicode.c +++ b/quantum/process_keycode/process_unicode.c @@ -4,18 +4,6 @@  static uint8_t input_mode;  uint8_t mods; -__attribute__((weak)) -uint16_t hex_to_keycode(uint8_t hex) -{ -  if (hex == 0x0) { -    return KC_0; -  } else if (hex < 0xA) { -    return KC_1 + (hex - 0x1); -  } else { -    return KC_A + (hex - 0xA); -  } -} -  void set_unicode_input_mode(uint8_t os_target)  {    input_mode = os_target; @@ -108,191 +96,3 @@ bool process_unicode(uint16_t keycode, keyrecord_t *record) {    return true;  } -#ifdef UNICODEMAP_ENABLE -__attribute__((weak)) -const uint32_t PROGMEM unicode_map[] = { -}; - -void register_hex32(uint32_t hex) { -  uint8_t onzerostart = 1; -  for(int i = 7; i >= 0; i--) { -    if (i <= 3) { -      onzerostart = 0; -    } -    uint8_t digit = ((hex >> (i*4)) & 0xF); -    if (digit == 0) { -      if (onzerostart == 0) { -        register_code(hex_to_keycode(digit)); -        unregister_code(hex_to_keycode(digit)); -      } -    } else { -      register_code(hex_to_keycode(digit)); -      unregister_code(hex_to_keycode(digit)); -      onzerostart = 0; -    } -  } -} - -__attribute__((weak)) -void unicode_map_input_error() {} - -bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { -  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { -    const uint32_t* map = unicode_map; -    uint16_t index = keycode - QK_UNICODE_MAP; -    uint32_t code = pgm_read_dword_far(&map[index]); -    if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) { -      // Convert to UTF-16 surrogate pair -      code -= 0x10000; -      uint32_t lo = code & 0x3ff; -      uint32_t hi = (code & 0xffc00) >> 10; -      unicode_input_start(); -      register_hex32(hi + 0xd800); -      register_hex32(lo + 0xdc00); -      unicode_input_finish(); -    } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { -      // when character is out of range supported by the OS -      unicode_map_input_error(); -    } else { -      unicode_input_start(); -      register_hex32(code); -      unicode_input_finish(); -    } -  } -  return true; -} -#endif - -#ifdef UCIS_ENABLE -qk_ucis_state_t qk_ucis_state; - -void qk_ucis_start(void) { -  qk_ucis_state.count = 0; -  qk_ucis_state.in_progress = true; - -  qk_ucis_start_user(); -} - -__attribute__((weak)) -void qk_ucis_start_user(void) { -  unicode_input_start(); -  register_hex(0x2328); -  unicode_input_finish(); -} - -static bool is_uni_seq(char *seq) { -  uint8_t i; - -  for (i = 0; seq[i]; i++) { -    uint16_t code; -    if (('1' <= seq[i]) && (seq[i] <= '0')) -      code = seq[i] - '1' + KC_1; -    else -      code = seq[i] - 'a' + KC_A; - -    if (i > qk_ucis_state.count || qk_ucis_state.codes[i] != code) -      return false; -  } - -  return (qk_ucis_state.codes[i] == KC_ENT || -          qk_ucis_state.codes[i] == KC_SPC); -} - -__attribute__((weak)) -void qk_ucis_symbol_fallback (void) { -  for (uint8_t i = 0; i < qk_ucis_state.count - 1; i++) { -    uint8_t code = qk_ucis_state.codes[i]; -    register_code(code); -    unregister_code(code); -    wait_ms(UNICODE_TYPE_DELAY); -  } -} - -void register_ucis(const char *hex) { -  for(int i = 0; hex[i]; i++) { -    uint8_t kc = 0; -    char c = hex[i]; - -    switch (c) { -    case '0': -      kc = KC_0; -      break; -    case '1' ... '9': -      kc = c - '1' + KC_1; -      break; -    case 'a' ... 'f': -      kc = c - 'a' + KC_A; -      break; -    case 'A' ... 'F': -      kc = c - 'A' + KC_A; -      break; -    } - -    if (kc) { -      register_code (kc); -      unregister_code (kc); -      wait_ms (UNICODE_TYPE_DELAY); -    } -  } -} - -bool process_ucis (uint16_t keycode, keyrecord_t *record) { -  uint8_t i; - -  if (!qk_ucis_state.in_progress) -    return true; - -  if (qk_ucis_state.count >= UCIS_MAX_SYMBOL_LENGTH && -      !(keycode == KC_BSPC || keycode == KC_ESC || keycode == KC_SPC || keycode == KC_ENT)) { -    return false; -  } - -  if (!record->event.pressed) -    return true; - -  qk_ucis_state.codes[qk_ucis_state.count] = keycode; -  qk_ucis_state.count++; - -  if (keycode == KC_BSPC) { -    if (qk_ucis_state.count >= 2) { -      qk_ucis_state.count -= 2; -      return true; -    } else { -      qk_ucis_state.count--; -      return false; -    } -  } - -  if (keycode == KC_ENT || keycode == KC_SPC || keycode == KC_ESC) { -    bool symbol_found = false; - -    for (i = qk_ucis_state.count; i > 0; i--) { -      register_code (KC_BSPC); -      unregister_code (KC_BSPC); -      wait_ms(UNICODE_TYPE_DELAY); -    } - -    if (keycode == KC_ESC) { -      qk_ucis_state.in_progress = false; -      return false; -    } - -    unicode_input_start(); -    for (i = 0; ucis_symbol_table[i].symbol; i++) { -      if (is_uni_seq (ucis_symbol_table[i].symbol)) { -        symbol_found = true; -        register_ucis(ucis_symbol_table[i].code + 2); -        break; -      } -    } -    if (!symbol_found) { -      qk_ucis_symbol_fallback(); -    } -    unicode_input_finish(); - -    qk_ucis_state.in_progress = false; -    return false; -  } -  return true; -} -#endif diff --git a/quantum/process_keycode/process_unicode.h b/quantum/process_keycode/process_unicode.h index f17cfa6cf2..7ed9e54d50 100644 --- a/quantum/process_keycode/process_unicode.h +++ b/quantum/process_keycode/process_unicode.h @@ -21,42 +21,6 @@ void register_hex(uint16_t hex);  bool process_unicode(uint16_t keycode, keyrecord_t *record); -#ifdef UNICODEMAP_ENABLE -void unicode_map_input_error(void); -bool process_unicode_map(uint16_t keycode, keyrecord_t *record); -#endif - -#ifdef UCIS_ENABLE -#ifndef UCIS_MAX_SYMBOL_LENGTH -#define UCIS_MAX_SYMBOL_LENGTH 32 -#endif - -typedef struct { -  char *symbol; -  char *code; -} qk_ucis_symbol_t; - -typedef struct { -  uint8_t count; -  uint16_t codes[UCIS_MAX_SYMBOL_LENGTH]; -  bool in_progress:1; -} qk_ucis_state_t; - -extern qk_ucis_state_t qk_ucis_state; - -#define UCIS_TABLE(...) {__VA_ARGS__, {NULL, NULL}} -#define UCIS_SYM(name, code) {name, #code} - -extern const qk_ucis_symbol_t ucis_symbol_table[]; - -void qk_ucis_start(void); -void qk_ucis_start_user(void); -void qk_ucis_symbol_fallback (void); -void register_ucis(const char *hex); -bool process_ucis (uint16_t keycode, keyrecord_t *record); - -#endif -  #define UC_BSPC	UC(0x0008)  #define UC_SPC	UC(0x0020) diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c new file mode 100644 index 0000000000..b8cdeaa979 --- /dev/null +++ b/quantum/process_keycode/process_unicodemap.c @@ -0,0 +1,54 @@ +#include "process_unicode_map.h" + +__attribute__((weak)) +const uint32_t PROGMEM unicode_map[] = { +}; + +void register_hex32(uint32_t hex) { +  uint8_t onzerostart = 1; +  for(int i = 7; i >= 0; i--) { +    if (i <= 3) { +      onzerostart = 0; +    } +    uint8_t digit = ((hex >> (i*4)) & 0xF); +    if (digit == 0) { +      if (onzerostart == 0) { +        register_code(hex_to_keycode(digit)); +        unregister_code(hex_to_keycode(digit)); +      } +    } else { +      register_code(hex_to_keycode(digit)); +      unregister_code(hex_to_keycode(digit)); +      onzerostart = 0; +    } +  } +} + +__attribute__((weak)) +void unicode_map_input_error() {} + +bool process_unicode_map(uint16_t keycode, keyrecord_t *record) { +  if ((keycode & QK_UNICODE_MAP) == QK_UNICODE_MAP && record->event.pressed) { +    const uint32_t* map = unicode_map; +    uint16_t index = keycode - QK_UNICODE_MAP; +    uint32_t code = pgm_read_dword_far(&map[index]); +    if (code > 0xFFFF && code <= 0x10ffff && input_mode == UC_OSX) { +      // Convert to UTF-16 surrogate pair +      code -= 0x10000; +      uint32_t lo = code & 0x3ff; +      uint32_t hi = (code & 0xffc00) >> 10; +      unicode_input_start(); +      register_hex32(hi + 0xd800); +      register_hex32(lo + 0xdc00); +      unicode_input_finish(); +    } else if ((code > 0x10ffff && input_mode == UC_OSX) || (code > 0xFFFFF && input_mode == UC_LNX)) { +      // when character is out of range supported by the OS +      unicode_map_input_error(); +    } else { +      unicode_input_start(); +      register_hex32(code); +      unicode_input_finish(); +    } +  } +  return true; +}
\ No newline at end of file diff --git a/quantum/process_keycode/process_unicodemap.h b/quantum/process_keycode/process_unicodemap.h new file mode 100644 index 0000000000..291bd8de03 --- /dev/null +++ b/quantum/process_keycode/process_unicodemap.h @@ -0,0 +1,8 @@ +#ifndef PROCESS_UNICODEMAP_H +#define PROCESS_UNICODEMAP_H + +#include "quantum.h" + +void unicode_map_input_error(void); +bool process_unicode_map(uint16_t keycode, keyrecord_t *record); +#endif
\ No newline at end of file | 
