This commit is contained in:
Chaser Huang 2024-11-19 18:24:14 -08:00 committed by GitHub
commit 23aa2bd176
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 7 deletions

View File

@ -32,12 +32,13 @@ For the details about the internals of the dynamic macros, please read the comme
There are a number of options added that should allow some additional degree of customization There are a number of options added that should allow some additional degree of customization
|Define |Default |Description | |Define |Default |Description |
|----------------------------|----------------|-----------------------------------------------------------------------------------------------------------------| |------------------------------------------|----------------|-----------------------------------------------------------------------------------------------------------------|
|`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. | |`DYNAMIC_MACRO_SIZE` |128 |Sets the amount of memory that Dynamic Macros can use. This is a limited resource, dependent on the controller. |
|`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. | |`DYNAMIC_MACRO_USER_CALL` |*Not defined* |Defining this falls back to using the user `keymap.c` file to trigger the macro behavior. |
|`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). | |`DYNAMIC_MACRO_NO_NESTING` |*Not Defined* |Defining this disables the ability to call a macro from another macro (nested macros). |
|`DYNAMIC_MACRO_DELAY` |*Not Defined* |Sets the waiting time (ms unit) when sending each key. | |`DYNAMIC_MACRO_DELAY` |*Not Defined* |Sets the waiting time (ms unit) when sending each key. |
|`DYNAMIC_MACRO_KEEP_ORIGINAL_LAYER_STATE` |*Not Defined* |Defining this keeps the layer state when starting to record a macro |
If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header). If the LEDs start blinking during the recording with each keypress, it means there is no more space for the macro in the macro buffer. To fit the macro in, either make the other macro shorter (they share the same buffer) or increase the buffer size by adding the `DYNAMIC_MACRO_SIZE` define in your `config.h` (default value: 128; please read the comments for it in the header).

View File

@ -89,6 +89,11 @@ __attribute__((weak)) bool dynamic_macro_valid_key_user(uint16_t keycode, keyrec
#define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) ((int)(direction * ((POINTER) - (BEGIN)))) #define DYNAMIC_MACRO_CURRENT_LENGTH(BEGIN, POINTER) ((int)(direction * ((POINTER) - (BEGIN))))
#define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) ((int)(direction * ((END2) - (BEGIN)) + 1)) #define DYNAMIC_MACRO_CURRENT_CAPACITY(BEGIN, END2) ((int)(direction * ((END2) - (BEGIN)) + 1))
#ifdef DYNAMIC_MACRO_KEEP_ORIGINAL_LAYER_STATE
static layer_state_t dm1_layer_state;
static layer_state_t dm2_layer_state;
#endif
/** /**
* Start recording of the dynamic macro. * Start recording of the dynamic macro.
* *
@ -100,8 +105,16 @@ void dynamic_macro_record_start(keyrecord_t **macro_pointer, keyrecord_t *macro_
dynamic_macro_record_start_kb(direction); dynamic_macro_record_start_kb(direction);
clear_keyboard(); #ifdef DYNAMIC_MACRO_KEEP_ORIGINAL_LAYER_STATE
if (direction == 1) {
dm1_layer_state = layer_state;
} else if (direction == -1) {
dm2_layer_state = layer_state;
}
#else
layer_clear(); layer_clear();
#endif
clear_keyboard();
*macro_pointer = macro_buffer; *macro_pointer = macro_buffer;
} }
@ -118,7 +131,15 @@ void dynamic_macro_play(keyrecord_t *macro_buffer, keyrecord_t *macro_end, int8_
layer_state_t saved_layer_state = layer_state; layer_state_t saved_layer_state = layer_state;
clear_keyboard(); clear_keyboard();
#ifdef DYNAMIC_MACRO_KEEP_ORIGINAL_LAYER_STATE
if (direction == 1) {
layer_state_set(dm1_layer_state);
} else if (direction == -1) {
layer_state_set(dm2_layer_state);
}
#else
layer_clear(); layer_clear();
#endif
while (macro_buffer != macro_end) { while (macro_buffer != macro_end) {
process_record(macro_buffer); process_record(macro_buffer);