~ruther/qmk_firmware

908966bdf36605301d27cdcae82c3201c156a43f — Drashna Jaelre 6 years ago 6a4c548 + d15bb05
Fixed tap/down/up handling in dynamic keymap macros (#5363)

* Fixed tap/down/up handling in dynamic keymap macros

* Added SS_TAP_CODE, SS_DOWN_CODE, SS_UP_CODE
3 files changed, 23 insertions(+), 11 deletions(-)

M quantum/dynamic_keymap.c
M quantum/quantum.c
M quantum/quantum.h
M quantum/dynamic_keymap.c => quantum/dynamic_keymap.c +13 -5
@@ 210,19 210,27 @@ void dynamic_keymap_macro_send( uint8_t id )
		++p;
	}

	// Send the macro string one char at a time
	// by making temporary 1 char strings
	char data[2] = { 0, 0 };
	// Send the macro string one or two chars at a time
	// by making temporary 1 or 2 char strings
	char data[3] = { 0, 0, 0 };
	// We already checked there was a null at the end of
	// the buffer, so this cannot go past the end
	while ( 1 ) {
		data[0] = eeprom_read_byte(p);
		data[0] = eeprom_read_byte(p++);
		data[1] = 0;
		// Stop at the null terminator of this macro string
		if ( data[0] == 0 ) {
			break;
		}
		// If the char is magic (tap, down, up),
		// add the next char (key to use) and send a 2 char string.
		if ( data[0] == SS_TAP_CODE || data[0] == SS_DOWN_CODE || data[0] == SS_UP_CODE ) {
			data[1] = eeprom_read_byte(p++);
			if ( data[1] == 0 ) {
				break;
			}
		}
		send_string(data);
		++p;
	}
}


M quantum/quantum.c => quantum/quantum.c +6 -6
@@ 882,16 882,16 @@ void send_string_with_delay(const char *str, uint8_t interval) {
    while (1) {
        char ascii_code = *str;
        if (!ascii_code) break;
        if (ascii_code == 1) {
        if (ascii_code == SS_TAP_CODE) {
          // tap
          uint8_t keycode = *(++str);
          register_code(keycode);
          unregister_code(keycode);
        } else if (ascii_code == 2) {
        } else if (ascii_code == SS_DOWN_CODE) {
          // down
          uint8_t keycode = *(++str);
          register_code(keycode);
        } else if (ascii_code == 3) {
        } else if (ascii_code == SS_UP_CODE) {
          // up
          uint8_t keycode = *(++str);
          unregister_code(keycode);


@@ 908,16 908,16 @@ void send_string_with_delay_P(const char *str, uint8_t interval) {
    while (1) {
        char ascii_code = pgm_read_byte(str);
        if (!ascii_code) break;
        if (ascii_code == 1) {
        if (ascii_code == SS_TAP_CODE) {
          // tap
          uint8_t keycode = pgm_read_byte(++str);
          register_code(keycode);
          unregister_code(keycode);
        } else if (ascii_code == 2) {
        } else if (ascii_code == SS_DOWN_CODE) {
          // down
          uint8_t keycode = pgm_read_byte(++str);
          register_code(keycode);
        } else if (ascii_code == 3) {
        } else if (ascii_code == SS_UP_CODE) {
          // up
          uint8_t keycode = pgm_read_byte(++str);
          unregister_code(keycode);

M quantum/quantum.h => quantum/quantum.h +4 -0
@@ 187,6 187,10 @@ extern uint32_t default_layer_state;
#define ADD_SLASH_X(y) STRINGIZE(\x ## y)
#define SYMBOL_STR(x) ADD_SLASH_X(x)

#define SS_TAP_CODE 1
#define SS_DOWN_CODE 2
#define SS_UP_CODE 3

#define SS_TAP(keycode) "\1" SYMBOL_STR(keycode)
#define SS_DOWN(keycode) "\2" SYMBOL_STR(keycode)
#define SS_UP(keycode) "\3" SYMBOL_STR(keycode)