diff options
Diffstat (limited to 'quantum/process_keycode')
| -rw-r--r-- | quantum/process_keycode/process_auto_shift.c | 8 | ||||
| -rw-r--r-- | quantum/process_keycode/process_combo.c | 184 | ||||
| -rw-r--r-- | quantum/process_keycode/process_combo.h | 4 | ||||
| -rw-r--r-- | quantum/process_keycode/process_haptic.c | 4 | ||||
| -rw-r--r-- | quantum/process_keycode/process_programmable_button.c | 31 | ||||
| -rw-r--r-- | quantum/process_keycode/process_programmable_button.h | 23 | ||||
| -rw-r--r-- | quantum/process_keycode/process_steno.c | 9 | ||||
| -rw-r--r-- | quantum/process_keycode/process_unicode_common.c | 47 | 
8 files changed, 202 insertions, 108 deletions
| diff --git a/quantum/process_keycode/process_auto_shift.c b/quantum/process_keycode/process_auto_shift.c index 51b0efdb47..cc3a974ea8 100644 --- a/quantum/process_keycode/process_auto_shift.c +++ b/quantum/process_keycode/process_auto_shift.c @@ -21,6 +21,12 @@  #    include "process_auto_shift.h" +#ifndef AUTO_SHIFT_DISABLED_AT_STARTUP +#   define AUTO_SHIFT_STARTUP_STATE true    /* enabled */ +#else +#   define AUTO_SHIFT_STARTUP_STATE false   /* disabled */ +#endif +  static uint16_t autoshift_time    = 0;  static uint16_t autoshift_timeout = AUTO_SHIFT_TIMEOUT;  static uint16_t autoshift_lastkey = KC_NO; @@ -34,7 +40,7 @@ static struct {      bool in_progress : 1;      // Whether the auto-shifted keypress has been registered.      bool holding_shift : 1; -} autoshift_flags = {true, false, false, false}; +} autoshift_flags = {AUTO_SHIFT_STARTUP_STATE, false, false, false};  /** \brief Record the press of an autoshiftable key   * diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c index e8661839c7..a050161edf 100644 --- a/quantum/process_keycode/process_combo.c +++ b/quantum/process_keycode/process_combo.c @@ -18,10 +18,9 @@  #include "process_combo.h"  #include "action_tapping.h" -  #ifdef COMBO_COUNT -__attribute__((weak)) combo_t  key_combos[COMBO_COUNT]; -uint16_t COMBO_LEN = COMBO_COUNT; +__attribute__((weak)) combo_t key_combos[COMBO_COUNT]; +uint16_t                      COMBO_LEN = COMBO_COUNT;  #else  extern combo_t  key_combos[];  extern uint16_t COMBO_LEN; @@ -46,64 +45,86 @@ __attribute__((weak)) bool process_combo_key_release(uint16_t combo_index, combo  #endif  #ifndef COMBO_NO_TIMER -static uint16_t timer                 = 0; +static uint16_t timer = 0;  #endif -static bool     b_combo_enable        = true;  // defaults to enabled -static uint16_t longest_term          = 0; +static bool     b_combo_enable = true;  // defaults to enabled +static uint16_t longest_term   = 0;  typedef struct {      keyrecord_t record; -    uint16_t combo_index; -    uint16_t keycode; +    uint16_t    combo_index; +    uint16_t    keycode;  } queued_record_t; -static uint8_t key_buffer_size = 0; +static uint8_t         key_buffer_size = 0;  static queued_record_t key_buffer[COMBO_KEY_BUFFER_LENGTH];  typedef struct {      uint16_t combo_index;  } queued_combo_t; -static uint8_t combo_buffer_write= 0; -static uint8_t combo_buffer_read = 0; +static uint8_t        combo_buffer_write = 0; +static uint8_t        combo_buffer_read  = 0;  static queued_combo_t combo_buffer[COMBO_BUFFER_LENGTH];  #define INCREMENT_MOD(i) i = (i + 1) % COMBO_BUFFER_LENGTH -#define COMBO_KEY_POS ((keypos_t){.col=254, .row=254}) - +#define COMBO_KEY_POS ((keypos_t){.col = 254, .row = 254})  #ifndef EXTRA_SHORT_COMBOS  /* flags are their own elements in combo_t struct. */ -#    define COMBO_ACTIVE(combo)   (combo->active) +#    define COMBO_ACTIVE(combo) (combo->active)  #    define COMBO_DISABLED(combo) (combo->disabled) -#    define COMBO_STATE(combo)    (combo->state) - -#    define ACTIVATE_COMBO(combo)    do {combo->active = true;}while(0) -#    define DEACTIVATE_COMBO(combo)  do {combo->active = false;}while(0) -#    define DISABLE_COMBO(combo)     do {combo->disabled = true;}while(0) -#    define RESET_COMBO_STATE(combo) do { \ -    combo->disabled = false; \ -    combo->state = 0; \ -}while(0) +#    define COMBO_STATE(combo) (combo->state) + +#    define ACTIVATE_COMBO(combo) \ +        do {                      \ +            combo->active = true; \ +        } while (0) +#    define DEACTIVATE_COMBO(combo) \ +        do {                        \ +            combo->active = false;  \ +        } while (0) +#    define DISABLE_COMBO(combo)    \ +        do {                        \ +            combo->disabled = true; \ +        } while (0) +#    define RESET_COMBO_STATE(combo) \ +        do {                         \ +            combo->disabled = false; \ +            combo->state    = 0;     \ +        } while (0)  #else  /* flags are at the two high bits of state. */ -#    define COMBO_ACTIVE(combo)   (combo->state & 0x80) +#    define COMBO_ACTIVE(combo) (combo->state & 0x80)  #    define COMBO_DISABLED(combo) (combo->state & 0x40) -#    define COMBO_STATE(combo)    (combo->state & 0x3F) - -#    define ACTIVATE_COMBO(combo)    do {combo->state |= 0x80;}while(0) -#    define DEACTIVATE_COMBO(combo)  do {combo->state &= ~0x80;}while(0) -#    define DISABLE_COMBO(combo)     do {combo->state |= 0x40;}while(0) -#    define RESET_COMBO_STATE(combo) do {combo->state &= ~0x7F;}while(0) +#    define COMBO_STATE(combo) (combo->state & 0x3F) + +#    define ACTIVATE_COMBO(combo) \ +        do {                      \ +            combo->state |= 0x80; \ +        } while (0) +#    define DEACTIVATE_COMBO(combo) \ +        do {                        \ +            combo->state &= ~0x80;  \ +        } while (0) +#    define DISABLE_COMBO(combo)  \ +        do {                      \ +            combo->state |= 0x40; \ +        } while (0) +#    define RESET_COMBO_STATE(combo) \ +        do {                         \ +            combo->state &= ~0x7F;   \ +        } while (0)  #endif  static inline void release_combo(uint16_t combo_index, combo_t *combo) {      if (combo->keycode) {          keyrecord_t record = { -            .event = { -                .key = COMBO_KEY_POS, -                .time = timer_read()|1, -                .pressed = false, -            }, +            .event = +                { +                    .key     = COMBO_KEY_POS, +                    .time    = timer_read() | 1, +                    .pressed = false, +                },              .keycode = combo->keycode,          };  #ifndef NO_ACTION_TAPPING @@ -123,18 +144,17 @@ static inline bool _get_combo_must_hold(uint16_t combo_index, combo_t *combo) {  #elif defined(COMBO_MUST_HOLD_PER_COMBO)      return get_combo_must_hold(combo_index, combo);  #elif defined(COMBO_MUST_HOLD_MODS) -    return (KEYCODE_IS_MOD(combo->keycode) || -            (combo->keycode >= QK_MOMENTARY && combo->keycode <= QK_MOMENTARY_MAX)); +    return (KEYCODE_IS_MOD(combo->keycode) || (combo->keycode >= QK_MOMENTARY && combo->keycode <= QK_MOMENTARY_MAX));  #endif      return false;  } -static inline uint16_t _get_wait_time(uint16_t combo_index, combo_t *combo ) { +static inline uint16_t _get_wait_time(uint16_t combo_index, combo_t *combo) {      if (_get_combo_must_hold(combo_index, combo)  #ifdef COMBO_MUST_TAP_PER_COMBO -            || get_combo_must_tap(combo_index, combo) +        || get_combo_must_tap(combo_index, combo)  #endif -       ) { +    ) {          if (longest_term < COMBO_HOLD_TERM) {              return COMBO_HOLD_TERM;          } @@ -144,9 +164,8 @@ static inline uint16_t _get_wait_time(uint16_t combo_index, combo_t *combo ) {  }  static inline uint16_t _get_combo_term(uint16_t combo_index, combo_t *combo) { -  #if defined(COMBO_TERM_PER_COMBO) -        return get_combo_term(combo_index, combo); +    return get_combo_term(combo_index, combo);  #endif      return COMBO_TERM; @@ -154,7 +173,7 @@ static inline uint16_t _get_combo_term(uint16_t combo_index, combo_t *combo) {  void clear_combos(void) {      uint16_t index = 0; -    longest_term = 0; +    longest_term   = 0;      for (index = 0; index < COMBO_LEN; ++index) {          combo_t *combo = &key_combos[index];          if (!COMBO_ACTIVE(combo)) { @@ -175,7 +194,7 @@ static inline void dump_key_buffer(void) {          key_buffer_next = key_buffer_i + 1;          queued_record_t *qrecord = &key_buffer[key_buffer_i]; -        keyrecord_t *record = &qrecord->record; +        keyrecord_t *    record  = &qrecord->record;          if (IS_NOEVENT(record->event)) {              continue; @@ -185,9 +204,9 @@ static inline void dump_key_buffer(void) {              process_combo_event(qrecord->combo_index, true);          } else {  #ifndef NO_ACTION_TAPPING -        action_tapping_process(*record); +            action_tapping_process(*record);  #else -        process_record(record); +            process_record(record);  #endif          }          record->event.time = 0; @@ -242,7 +261,9 @@ void apply_combo(uint16_t combo_index, combo_t *combo) {      /* Apply combo's result keycode to the last chord key of the combo and       * disable the other keys. */ -    if (COMBO_DISABLED(combo)) { return; } +    if (COMBO_DISABLED(combo)) { +        return; +    }      // state to check against so we find the last key of the combo from the buffer  #if defined(EXTRA_EXTRA_LONG_COMBOS) @@ -254,12 +275,11 @@ void apply_combo(uint16_t combo_index, combo_t *combo) {  #endif      for (uint8_t key_buffer_i = 0; key_buffer_i < key_buffer_size; key_buffer_i++) { -          queued_record_t *qrecord = &key_buffer[key_buffer_i]; -        keyrecord_t *record = &qrecord->record; -        uint16_t keycode = qrecord->keycode; +        keyrecord_t *    record  = &qrecord->record; +        uint16_t         keycode = qrecord->keycode; -        uint8_t key_count = 0; +        uint8_t  key_count = 0;          uint16_t key_index = -1;          _find_key_index_and_count(combo->keys, keycode, &key_index, &key_count); @@ -271,7 +291,7 @@ void apply_combo(uint16_t combo_index, combo_t *combo) {          KEY_STATE_DOWN(state, key_index);          if (ALL_COMBO_KEYS_ARE_DOWN(state, key_count)) {              // this in the end executes the combo when the key_buffer is dumped. -            record->keycode = combo->keycode; +            record->keycode   = combo->keycode;              record->event.key = COMBO_KEY_POS;              qrecord->combo_index = combo_index; @@ -283,19 +303,15 @@ void apply_combo(uint16_t combo_index, combo_t *combo) {              // by making it a TICK event.              record->event.time = 0;          } -      }      drop_combo_from_buffer(combo_index);  }  static inline void apply_combos(void) {      // Apply all buffered normal combos. -    for (uint8_t i = combo_buffer_read; -            i != combo_buffer_write; -            INCREMENT_MOD(i)) { - +    for (uint8_t i = combo_buffer_read; i != combo_buffer_write; INCREMENT_MOD(i)) {          queued_combo_t *buffered_combo = &combo_buffer[i]; -        combo_t *combo = &key_combos[buffered_combo->combo_index]; +        combo_t *       combo          = &key_combos[buffered_combo->combo_index];  #ifdef COMBO_MUST_TAP_PER_COMBO          if (get_combo_must_tap(buffered_combo->combo_index, combo)) { @@ -310,15 +326,15 @@ static inline void apply_combos(void) {      clear_combos();  } -combo_t* overlaps(combo_t *combo1, combo_t *combo2) { +combo_t *overlaps(combo_t *combo1, combo_t *combo2) {      /* Checks if the combos overlap and returns the combo that should be       * dropped from the combo buffer.       * The combo that has less keys will be dropped. If they have the same       * amount of keys, drop combo1. */ -    uint8_t idx1 = 0, idx2 = 0; +    uint8_t  idx1 = 0, idx2 = 0;      uint16_t key1, key2; -    bool overlaps = false; +    bool     overlaps = false;      while ((key1 = pgm_read_word(&combo1->keys[idx1])) != COMBO_END) {          idx2 = 0; @@ -335,7 +351,7 @@ combo_t* overlaps(combo_t *combo1, combo_t *combo2) {  }  static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) { -    uint8_t key_count = 0; +    uint8_t  key_count = 0;      uint16_t key_index = -1;      _find_key_index_and_count(combo->keys, keycode, &key_index, &key_count); @@ -369,12 +385,9 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *                  // disable readied combos that overlap with this combo                  combo_t *drop = NULL; -                for (uint8_t combo_buffer_i = combo_buffer_read; -                        combo_buffer_i != combo_buffer_write; -                        INCREMENT_MOD(combo_buffer_i)) { - -                    queued_combo_t *qcombo = &combo_buffer[combo_buffer_i]; -                    combo_t *buffered_combo = &key_combos[qcombo->combo_index]; +                for (uint8_t combo_buffer_i = combo_buffer_read; combo_buffer_i != combo_buffer_write; INCREMENT_MOD(combo_buffer_i)) { +                    queued_combo_t *qcombo         = &combo_buffer[combo_buffer_i]; +                    combo_t *       buffered_combo = &key_combos[qcombo->combo_index];                      if ((drop = overlaps(buffered_combo, combo))) {                          DISABLE_COMBO(drop); @@ -387,21 +400,19 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *                              INCREMENT_MOD(combo_buffer_read);                          }                      } -                  }                  if (drop != combo) {                      // save this combo to buffer                      combo_buffer[combo_buffer_write] = (queued_combo_t){ -                        .combo_index=combo_index, +                        .combo_index = combo_index,                      };                      INCREMENT_MOD(combo_buffer_write);                      // get possible longer waiting time for tap-/hold-only combos.                      longest_term = _get_wait_time(combo_index, combo);                  } -            } // if timer elapsed end - +            }  // if timer elapsed end          }      } else {          // chord releases @@ -416,7 +427,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *              else if (get_combo_must_tap(combo_index, combo)) {                  // immediately apply tap-only combo                  apply_combo(combo_index, combo); -                apply_combos(); // also apply other prepared combos and dump key buffer +                apply_combos();  // also apply other prepared combos and dump key buffer  #    ifdef COMBO_PROCESS_KEY_RELEASE                  if (process_combo_key_release(combo_index, combo, key_index, keycode)) {                      release_combo(combo_index, combo); @@ -424,10 +435,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *  #    endif              }  #endif -        } else if (COMBO_ACTIVE(combo) -                && ONLY_ONE_KEY_IS_DOWN(COMBO_STATE(combo)) -                && KEY_NOT_YET_RELEASED(COMBO_STATE(combo), key_index) -                ) { +        } else if (COMBO_ACTIVE(combo) && ONLY_ONE_KEY_IS_DOWN(COMBO_STATE(combo)) && KEY_NOT_YET_RELEASED(COMBO_STATE(combo), key_index)) {              /* last key released */              release_combo(combo_index, combo);              key_is_part_of_combo = true; @@ -435,9 +443,7 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *  #ifdef COMBO_PROCESS_KEY_RELEASE              process_combo_key_release(combo_index, combo, key_index, keycode);  #endif -        } else if (COMBO_ACTIVE(combo) -                && KEY_NOT_YET_RELEASED(COMBO_STATE(combo), key_index) -                ) { +        } else if (COMBO_ACTIVE(combo) && KEY_NOT_YET_RELEASED(COMBO_STATE(combo), key_index)) {              /* first or middle key released */              key_is_part_of_combo = true; @@ -489,21 +495,21 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {      if (record->event.pressed && is_combo_key) {  #ifndef COMBO_NO_TIMER -#   ifdef COMBO_STRICT_TIMER +#    ifdef COMBO_STRICT_TIMER          if (!timer) {              // timer is set only on the first key              timer = timer_read();          } -#   else +#    else          timer = timer_read(); -#   endif +#    endif  #endif          if (key_buffer_size < COMBO_KEY_BUFFER_LENGTH) {              key_buffer[key_buffer_size++] = (queued_record_t){ -                .record = *record, -                .keycode = keycode, -                .combo_index = -1, // this will be set when applying combos +                .record      = *record, +                .keycode     = keycode, +                .combo_index = -1,  // this will be set when applying combos              };          }      } else { @@ -532,7 +538,7 @@ void combo_task(void) {          if (combo_buffer_read != combo_buffer_write) {              apply_combos();              longest_term = 0; -            timer = 0; +            timer        = 0;          } else {              dump_key_buffer();              timer = 0; @@ -546,9 +552,9 @@ void combo_enable(void) { b_combo_enable = true; }  void combo_disable(void) {  #ifndef COMBO_NO_TIMER -    timer                      = 0; +    timer = 0;  #endif -    b_combo_enable = false; +    b_combo_enable    = false;      combo_buffer_read = combo_buffer_write;      clear_combos();      dump_key_buffer(); diff --git a/quantum/process_keycode/process_combo.h b/quantum/process_keycode/process_combo.h index 43c36d79e6..4c4e574e34 100644 --- a/quantum/process_keycode/process_combo.h +++ b/quantum/process_keycode/process_combo.h @@ -43,8 +43,8 @@ typedef struct {  #ifdef EXTRA_SHORT_COMBOS      uint8_t state;  #else -    bool disabled; -    bool active; +    bool     disabled; +    bool     active;  #    if defined(EXTRA_EXTRA_LONG_COMBOS)      uint32_t state;  #    elif defined(EXTRA_LONG_COMBOS) diff --git a/quantum/process_keycode/process_haptic.c b/quantum/process_keycode/process_haptic.c index 64d455d009..466c8e5543 100644 --- a/quantum/process_keycode/process_haptic.c +++ b/quantum/process_keycode/process_haptic.c @@ -17,6 +17,7 @@  #include "process_haptic.h"  #include "quantum_keycodes.h"  #include "action_tapping.h" +#include "usb_device_state.h"  __attribute__((weak)) bool get_haptic_enabled_key(uint16_t keycode, keyrecord_t *record) {      switch (keycode) { @@ -32,6 +33,7 @@ __attribute__((weak)) bool get_haptic_enabled_key(uint16_t keycode, keyrecord_t              break;          case KC_LCTRL ... KC_RGUI:          case QK_MOMENTARY ... QK_MOMENTARY_MAX: +        case QK_LAYER_MOD ... QK_LAYER_MOD_MAX:  #endif  #ifdef NO_HAPTIC_FN          case KC_FN0 ... KC_FN31: @@ -130,7 +132,7 @@ bool process_haptic(uint16_t keycode, keyrecord_t *record) {          }      } -    if (haptic_get_enable()) { +    if (haptic_get_enable() && ((!HAPTIC_OFF_IN_LOW_POWER) || (usb_device_state == USB_DEVICE_STATE_CONFIGURED))) {          if (record->event.pressed) {              // keypress              if (haptic_get_feedback() < 2 && get_haptic_enabled_key(keycode, record)) { diff --git a/quantum/process_keycode/process_programmable_button.c b/quantum/process_keycode/process_programmable_button.c new file mode 100644 index 0000000000..c6e77faacc --- /dev/null +++ b/quantum/process_keycode/process_programmable_button.c @@ -0,0 +1,31 @@ +/* +Copyright 2021 Thomas Weißschuh <thomas@t-8ch.de> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "process_programmable_button.h" +#include "programmable_button.h" + +bool process_programmable_button(uint16_t keycode, keyrecord_t *record) { +    if (keycode >= PROGRAMMABLE_BUTTON_MIN && keycode <= PROGRAMMABLE_BUTTON_MAX) { +        uint8_t button = keycode - PROGRAMMABLE_BUTTON_MIN + 1; +        if (record->event.pressed) { +            programmable_button_on(button); +        } else { +            programmable_button_off(button); +        } +    } +    return true; +} diff --git a/quantum/process_keycode/process_programmable_button.h b/quantum/process_keycode/process_programmable_button.h new file mode 100644 index 0000000000..47c6ce5614 --- /dev/null +++ b/quantum/process_keycode/process_programmable_button.h @@ -0,0 +1,23 @@ +/* +Copyright 2021 Thomas Weißschuh <thomas@t-8ch.de> + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +#pragma once + +#include <stdint.h> +#include "quantum.h" + +bool process_programmable_button(uint16_t keycode, keyrecord_t *record); diff --git a/quantum/process_keycode/process_steno.c b/quantum/process_keycode/process_steno.c index a964aead35..5d0bb313b4 100644 --- a/quantum/process_keycode/process_steno.c +++ b/quantum/process_keycode/process_steno.c @@ -67,7 +67,7 @@ static const uint8_t boltmap[64] PROGMEM = {TXB_NUL, TXB_NUM, TXB_NUM, TXB_NUM,  #ifdef STENO_COMBINEDMAP  /* Used to look up when pressing the middle row key to combine two consonant or vowel keys */ -static const uint16_t combinedmap_first[] PROGMEM = {STN_S1, STN_TL, STN_PL, STN_HL, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, STN_A, STN_E}; +static const uint16_t combinedmap_first[] PROGMEM  = {STN_S1, STN_TL, STN_PL, STN_HL, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR, STN_A, STN_E};  static const uint16_t combinedmap_second[] PROGMEM = {STN_S2, STN_KL, STN_WL, STN_RL, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR, STN_O, STN_U};  #endif @@ -174,11 +174,10 @@ bool process_steno(uint16_t keycode, keyrecord_t *record) {              return false;  #ifdef STENO_COMBINEDMAP -        case QK_STENO_COMB ... QK_STENO_COMB_MAX: -        { +        case QK_STENO_COMB ... QK_STENO_COMB_MAX: {              uint8_t result; -            result = process_steno(combinedmap_first[keycode-QK_STENO_COMB], record); -            result &= process_steno(combinedmap_second[keycode-QK_STENO_COMB], record); +            result = process_steno(combinedmap_first[keycode - QK_STENO_COMB], record); +            result &= process_steno(combinedmap_second[keycode - QK_STENO_COMB], record);              return result;          }  #endif diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c index 46fcaaa86b..7853c22c5d 100644 --- a/quantum/process_keycode/process_unicode_common.c +++ b/quantum/process_keycode/process_unicode_common.c @@ -22,6 +22,7 @@  unicode_config_t unicode_config;  uint8_t          unicode_saved_mods;  bool             unicode_saved_caps_lock; +bool             unicode_saved_num_lock;  #if UNICODE_SELECTED_MODES != -1  static uint8_t selected[]     = {UNICODE_SELECTED_MODES}; @@ -79,13 +80,14 @@ void persist_unicode_input_mode(void) { eeprom_update_byte(EECONFIG_UNICODEMODE,  __attribute__((weak)) void unicode_input_start(void) {      unicode_saved_caps_lock = host_keyboard_led_state().caps_lock; +    unicode_saved_num_lock  = host_keyboard_led_state().num_lock;      // Note the order matters here!      // Need to do this before we mess around with the mods, or else      // UNICODE_KEY_LNX (which is usually Ctrl-Shift-U) might not work      // correctly in the shifted case.      if (unicode_config.input_mode == UC_LNX && unicode_saved_caps_lock) { -        tap_code(KC_CAPS); +        tap_code(KC_CAPSLOCK);      }      unicode_saved_mods = get_mods();  // Save current mods @@ -99,8 +101,12 @@ __attribute__((weak)) void unicode_input_start(void) {              tap_code16(UNICODE_KEY_LNX);              break;          case UC_WIN: +            // For increased reliability, use numpad keys for inputting digits +            if (!unicode_saved_num_lock) { +                tap_code(KC_NUMLOCK); +            }              register_code(KC_LALT); -            tap_code(KC_PPLS); +            tap_code(KC_KP_PLUS);              break;          case UC_WINC:              tap_code(UNICODE_KEY_WINC); @@ -117,13 +123,16 @@ __attribute__((weak)) void unicode_input_finish(void) {              unregister_code(UNICODE_KEY_MAC);              break;          case UC_LNX: -            tap_code(KC_SPC); +            tap_code(KC_SPACE);              if (unicode_saved_caps_lock) { -                tap_code(KC_CAPS); +                tap_code(KC_CAPSLOCK);              }              break;          case UC_WIN:              unregister_code(KC_LALT); +            if (!unicode_saved_num_lock) { +                tap_code(KC_NUMLOCK); +            }              break;          case UC_WINC:              tap_code(KC_ENTER); @@ -139,26 +148,44 @@ __attribute__((weak)) void unicode_input_cancel(void) {              unregister_code(UNICODE_KEY_MAC);              break;          case UC_LNX: -            tap_code(KC_ESC); +            tap_code(KC_ESCAPE);              if (unicode_saved_caps_lock) { -                tap_code(KC_CAPS); +                tap_code(KC_CAPSLOCK);              }              break;          case UC_WINC: -            tap_code(KC_ESC); +            tap_code(KC_ESCAPE);              break;          case UC_WIN:              unregister_code(KC_LALT); +            if (!unicode_saved_num_lock) { +                tap_code(KC_NUMLOCK); +            }              break;      }      set_mods(unicode_saved_mods);  // Reregister previously set mods  } +// clang-format off + +static void send_nibble_wrapper(uint8_t digit) { +    if (unicode_config.input_mode == UC_WIN) { +        uint8_t kc = digit < 10 +                   ? KC_KP_1 + (10 + digit - 1) % 10 +                   : KC_A + (digit - 10); +        tap_code(kc); +        return; +    } +    send_nibble(digit); +} + +// clang-format on +  void register_hex(uint16_t hex) {      for (int i = 3; i >= 0; i--) {          uint8_t digit = ((hex >> (i * 4)) & 0xF); -        send_nibble(digit); +        send_nibble_wrapper(digit);      }  } @@ -171,10 +198,10 @@ void register_hex32(uint32_t hex) {          uint8_t digit = ((hex >> (i * 4)) & 0xF);          if (digit == 0) {              if (!onzerostart) { -                send_nibble(digit); +                send_nibble_wrapper(digit);              }          } else { -            send_nibble(digit); +            send_nibble_wrapper(digit);              onzerostart = false;          }      } | 
