summaryrefslogtreecommitdiff
path: root/docs/ChangeLog
diff options
context:
space:
mode:
authorStephen Ostermiller <stephenostermiller@users.noreply.github.com>2025-11-23 06:32:36 -0500
committerGitHub <noreply@github.com>2025-11-23 22:32:36 +1100
commit1a954e8da5dcbd81eeccb9d6ac41b6eda64d7b85 (patch)
tree4f09599d467a9c9bbb1dde722511139fa965ff03 /docs/ChangeLog
parentc7e17538eea98540dbee71de5d024db99f7786fe (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 'docs/ChangeLog')
-rw-r--r--docs/ChangeLog/20250831/pr25415.md47
1 files changed, 47 insertions, 0 deletions
diff --git a/docs/ChangeLog/20250831/pr25415.md b/docs/ChangeLog/20250831/pr25415.md
new file mode 100644
index 0000000000..54eb8c737e
--- /dev/null
+++ b/docs/ChangeLog/20250831/pr25415.md
@@ -0,0 +1,47 @@
1# Tap dance state removed from `tap_dance_action_t`
2
3The tap dance state has been separated from the action structure. Custom tap dance functions now receive the state as a separate parameter instead of accessing it through `action->state`.
4
5## User Action Required
6
7If your keymap uses custom tap dance functions that access the tap dance state, you need to update your code.
8
9 - You can't use `action->state`. Instead you need to call `tap_dance_state_t *tap_dance_get_state(uint8_t tap_dance_idx)` to get the state.
10 - You now get a pointer to the state, so use `->` notation rather than `.` notation to get fields from it.
11
12### Before:
13```c
14bool process_record_user(uint16_t keycode, keyrecord_t *record) {
15 tap_dance_action_t *action;
16
17 switch (keycode) {
18 case TD(CT_CLN):
19 action = tap_dance_get(QK_TAP_DANCE_GET_INDEX(keycode));
20 if (!record->event.pressed && action->state.count && !action->state.finished) {
21 tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
22 tap_code16(tap_hold->tap);
23 }
24
25 }
26 return true;
27}
28```
29
30### After:
31```c
32bool process_record_user(uint16_t keycode, keyrecord_t *record) {
33 tap_dance_action_t *action;
34 tap_dance_state_t* state;
35
36 switch (keycode) {
37 case TD(CT_CLN):
38 action = tap_dance_get(QK_TAP_DANCE_GET_INDEX(keycode));
39 state = tap_dance_get_state(QK_TAP_DANCE_GET_INDEX(keycode));
40 if (!record->event.pressed && state != NULL && state->count && !state->finished) {
41 tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
42 tap_code16(tap_hold->tap);
43 }
44 }
45 return true;
46}
47```