diff --git a/src/Kaleidoscope-Macros.cpp b/src/Kaleidoscope-Macros.cpp index d9a271b2..2e658a0c 100644 --- a/src/Kaleidoscope-Macros.cpp +++ b/src/Kaleidoscope-Macros.cpp @@ -7,10 +7,25 @@ const macro_t *macroAction(uint8_t macroIndex, uint8_t keyState) { byte Macros_::row, Macros_::col; +static void readKeyCodeAndPlay (const macro_t *macro_p, uint8_t flags, uint8_t keyStates) { + Key key; + key.flags = flags; + key.keyCode = pgm_read_byte(macro_p++); + + if (keyStates & IS_PRESSED) { + handle_key_event(key, UNKNOWN_KEYSWITCH_LOCATION, IS_PRESSED | INJECTED); + Keyboard.sendReport(); + } + if (keyStates & WAS_PRESSED) { + handle_key_event(key, UNKNOWN_KEYSWITCH_LOCATION, WAS_PRESSED | INJECTED); + Keyboard.sendReport(); + } +} + void Macros_::play(const macro_t *macro_p) { macro_t macro = END; uint8_t interval = 0; - Key key; + uint8_t flags; if (!macro_p) return; @@ -26,17 +41,28 @@ void Macros_::play(const macro_t *macro_p) { break; } case MACRO_ACTION_STEP_KEYDOWN: - key.flags = pgm_read_byte(macro_p++); - key.keyCode = pgm_read_byte(macro_p++); - handle_key_event(key, 255, 255, IS_PRESSED | INJECTED); - Keyboard.sendReport(); + flags = pgm_read_byte(macro_p++); + readKeyCodeAndPlay (macro_p++, flags, IS_PRESSED); break; case MACRO_ACTION_STEP_KEYUP: - key.flags = pgm_read_byte(macro_p++); - key.keyCode = pgm_read_byte(macro_p++); - handle_key_event(key, 255, 255, WAS_PRESSED | INJECTED); - Keyboard.sendReport(); + flags = pgm_read_byte(macro_p++); + readKeyCodeAndPlay (macro_p++, flags, WAS_PRESSED); break; + case MACRO_ACTION_STEP_TAP: + flags = pgm_read_byte(macro_p++); + readKeyCodeAndPlay (macro_p++, flags, IS_PRESSED | WAS_PRESSED); + break; + + case MACRO_ACTION_STEP_KEYCODEDOWN: + readKeyCodeAndPlay (macro_p++, 0, IS_PRESSED); + break; + case MACRO_ACTION_STEP_KEYCODEUP: + readKeyCodeAndPlay (macro_p++, 0, WAS_PRESSED); + break; + case MACRO_ACTION_STEP_TAPCODE: + readKeyCodeAndPlay (macro_p++, 0, IS_PRESSED | WAS_PRESSED); + break; + case END: default: return; diff --git a/src/MacroSteps.h b/src/MacroSteps.h index 2bef68cb..7b92f526 100644 --- a/src/MacroSteps.h +++ b/src/MacroSteps.h @@ -5,8 +5,14 @@ typedef enum { MACRO_ACTION_STEP_INTERVAL, MACRO_ACTION_STEP_WAIT, + MACRO_ACTION_STEP_KEYDOWN, MACRO_ACTION_STEP_KEYUP, + MACRO_ACTION_STEP_TAP, + + MACRO_ACTION_STEP_KEYCODEDOWN, + MACRO_ACTION_STEP_KEYCODEUP, + MACRO_ACTION_STEP_TAPCODE, } MacroActionStepType; typedef uint8_t macro_t; @@ -17,10 +23,16 @@ typedef uint8_t macro_t; #define I(n) MACRO_ACTION_STEP_INTERVAL, n #define W(n) MACRO_ACTION_STEP_WAIT, n + #define Dr(k) MACRO_ACTION_STEP_KEYDOWN, (k).flags, (k).keyCode #define D(k) Dr(Key_ ## k) #define Ur(k) MACRO_ACTION_STEP_KEYUP, (k).flags, (k).keyCode #define U(k) Ur(Key_ ## k) -#define Tr(k) Dr(k), Ur(k) -#define T(k) D(k), U(k) +#define Tr(k) MACRO_ACTION_STEP_TAP, (k).flags, (k).keyCode +#define T(k) Tr(Key_ ## k) + +#define Dc(k) MACRO_ACTION_STEP_KEYCODEDOWN, (Key_ ## k).keyCode +#define Uc(k) MACRO_ACTION_STEP_KEYCODEUP, (Key_ ## k).keyCode +#define Tc(k) MACRO_ACTION_STEP_TAPCODE, (Key_ ## k).keyCode + #define END MACRO_ACTION_END