This commit is contained in:
Garretonzo 2024-11-20 23:06:05 -08:00 committed by GitHub
commit f8a2121ddf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 46 additions and 1 deletions

View File

@ -144,6 +144,8 @@ If you define these options you will enable the associated feature, which may in
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define STRICT_LAYER_RELEASE`
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
* `#define KEYCODE_CACHE_ENABLE`
* Cache keycode for pressed keys, to be used on key release, across entire physical keyboard layout.
## Behaviors That Can Be Configured

View File

@ -287,6 +287,31 @@ uint8_t read_source_layers_cache(keypos_t key) {
# endif // ENCODER_MAP_ENABLE
return 0;
}
# ifdef KEYCODE_CACHE_ENABLE
static uint16_t keycode_map[MATRIX_ROWS][MATRIX_COLS] = {{KC_NO}};
/** \brief update keycode map
*
* Updates map of keycodes when a key is pressed down
*/
void update_keycode_map(keypos_t key, uint16_t keycode) {
if (key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
keycode_map[key.row][key.col] = keycode;
}
}
/** \brief read keycode map
*
* reads from map of keycodes when a key is released
*/
uint16_t read_keycode_map(keypos_t key) {
if (key.row < MATRIX_ROWS && key.col < MATRIX_COLS) {
return keycode_map[key.row][key.col];
}
return KC_NO;
}
# endif
#endif
/** \brief Store or get action (FIXME: Needs better summary)
@ -303,14 +328,27 @@ action_t store_or_get_action(bool pressed, keypos_t key) {
}
uint8_t layer;
# ifdef KEYCODE_CACHE_ENABLE
uint16_t keycode;
# endif
if (pressed) {
layer = layer_switch_get_layer(key);
update_source_layers_cache(key, layer);
# ifdef KEYCODE_CACHE_ENABLE
keycode = keymap_key_to_keycode(layer, key);
update_keycode_map(key, keycode);
# endif
} else {
layer = read_source_layers_cache(key);
# ifdef KEYCODE_CACHE_ENABLE
keycode = read_keycode_map(key);
# endif
}
# ifndef KEYCODE_CACHE_ENABLE
return action_for_key(layer, key);
# else
return action_for_keycode(keycode);
# endif
#else
return layer_switch_get_action(key);
#endif

View File

@ -160,6 +160,11 @@ layer_state_t update_tri_layer_state(layer_state_t state, uint8_t layer1, uint8_
void update_source_layers_cache(keypos_t key, uint8_t layer);
uint8_t read_source_layers_cache(keypos_t key);
# ifdef KEYCODE_CACHE_ENABLE
void update_keycode_map(keypos_t key, uint16_t keycode);
uint16_t read_keycode_map(keypos_t key);
uint16_t keymap_key_to_keycode(uint8_t layer, keypos_t key);
# endif
#endif
action_t store_or_get_action(bool pressed, keypos_t key);