~ruther/qmk_firmware

5a6737a778cfa828e4fdb5d382a84a41e5210d8e — fauxpark 5 years ago a2cedf4
Send string keycode tweaks (#7471)

M docs/feature_leader_key.md => docs/feature_leader_key.md +4 -4
@@ 22,10 22,10 @@ void matrix_scan_user(void) {
      SEND_STRING("QMK is awesome.");
    }
    SEQ_TWO_KEYS(KC_D, KC_D) {
      SEND_STRING(SS_LCTRL("a")SS_LCTRL("c"));
      SEND_STRING(SS_LCTL("a") SS_LCTL("c"));
    }
    SEQ_THREE_KEYS(KC_D, KC_D, KC_S) {
      SEND_STRING("https://start.duckduckgo.com"SS_TAP(X_ENTER));
      SEND_STRING("https://start.duckduckgo.com\n");
    }
    SEQ_TWO_KEYS(KC_A, KC_S) {
      register_code(KC_LGUI);


@@ 115,11 115,11 @@ void matrix_scan_user(void) {

    SEQ_ONE_KEY(KC_E) {
      // Anything you can do in a macro.
      SEND_STRING(SS_LCTRL(SS_LSFT("t")));
      SEND_STRING(SS_LCTL(SS_LSFT("t")));
      did_leader_succeed = true;
    } else 
    SEQ_TWO_KEYS(KC_E, KC_D) {
      SEND_STRING(SS_LGUI("r")"cmd"SS_TAP(KC_ENTER)SS_LCTRL("c"));
      SEND_STRING(SS_LGUI("r") "cmd\n" SS_LCTL("c"));
      did_leader_succeed = true;
    }
    leader_end();

M docs/feature_macros.md => docs/feature_macros.md +11 -8
@@ 67,14 67,14 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    case QMKURL:
      if (record->event.pressed) {
        // when keycode QMKURL is pressed
        SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
        SEND_STRING("https://qmk.fm/\n");
      } else {
        // when keycode QMKURL is released
      }
      break;
    case MY_OTHER_MACRO:
      if (record->event.pressed) {
                SEND_STRING(SS_LCTRL("ac")); // selects all and copies
                SEND_STRING(SS_LCTL("ac")); // selects all and copies
      }
      break;
  }


@@ 109,18 109,21 @@ Which would send "VE" followed by a `KC_HOME` tap, and "LO" (spelling "LOVE" if 

There's also a couple of mod shortcuts you can use:

* `SS_LCTRL(string)`
* `SS_LGUI(string)`
* `SS_LALT(string)`
* `SS_LCTL(string)`
* `SS_LSFT(string)`
* `SS_RALT(string)`
* `SS_LALT(string)`
* `SS_LGUI(string)`, `SS_LCMD(string)` or `SS_LWIN(string)`
* `SS_RCTL(string)`
* `SS_RSFT(string)`
* `SS_RALT(string)` or `SS_ALGR(string)`
* `SS_RGUI(string)`, `SS_RCMD(string)` or `SS_RWIN(string)`

These press the respective modifier, send the supplied string and then release the modifier.
They can be used like this:

    SEND_STRING(SS_LCTRL("a"));
    SEND_STRING(SS_LCTL("a"));

Which would send LCTRL+a (LCTRL down, a, LCTRL up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.
Which would send Left Control+`a` (Left Control down, `a`, Left Control up) - notice that they take strings (eg `"k"`), and not the `X_K` keycodes.

### Alternative Keymaps


M docs/feature_userspace.md => docs/feature_userspace.md +5 -5
@@ 208,15 208,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
            clear_mods(); clear_oneshot_mods();
            SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP);
    #ifndef FLASH_BOOTLOADER
            if ( (temp_mod | temp_osm) & MOD_MASK_SHIFT ) 
            if ((temp_mod | temp_osm) & MOD_MASK_SHIFT)
    #endif
            { // 
            {
                SEND_STRING(":flash");
            }
            if ( (temp_mod | temp_osm) & MOD_MASK_CTRL) { 
                SEND_STRING(" -j8 --output-sync"); 
            if ((temp_mod | temp_osm) & MOD_MASK_CTRL) {
                SEND_STRING(" -j8 --output-sync");
            }
            SEND_STRING(SS_TAP(X_ENTER));
            tap_code(KC_ENT);
            set_mods(temp_mod);
        }
        break;

M keyboards/kmac/keymaps/default/keymap.c => keyboards/kmac/keymaps/default/keymap.c +1 -1
@@ 73,7 73,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
            break;
        case MCR_04:
            if (record->event.pressed) {
                SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v"));
                SEND_STRING(SS_LCTL("c") SS_TAP(X_RIGHT) SS_LCTL("v"));
            }
            break;
    }

M keyboards/kmac/keymaps/default_tkl_ansi/keymap.c => keyboards/kmac/keymaps/default_tkl_ansi/keymap.c +1 -1
@@ 73,7 73,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
            break;
        case MCR_04:
            if (record->event.pressed) {
                SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v"));
                SEND_STRING(SS_LCTL("c") SS_TAP(X_RIGHT) SS_LCTL("v"));
            }
            break;
    }

M keyboards/kmac/keymaps/default_tkl_ansi_wkl/keymap.c => keyboards/kmac/keymaps/default_tkl_ansi_wkl/keymap.c +1 -1
@@ 73,7 73,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
            break;
        case MCR_04:
            if (record->event.pressed) {
                SEND_STRING(SS_LCTRL("c") SS_TAP(X_RIGHT) SS_LCTRL("v"));
                SEND_STRING(SS_LCTL("c") SS_TAP(X_RIGHT) SS_LCTL("v"));
            }
            break;
    }

M quantum/process_keycode/process_terminal.c => quantum/process_keycode/process_terminal.c +1 -1
@@ 61,7 61,7 @@ void enable_terminal(void) {
    memset(cmd_buffer, 0, CMD_BUFF_SIZE * 80);
    for (int i = 0; i < 6; i++) strcpy(arguments[i], "");
    // select all text to start over
    // SEND_STRING(SS_LCTRL("a"));
    // SEND_STRING(SS_LCTL("a"));
    send_string(terminal_prompt);
}


M quantum/quantum.h => quantum/quantum.h +1 -23
@@ 182,30 182,8 @@ typedef ioline_t pin_t;
#    define readPin(pin) palReadLine(pin)
#endif

// Send string macros
#define STRINGIZE(z) #z
#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)

// `string` arguments must not be parenthesized
#define SS_LCTRL(string) SS_DOWN(X_LCTRL) string SS_UP(X_LCTRL)
#define SS_LGUI(string) SS_DOWN(X_LGUI) string SS_UP(X_LGUI)
#define SS_LCMD(string) SS_LGUI(string)
#define SS_LWIN(string) SS_LGUI(string)
#define SS_LALT(string) SS_DOWN(X_LALT) string SS_UP(X_LALT)
#define SS_LSFT(string) SS_DOWN(X_LSHIFT) string SS_UP(X_LSHIFT)
#define SS_RALT(string) SS_DOWN(X_RALT) string SS_UP(X_RALT)
#define SS_ALGR(string) SS_RALT(string)

#define SEND_STRING(string) send_string_P(PSTR(string))
#define SEND_STRING_DELAY(string, interval) send_string_with_delay_P(PSTR(string), interval)

extern const bool    ascii_to_shift_lut[128];
extern const bool    ascii_to_altgr_lut[128];

M quantum/send_string_keycodes.h => quantum/send_string_keycodes.h +32 -0
@@ 340,3 340,35 @@
#define X_MEDIA_REWIND       bc
#define X_BRIGHTNESS_UP      bd
#define X_BRIGHTNESS_DOWN    be

// Send string macros
#define STRINGIZE(z) #z
#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)

// `string` arguments must not be parenthesized
#define SS_LCTL(string) SS_DOWN(X_LCTL) string SS_UP(X_LCTL)
#define SS_LSFT(string) SS_DOWN(X_LSFT) string SS_UP(X_LSFT)
#define SS_LALT(string) SS_DOWN(X_LALT) string SS_UP(X_LALT)
#define SS_LGUI(string) SS_DOWN(X_LGUI) string SS_UP(X_LGUI)
#define SS_LCMD(string) SS_LGUI(string)
#define SS_LWIN(string) SS_LGUI(string)

#define SS_RCTL(string) SS_DOWN(X_RCTL) string SS_UP(X_RCTL)
#define SS_RSFT(string) SS_DOWN(X_RSFT) string SS_UP(X_RSFT)
#define SS_RALT(string) SS_DOWN(X_RALT) string SS_UP(X_RALT)
#define SS_RGUI(string) SS_DOWN(X_RGUI) string SS_UP(X_RGUI)
#define SS_ALGR(string) SS_RALT(string)
#define SS_RCMD(string) SS_RGUI(string)
#define SS_RWIN(string) SS_RGUI(string)

// DEPRECATED
#define SS_LCTRL(string) SS_LCTL(string)

M quantum/template/base/keymaps/default/keymap.c => quantum/template/base/keymaps/default/keymap.c +1 -1
@@ 52,7 52,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
        case QMKURL:
            if (record->event.pressed) {
                // when keycode QMKURL is pressed
                SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
                SEND_STRING("https://qmk.fm/\n");
            } else {
                // when keycode QMKURL is released
            }