From c0e6a28bc62f659b0564a203df670d81a89a3bb4 Mon Sep 17 00:00:00 2001
From: Jason Ken Adhinarta <35003073+jasonkena@users.noreply.github.com>
Date: Mon, 3 Oct 2022 03:26:47 -0400
Subject: [PATCH] Prevent tap dance from wiping dynamic macros (#17880)

---
 .../process_keycode/process_dynamic_macro.c   | 22 ++++++++++++-------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/quantum/process_keycode/process_dynamic_macro.c b/quantum/process_keycode/process_dynamic_macro.c
index a7555fdd404..41207092a99 100644
--- a/quantum/process_keycode/process_dynamic_macro.c
+++ b/quantum/process_keycode/process_dynamic_macro.c
@@ -45,6 +45,10 @@ __attribute__((weak)) void dynamic_macro_record_end_user(int8_t direction) {
     dynamic_macro_led_blink();
 }
 
+__attribute__((weak)) bool dynamic_macro_valid_key_user(uint16_t keycode, keyrecord_t *record) {
+    return true;
+}
+
 /* Convenience macros used for retrieving the debug info. All of them
  * need a `direction` variable accessible at the call site.
  */
@@ -252,14 +256,16 @@ bool process_dynamic_macro(uint16_t keycode, keyrecord_t *record) {
                 return false;
 #endif
             default:
-                /* Store the key in the macro buffer and process it normally. */
-                switch (macro_id) {
-                    case 1:
-                        dynamic_macro_record_key(macro_buffer, &macro_pointer, r_macro_end, +1, record);
-                        break;
-                    case 2:
-                        dynamic_macro_record_key(r_macro_buffer, &macro_pointer, macro_end, -1, record);
-                        break;
+                if (dynamic_macro_valid_key_user(keycode, record)) {
+                    /* Store the key in the macro buffer and process it normally. */
+                    switch (macro_id) {
+                        case 1:
+                            dynamic_macro_record_key(macro_buffer, &macro_pointer, r_macro_end, +1, record);
+                            break;
+                        case 2:
+                            dynamic_macro_record_key(r_macro_buffer, &macro_pointer, macro_end, -1, record);
+                            break;
+                    }
                 }
                 return true;
                 break;