Add support for delays in send_string. (#8244)
This commit is contained in:
parent
e18be69104
commit
444fd3b1cc
|
@ -107,6 +107,16 @@ Would tap `KC_HOME` - note how the prefix is now `X_`, and not `KC_`. You can al
|
||||||
|
|
||||||
Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline).
|
Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline).
|
||||||
|
|
||||||
|
Delays can be also added to the string:
|
||||||
|
|
||||||
|
* `SS_DELAY(msecs)` will delay for the specified number of milliseconds.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
SEND_STRING("VE" SS_DELAY(1000) SS_TAP(X_HOME) "LO");
|
||||||
|
|
||||||
|
Which would send "VE" followed by a 1-second delay, then a `KC_HOME` tap, and "LO" (spelling "LOVE" if on a newline, but delayed in the middle).
|
||||||
|
|
||||||
There's also a couple of mod shortcuts you can use:
|
There's also a couple of mod shortcuts you can use:
|
||||||
|
|
||||||
* `SS_LCTL(string)`
|
* `SS_LCTL(string)`
|
||||||
|
@ -200,11 +210,11 @@ This will clear all mods currently pressed.
|
||||||
|
|
||||||
This will clear all keys besides the mods currently pressed.
|
This will clear all keys besides the mods currently pressed.
|
||||||
|
|
||||||
## Advanced Example:
|
## Advanced Example:
|
||||||
|
|
||||||
### Super ALT↯TAB
|
### Super ALT↯TAB
|
||||||
|
|
||||||
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
|
This macro will register `KC_LALT` and tap `KC_TAB`, then wait for 1000ms. If the key is tapped again, it will send another `KC_TAB`; if there is no tap, `KC_LALT` will be unregistered, thus allowing you to cycle through windows.
|
||||||
|
|
||||||
```c
|
```c
|
||||||
bool is_alt_tab_active = false; # ADD this near the begining of keymap.c
|
bool is_alt_tab_active = false; # ADD this near the begining of keymap.c
|
||||||
|
@ -221,7 +231,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
if (!is_alt_tab_active) {
|
if (!is_alt_tab_active) {
|
||||||
is_alt_tab_active = true;
|
is_alt_tab_active = true;
|
||||||
register_code(KC_LALT);
|
register_code(KC_LALT);
|
||||||
}
|
}
|
||||||
alt_tab_timer = timer_read();
|
alt_tab_timer = timer_read();
|
||||||
register_code(KC_TAB);
|
register_code(KC_TAB);
|
||||||
} else {
|
} else {
|
||||||
|
@ -232,7 +242,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void matrix_scan_user(void) { # The very important timer.
|
void matrix_scan_user(void) { # The very important timer.
|
||||||
if (is_alt_tab_active) {
|
if (is_alt_tab_active) {
|
||||||
if (timer_elapsed(alt_tab_timer) > 1000) {
|
if (timer_elapsed(alt_tab_timer) > 1000) {
|
||||||
unregister_code(KC_LALT);
|
unregister_code(KC_LALT);
|
||||||
|
@ -321,7 +331,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## Advanced Example:
|
## Advanced Example:
|
||||||
|
|
||||||
### Single-Key Copy/Paste
|
### Single-Key Copy/Paste
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
||||||
#ifdef PROTOCOL_LUFA
|
#ifdef PROTOCOL_LUFA
|
||||||
|
@ -374,19 +375,32 @@ void send_string_with_delay(const char *str, uint8_t interval) {
|
||||||
while (1) {
|
while (1) {
|
||||||
char ascii_code = *str;
|
char ascii_code = *str;
|
||||||
if (!ascii_code) break;
|
if (!ascii_code) break;
|
||||||
if (ascii_code == SS_TAP_CODE) {
|
if (ascii_code == SS_QMK_PREFIX) {
|
||||||
// tap
|
ascii_code = *(++str);
|
||||||
uint8_t keycode = *(++str);
|
if (ascii_code == SS_TAP_CODE) {
|
||||||
register_code(keycode);
|
// tap
|
||||||
unregister_code(keycode);
|
uint8_t keycode = *(++str);
|
||||||
} else if (ascii_code == SS_DOWN_CODE) {
|
register_code(keycode);
|
||||||
// down
|
unregister_code(keycode);
|
||||||
uint8_t keycode = *(++str);
|
} else if (ascii_code == SS_DOWN_CODE) {
|
||||||
register_code(keycode);
|
// down
|
||||||
} else if (ascii_code == SS_UP_CODE) {
|
uint8_t keycode = *(++str);
|
||||||
// up
|
register_code(keycode);
|
||||||
uint8_t keycode = *(++str);
|
} else if (ascii_code == SS_UP_CODE) {
|
||||||
unregister_code(keycode);
|
// up
|
||||||
|
uint8_t keycode = *(++str);
|
||||||
|
unregister_code(keycode);
|
||||||
|
} else if (ascii_code == SS_DELAY_CODE) {
|
||||||
|
// delay
|
||||||
|
int ms = 0;
|
||||||
|
uint8_t keycode = *(++str);
|
||||||
|
while (isdigit(keycode)) {
|
||||||
|
ms *= 10;
|
||||||
|
ms += keycode - '0';
|
||||||
|
keycode = *(++str);
|
||||||
|
}
|
||||||
|
while (ms--) wait_ms(1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
send_char(ascii_code);
|
send_char(ascii_code);
|
||||||
}
|
}
|
||||||
|
@ -403,19 +417,32 @@ void send_string_with_delay_P(const char *str, uint8_t interval) {
|
||||||
while (1) {
|
while (1) {
|
||||||
char ascii_code = pgm_read_byte(str);
|
char ascii_code = pgm_read_byte(str);
|
||||||
if (!ascii_code) break;
|
if (!ascii_code) break;
|
||||||
if (ascii_code == SS_TAP_CODE) {
|
if (ascii_code == SS_QMK_PREFIX) {
|
||||||
// tap
|
ascii_code = pgm_read_byte(++str);
|
||||||
uint8_t keycode = pgm_read_byte(++str);
|
if (ascii_code == SS_TAP_CODE) {
|
||||||
register_code(keycode);
|
// tap
|
||||||
unregister_code(keycode);
|
uint8_t keycode = pgm_read_byte(++str);
|
||||||
} else if (ascii_code == SS_DOWN_CODE) {
|
register_code(keycode);
|
||||||
// down
|
unregister_code(keycode);
|
||||||
uint8_t keycode = pgm_read_byte(++str);
|
} else if (ascii_code == SS_DOWN_CODE) {
|
||||||
register_code(keycode);
|
// down
|
||||||
} else if (ascii_code == SS_UP_CODE) {
|
uint8_t keycode = pgm_read_byte(++str);
|
||||||
// up
|
register_code(keycode);
|
||||||
uint8_t keycode = pgm_read_byte(++str);
|
} else if (ascii_code == SS_UP_CODE) {
|
||||||
unregister_code(keycode);
|
// up
|
||||||
|
uint8_t keycode = pgm_read_byte(++str);
|
||||||
|
unregister_code(keycode);
|
||||||
|
} else if (ascii_code == SS_DELAY_CODE) {
|
||||||
|
// delay
|
||||||
|
int ms = 0;
|
||||||
|
uint8_t keycode = pgm_read_byte(++str);
|
||||||
|
while (isdigit(keycode)) {
|
||||||
|
ms *= 10;
|
||||||
|
ms += keycode - '0';
|
||||||
|
keycode = pgm_read_byte(++str);
|
||||||
|
}
|
||||||
|
while (ms--) wait_ms(1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
send_char(ascii_code);
|
send_char(ascii_code);
|
||||||
}
|
}
|
||||||
|
|
|
@ -382,13 +382,17 @@
|
||||||
#define ADD_SLASH_X(y) STRINGIZE(\x##y)
|
#define ADD_SLASH_X(y) STRINGIZE(\x##y)
|
||||||
#define SYMBOL_STR(x) ADD_SLASH_X(x)
|
#define SYMBOL_STR(x) ADD_SLASH_X(x)
|
||||||
|
|
||||||
|
#define SS_QMK_PREFIX 1
|
||||||
|
|
||||||
#define SS_TAP_CODE 1
|
#define SS_TAP_CODE 1
|
||||||
#define SS_DOWN_CODE 2
|
#define SS_DOWN_CODE 2
|
||||||
#define SS_UP_CODE 3
|
#define SS_UP_CODE 3
|
||||||
|
#define SS_DELAY_CODE 4
|
||||||
|
|
||||||
#define SS_TAP(keycode) "\1" SYMBOL_STR(keycode)
|
#define SS_TAP(keycode) "\1\1" SYMBOL_STR(keycode)
|
||||||
#define SS_DOWN(keycode) "\2" SYMBOL_STR(keycode)
|
#define SS_DOWN(keycode) "\1\2" SYMBOL_STR(keycode)
|
||||||
#define SS_UP(keycode) "\3" SYMBOL_STR(keycode)
|
#define SS_UP(keycode) "\1\3" SYMBOL_STR(keycode)
|
||||||
|
#define SS_DELAY(msecs) "\1\4" STRINGIZE(msecs) "|"
|
||||||
|
|
||||||
// `string` arguments must not be parenthesized
|
// `string` arguments must not be parenthesized
|
||||||
#define SS_LCTL(string) SS_DOWN(X_LCTL) string SS_UP(X_LCTL)
|
#define SS_LCTL(string) SS_DOWN(X_LCTL) string SS_UP(X_LCTL)
|
||||||
|
|
Loading…
Reference in New Issue