diff options
| author | Stephen Ostermiller <stephenostermiller@users.noreply.github.com> | 2025-11-23 06:32:36 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-23 22:32:36 +1100 |
| commit | 1a954e8da5dcbd81eeccb9d6ac41b6eda64d7b85 (patch) | |
| tree | 4f09599d467a9c9bbb1dde722511139fa965ff03 /quantum/process_keycode/process_tap_dance.h | |
| parent | c7e17538eea98540dbee71de5d024db99f7786fe (diff) | |
Reduce tap dance memory usage, move state out of data (#25415)
* Use less tap dance memory.
Use dynamically allocated sparse array for tap dance state, dynamically allocate tap dance state when needed and free it when the tap dance is done.
* new approach
* Use null, check for null
* Reformat with docker
* Use uint8 with idx rather than uint16 with keycode in state
* fix accidental change
* reformat
* Add null check
* add documentation tip suggested by tzarc
* Only allow tap dance state allocation on key down, not on key up
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
* Only allow tap dance allocation on key down, not on key up
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
* add user action required section
---------
Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Diffstat (limited to 'quantum/process_keycode/process_tap_dance.h')
| -rw-r--r-- | quantum/process_keycode/process_tap_dance.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/quantum/process_keycode/process_tap_dance.h b/quantum/process_keycode/process_tap_dance.h index 5cccbdf439..5a972cee5a 100644 --- a/quantum/process_keycode/process_tap_dance.h +++ b/quantum/process_keycode/process_tap_dance.h | |||
| @@ -28,15 +28,16 @@ typedef struct { | |||
| 28 | #ifndef NO_ACTION_ONESHOT | 28 | #ifndef NO_ACTION_ONESHOT |
| 29 | uint8_t oneshot_mods; | 29 | uint8_t oneshot_mods; |
| 30 | #endif | 30 | #endif |
| 31 | bool pressed : 1; | 31 | bool pressed : 1; |
| 32 | bool finished : 1; | 32 | bool finished : 1; |
| 33 | bool interrupted : 1; | 33 | bool interrupted : 1; |
| 34 | bool in_use : 1; | ||
| 35 | uint8_t index; | ||
| 34 | } tap_dance_state_t; | 36 | } tap_dance_state_t; |
| 35 | 37 | ||
| 36 | typedef void (*tap_dance_user_fn_t)(tap_dance_state_t *state, void *user_data); | 38 | typedef void (*tap_dance_user_fn_t)(tap_dance_state_t *state, void *user_data); |
| 37 | 39 | ||
| 38 | typedef struct tap_dance_action_t { | 40 | typedef struct tap_dance_action_t { |
| 39 | tap_dance_state_t state; | ||
| 40 | struct { | 41 | struct { |
| 41 | tap_dance_user_fn_t on_each_tap; | 42 | tap_dance_user_fn_t on_each_tap; |
| 42 | tap_dance_user_fn_t on_dance_finished; | 43 | tap_dance_user_fn_t on_dance_finished; |
| @@ -80,6 +81,8 @@ typedef struct { | |||
| 80 | 81 | ||
| 81 | void reset_tap_dance(tap_dance_state_t *state); | 82 | void reset_tap_dance(tap_dance_state_t *state); |
| 82 | 83 | ||
| 84 | tap_dance_state_t *tap_dance_get_state(uint8_t tap_dance_idx); | ||
| 85 | |||
| 83 | /* To be used internally */ | 86 | /* To be used internally */ |
| 84 | 87 | ||
| 85 | bool preprocess_tap_dance(uint16_t keycode, keyrecord_t *record); | 88 | bool preprocess_tap_dance(uint16_t keycode, keyrecord_t *record); |
