Advertisement
flavi0gritti

Untitled

Sep 23rd, 2019
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.16 KB | None | 0 0
  1.  #include QMK_KEYBOARD_H
  2.  
  3. //Macro
  4. enum {
  5.   M_STOP = SAFE_RANGE,
  6.   M_DELETEMAC,
  7. };
  8.  
  9. //Tapdance
  10. // LSHIFT
  11. // tapdance keycodes
  12. enum td_keycodes {
  13.     TD_LSFT_CAPS,
  14.     TD_RSFT_SLSH = 0,
  15.     SOME_OTHER_DANCE,
  16. };
  17.  
  18. typedef struct {
  19.     bool is_press_action;
  20.     int state;
  21. } tap;
  22.  
  23. void rsft_reset (qk_tap_dance_state_t *state, void *user_data);
  24.  
  25. // define a type containing as many tapdance states as you need
  26. typedef enum {
  27.     SINGLE_TAP,
  28.     SINGLE_HOLD,
  29.     DOUBLE_SINGLE_TAP
  30. } td_state_t;
  31.  
  32. // create a global instance of the tapdance state type
  33. static td_state_t td_state_sft;
  34. static bool caps_lock = false;
  35.  
  36. //KEYMAP
  37.  
  38. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  39.     [0] = LAYOUT_ortho_4x12(KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  40.                           KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
  41.                           TD(TD_LSFT_CAPS), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_QUOT, RSFT_T(KC_SLSH),
  42.                           KC_F19, KC_LCTL, KC_LALT, KC_LGUI, TT(1), KC_SPC, KC_SPC, TT(2), KC_LEFT, KC_UP, KC_DOWN, KC_RGHT),
  43.  
  44.     [1] = LAYOUT_ortho_4x12(KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
  45.                           KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
  46.                           KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  47.                           KC_F18, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
  48.  
  49.   [2] = LAYOUT_ortho_4x12(RESET, M_STOP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  50.                           DEBUG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  51.                           EEP_RST, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC__MUTE, KC_NO, KC_NO, KC_NO, KC_NO,
  52.                           KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_MRWD, KC__VOLUP, KC__VOLDOWN, KC_MFFD)
  53. };
  54.  
  55. //End of Key Configuration
  56.  
  57. // LSHIFT
  58.  
  59. // determine the tapdance state to return
  60. int cur_dance (qk_tap_dance_state_t *state) {
  61.     if (state->count == 1) {
  62.         if (state->interrupted || !state->pressed) { return SINGLE_TAP; }
  63.         else { return SINGLE_HOLD; }
  64.     }
  65.     if (state->count == 2) { return DOUBLE_SINGLE_TAP; }
  66.     else { return 3; } // any number higher than the maximum state value you return above
  67. }
  68.  
  69. #define DEBOUNCE_CAPS_DELAY 100
  70.  
  71. void sft_finished (qk_tap_dance_state_t *state, void *user_data) {
  72.     td_state_sft = cur_dance(state);
  73.     if (td_state_sft == DOUBLE_SINGLE_TAP) {
  74.         if (!caps_lock) {
  75.             register_code(KC_CAPSLOCK);
  76.             return;
  77.         }
  78.     }
  79.  
  80.     if (caps_lock) {
  81.         register_code(KC_CAPSLOCK);
  82.     } else {
  83.         register_code(KC_LSFT);
  84.     }
  85. }
  86.  
  87. void sft_reset (qk_tap_dance_state_t *state, void *user_data) {
  88.     if (td_state_sft == DOUBLE_SINGLE_TAP) {
  89.         if (!caps_lock) {
  90.             caps_lock = true;
  91.             wait_ms(DEBOUNCE_CAPS_DELAY);
  92.             unregister_code(KC_CAPSLOCK);
  93.             return;
  94.         }
  95.     }
  96.  
  97.     if (caps_lock) {
  98.         caps_lock = false;
  99.         wait_ms(DEBOUNCE_CAPS_DELAY);
  100.         unregister_code(KC_CAPSLOCK);
  101.     } else {
  102.         unregister_code(KC_LSFT);
  103.     }
  104. }
  105.  
  106. //Tap Dance Definitions
  107. qk_tap_dance_action_t tap_dance_actions[] = {
  108.     //Tap once for Shift, twice for Caps Lock
  109.     [TD_LSFT_CAPS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, sft_finished, sft_reset),
  110. };
  111.  
  112. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  113.   switch (keycode) {
  114.     case M_STOP:
  115.       if (record->event.pressed) {
  116.         // when keycode M_STOP is pressed
  117.         SEND_STRING(SS_LCTRL(SS_LGUI("q")));
  118.       } else {
  119.         // when keycode M_STOP is released
  120.       }
  121.       break;
  122.     case M_DELETEMAC:
  123.       if (record->event.pressed) {
  124.         // when keycode M_DELETEMAC is pressed
  125.         SEND_STRING(SS_LGUI(X_BSPC));
  126.       } else {
  127.         // when keycode M_DELETEMAC is released
  128.       }
  129.       break;
  130.   }
  131.   return true;
  132. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement