Advertisement
petrvden

Untitled

Jul 16th, 2024
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 30.14 KB | None | 0 0
  1. /* Copyright 2020 qmk */
  2.  
  3. #include QMK_KEYBOARD_H
  4. #ifdef CONSOLE_ENABLE
  5. #include "print.h"
  6. #endif
  7. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  8. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  9. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  10. // entirely and just use numbers.
  11. #define _QWERTY     0
  12. #define _F_TRPT     1
  13. #define _SYMB       2
  14. #define _MOUSE      3
  15. #define _ADJUST     4
  16. #define _ARROW      5
  17.  
  18.  
  19. int cur_dance (tap_dance_state_t *state);
  20. //for the x tap dance. Put it here so it can be used in any keymap
  21. void x_finished (tap_dance_state_t *state, void *user_data);
  22. void x_reset (tap_dance_state_t *state, void *user_data);
  23.  
  24. #ifdef RGB_MATRIX_ENABLE
  25. HSV color_my;
  26. HSV color1 = {HSV_TURQUOISE};
  27. HSV color2 = {HSV_YELLOW};
  28. HSV color3 = {HSV_PINK};
  29. HSV color4 = {HSV_GREEN};
  30. HSV color5 = {HSV_RED};
  31. HSV hsv_Orang = {HSV_ORANGE};
  32. RGB color_my_rgb;
  33. #endif
  34.  
  35. ///////////////////////////////////////////////////
  36. typedef struct {
  37.   bool is_press_action;
  38.   int state;
  39. } tap;
  40.  
  41. enum {
  42.   SINGLE_TAP = 1,
  43.   SINGLE_HOLD = 2,
  44.   DOUBLE_TAP = 3,
  45.   DOUBLE_HOLD = 4,
  46.   DOUBLE_SINGLE_TAP = 5, //send two single taps
  47.   TRIPLE_TAP = 6,
  48.   TRIPLE_HOLD = 7
  49. };
  50.  
  51. //Tap dance enums
  52. enum {
  53.   F4_HOLD = 0,
  54. };
  55.  
  56.  
  57.  
  58.  
  59. ////////////////////////////////////////////////////
  60.  
  61.  
  62. enum custom_keycodes {
  63.   QWERTY = SAFE_RANGE,
  64.   SYMB,
  65.   NAV,
  66.   ADJUST,
  67.   F_TRPT,
  68.   RGB_MyEFF,
  69. };
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77. bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
  78.  
  79. #ifdef RGB_MATRIX_ENABLE
  80.     uint8_t layer = get_highest_layer(layer_state);
  81.    
  82.     // определчем цвета
  83.  
  84.     // получаем яркость
  85.     color1.v = rgb_matrix_get_val();
  86.     color2.v = rgb_matrix_get_val();
  87.     color3.v = rgb_matrix_get_val();
  88.     color4.v = rgb_matrix_get_val();
  89.     color_my.v= rgb_matrix_get_val();
  90.     hsv_Orang.v = rgb_matrix_get_val();
  91.     // переводим в rgb
  92.     //RGB color1_rgb = hsv_to_rgb(color1);
  93.     //RGB color2_rgb = hsv_to_rgb(color2);
  94.     //RGB color3_rgb = hsv_to_rgb(color3);
  95.     //RGB color4_rgb = hsv_to_rgb(color4);
  96.  
  97.    
  98.      if (get_highest_layer(layer_state) > 0) {
  99.  
  100.            
  101.         switch (get_highest_layer(layer_state)) {
  102.             case 1:
  103.                 color_my_rgb   = hsv_to_rgb(color1);
  104.                 break;
  105.             case 2:
  106.                 color_my_rgb   = hsv_to_rgb(color2);
  107.                 break;
  108.             case 3:
  109.                 color_my_rgb   = hsv_to_rgb(color3);
  110.                 break;
  111.             case 4:
  112.                 color_my_rgb   = hsv_to_rgb(color4);
  113.                 break;
  114.             case 5:
  115.                 color_my_rgb   = hsv_to_rgb(color4);
  116.                 break;
  117.         }
  118.        
  119.  
  120.        
  121.         if (get_highest_layer(layer_state) == 4)  {
  122.        
  123.             for (uint8_t i = led_min; i <= 34; i++)
  124.             {
  125.                     rgb_matrix_set_color(i, RGB_OFF);
  126.             }
  127.         }
  128.         else
  129.         {
  130.             for (uint8_t i = led_min; i <= led_max; i++)
  131.             {
  132.                     rgb_matrix_set_color(i, RGB_OFF);
  133.             }
  134.         }
  135.        
  136.        
  137.        
  138.         for (uint8_t row = 0; row < MATRIX_ROWS; ++row)
  139.         {
  140.             for (uint8_t col = 0; col < MATRIX_COLS; ++col)
  141.             {
  142.                 uint8_t index = g_led_config.matrix_co[row][col];
  143.  
  144.                 switch (layer) {
  145.                     case 4:
  146.                         if (index >= led_min && index <= 34 && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS )
  147.                         {
  148.                             rgb_matrix_set_color(index, color_my_rgb.r, color_my_rgb.g, color_my_rgb.b);
  149.                         }
  150.                     break;
  151.                     default:
  152.                         if (index >= led_min && index <= led_max && index != NO_LED && keymap_key_to_keycode(layer, (keypos_t){col,row}) > KC_TRNS )
  153.                         {
  154.                             rgb_matrix_set_color(index, color_my_rgb.r, color_my_rgb.g, color_my_rgb.b);
  155.                         }
  156.                     }
  157.             }
  158.        
  159.         }
  160.     }
  161.    
  162.         if (host_keyboard_led_state().caps_lock)
  163.         {
  164.             RGB orange_1 = hsv_to_rgb(hsv_Orang);
  165.             rgb_matrix_set_color(14, orange_1.r, orange_1.g, orange_1.b);
  166.         }
  167.        
  168.         #endif
  169.    return true;
  170. }
  171.  
  172. //void keyboard_post_init_user(void) {
  173. //
  174. //}
  175.  
  176. void suspend_power_down_user(void) {
  177.     #ifdef RGB_MATRIX_ENABLE
  178.     rgb_matrix_set_suspend_state(true);
  179.     #endif
  180. }
  181.  
  182. void suspend_wakeup_init_user(void) {
  183.     #ifdef RGB_MATRIX_ENABLE
  184.     rgb_matrix_set_suspend_state(false);
  185.     #endif
  186. }
  187.  
  188.  
  189.  
  190. // Shortcut to make keymap more readable
  191. #define SYM_L   LT(_SYMB, KC_CAPS)
  192. #define ADJT   MO(_ADJUST)
  193. #define KC_ALAS LALT_T(KC_PAST)
  194. #define KC_CTPL LCTL_T(KC_BSLS)
  195.  
  196. #define KC_F4_HOLD (KC_BSLS)
  197.  
  198. #define KC_NAGR LT(_MOUSE, KC_SPC)
  199. #define KC_NAMI LT(_MOUSE, KC_MINS)
  200.  
  201. #define KC_ADEN LT(_ARROW, KC_SPC)
  202. #define KC_ADPU LT(_ADJUST, KC_PGUP)
  203.  
  204.  
  205.  
  206.  
  207.  
  208. bool process_record_user(uint16_t keycode, keyrecord_t *record ) {
  209.  
  210.     switch (keycode) {
  211.         case RGB_MyEFF:
  212.             #ifdef RGB_MATRIX_ENABLE
  213.                 rgb_matrix_mode(RGB_MATRIX_SOLID_REACTIVE);
  214.             #endif
  215.  
  216.             return true;             // Return true for normal processing of tap keycode
  217.         case LT(0,KC_1):
  218.             if (!record->tap.count && record->event.pressed) {
  219.                 tap_code16(KC_F1); // Intercept hold function to send Ctrl-X
  220.                 return false;
  221.             }
  222.             return true;             // Return true for normal processing of tap keycode
  223.         case LT(0,KC_2):
  224.             if (!record->tap.count && record->event.pressed) {
  225.                 tap_code16((KC_F2)); // Intercept hold function to send Ctrl-C
  226.                 return false;
  227.             }
  228.             return true;             // Return true for normal processing of tap keycode
  229.         case LT(0,KC_3):
  230.             if (!record->tap.count && record->event.pressed) {
  231.                 tap_code16((KC_F3)); // Intercept hold function to send Ctrl-V
  232.                 return false;
  233.             }
  234.             return true;             // Return true for normal processing of tap keycode
  235.         case LT(0,KC_5):
  236.             if (!record->tap.count && record->event.pressed) {
  237.                 tap_code16(KC_F5); // Intercept hold function to send Ctrl-X
  238.                 return false;
  239.             }
  240.             return true;             // Return true for normal processing of tap keycode
  241.         case LT(0,KC_6):
  242.             if (!record->tap.count && record->event.pressed) {
  243.                 tap_code16(KC_F6); // Intercept hold function to send Ctrl-X
  244.                 return false;
  245.             }
  246.             return true;             // Return true for normal processing of tap keycode
  247.         case LT(0,KC_7):
  248.             if (!record->tap.count && record->event.pressed) {
  249.                 tap_code16(KC_F7); // Intercept hold function to send Ctrl-X
  250.                 return false;
  251.             }
  252.             return true;             // Return true for normal processing of tap keycode
  253.         case LT(0,KC_8):
  254.             if (!record->tap.count && record->event.pressed) {
  255.                 tap_code16(KC_F8); // Intercept hold function to send Ctrl-X
  256.                 return false;
  257.             }
  258.             return true;             // Return true for normal processing of tap keycode
  259.         case LT(0,KC_9):
  260.             if (!record->tap.count && record->event.pressed) {
  261.                 tap_code16(KC_F9); // Intercept hold function to send Ctrl-X
  262.                 return false;
  263.             }
  264.             return true;             // Return true for normal processing of tap keycode
  265.         case LT(0,KC_0):
  266.             if (!record->tap.count && record->event.pressed) {
  267.                 tap_code16(KC_F10); // Intercept hold function to send Ctrl-X
  268.                 return false;
  269.             }
  270.             return true;             // Return true for normal processing of tap keycode
  271.  
  272.  
  273.     }
  274.        
  275. #ifdef CONSOLE_ENABLE
  276.     uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count);
  277. #endif
  278.    
  279.    
  280.   return true;
  281. }
  282.  
  283.  
  284.  
  285.  
  286. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  287.  
  288.   [_QWERTY] = LAYOUT(
  289.   //┌────────┬────────┬────────┬────────┬────────┬────────┐────────┐                         ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  290.      KC_ESC  ,LT(0,KC_1),LT(0,KC_2),LT(0,KC_3),TD(F4_HOLD),LT(0,KC_5),LT(0,KC_6),       LT(0,KC_7), LT(0,KC_8),LT(0,KC_9), LT(0,KC_0),KC_MINS, KC_EQL, KC_BSPC ,
  291.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                         ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  292.      KC_TAB  ,KC_Q     ,KC_W    ,KC_E    ,KC_R    ,KC_T   ,KC_PGUP ,                KC_HOME ,  KC_Y    ,KC_U    ,KC_I    ,KC_O    ,KC_P    ,KC_LBRC, KC_RBRC,
  293.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  294.       SYM_L  ,KC_A    ,KC_S    ,KC_D    ,KC_F    ,KC_G    ,KC_PGDN ,                KC_END , KC_H    ,KC_J    ,KC_K    ,KC_L    ,KC_SCLN ,KC_QUOT ,KC_ENT ,
  295.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐       ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  296.      KC_LSFT ,KC_Z    ,KC_X    ,KC_C  ,KC_V ,KC_B  , KC_SPC ,                         MO(_ADJUST) ,KC_N    ,KC_M    ,KC_COMM ,KC_DOT  ,KC_SLSH ,MT(MOD_RSFT, KC_BSLS) ,
  297.   //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤       ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  298.      KC_LCTL ,KC_LGUI ,KC_LALT ,KC_ADEN ,  KC_BSPC , KC_DEL ,MO(_ADJUST) ,                 ADJT  ,KC_PSCR  ,    KC_NAGR ,     KC_RALT ,KC_APP,KC_RCTL
  299.   //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘       └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  300.   ),
  301.  
  302.   [_SYMB] = LAYOUT(
  303.   //┌────────┬────────┬────────┬────────┬────────┬────────┐                                   ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  304.      QK_BOOT ,XXXXXXX,XXXXXXX, XXXXXXX, XXXXXXX ,XXXXXXX  ,XXXXXXX ,                 QK_BOOT, XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX ,
  305.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                          ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  306.      XXXXXXX ,KC_MPRV ,KC_MPLY ,KC_MNXT ,XXXXXXX ,KC_VOLU ,XXXXXXX ,                 XXXXXXX , XXXXXXX, XXXXXXX  ,XXXXXXX ,XXXXXXX, XXXXXXX,XXXXXXX ,XXXXXXX,
  307.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  308.      XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,KC_VOLD,XXXXXXX ,                  XXXXXXX , XXXXXXX, XXXXXXX ,XXXXXXX  ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  309.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐        ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  310.      XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                 XXXXXXX ,XXXXXXX  ,XXXXXXX  ,XXXXXXX, XXXXXXX ,XXXXXXX ,XXXXXXX ,
  311.   //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤        ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  312.      XXXXXXX ,XXXXXXX ,XXXXXXX ,KC_ADEN ,XXXXXXX, XXXXXXX ,XXXXXXX ,                 XXXXXXX  ,XXXXXXX  ,   XXXXXXX ,     XXXXXXX ,XXXXXXX  ,XXXXXXX
  313.   //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘        └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  314.   ),
  315.  
  316.   [_MOUSE] = LAYOUT(
  317.   //┌────────┬────────┬────────┬────────┬────────┬────────┐                                 ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  318.      XXXXXXX ,KC_BTN1 ,XXXXXXX ,KC_BTN2 ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                   LT(0,KC_7), LT(0,KC_8),LT(0,KC_9), LT(0,KC_0),KC_MINS, KC_EQL, KC_BSPC ,
  319.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                        ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  320.      XXXXXXX ,XXXXXXX ,KC_MS_U ,XXXXXXX ,KC_WH_U ,XXXXXXX ,XXXXXXX ,               KC_HOME ,  KC_Y    ,KC_U    ,KC_I    ,KC_O    ,KC_P    ,KC_LBRC, KC_RBRC,
  321.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                        ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  322.      XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D ,XXXXXXX ,XXXXXXX ,               KC_END , KC_H    ,KC_J    ,KC_K    ,KC_L    ,KC_SCLN ,KC_QUOT ,KC_ENT ,
  323.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐      ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  324.      XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,TG(_MOUSE),               MO(_ADJUST) ,KC_N    ,KC_M    ,KC_COMM ,KC_DOT  ,KC_SLSH ,MT(MOD_RSFT, KC_BSLS) ,
  325.   //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤      ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  326.      XXXXXXX ,XXXXXXX ,XXXXXXX ,KC_ADEN ,     XXXXXXX ,    XXXXXXX ,XXXXXXX ,             ADJT  ,KC_DEL  ,    KC_NAGR ,     KC_RALT ,KC_APP,KC_RCTL  
  327.   //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘      └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  328.   ),
  329.  
  330.   [_ARROW] = LAYOUT(
  331.  //┌────────┬────────┬────────┬────────┬────────┬────────┐                                     ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  332.     LCTL(KC_GRV),KC_HOME,XXXXXXX ,KC_END ,XXXXXXX ,XXXXXXX ,XXXXXXX ,                XXXXXXX, KC_PAST, XXXXXXX , XXXXXXX,  KC_MINS, KC_EQL, KC_BSPC ,
  333.  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                          ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  334.     XXXXXXX ,XXXXXXX ,KC_UP ,XXXXXXX ,KC_WH_U ,XXXXXXX ,KC_PGUP ,                    XXXXXXX , XXXXXXX, KC_P7    ,KC_P8   ,KC_P9   ,XXXXXXX ,XXXXXXX ,XXXXXXX,
  335.  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                          ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  336.     TG(_F_TRPT),KC_LEFT ,KC_DOWN ,KC_RIGHT ,KC_WH_D ,XXXXXXX ,KC_PGDN,               XXXXXXX , XXXXXXX, KC_P4    ,KC_P5   ,KC_P6   ,XXXXXXX ,XXXXXXX ,KC_ENT ,
  337.  //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐          ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  338.     _______ ,LCTL(KC_LEFT),XXXXXXX ,LCTL(KC_RIGHT) ,XXXXXXX ,XXXXXXX ,XXXXXXX ,      _______ ,XXXXXXX  , KC_P1    ,KC_P2  , KC_P3 , KC_PSLS ,XXXXXXX ,
  339.  //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤          ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  340.     _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,     XXXXXXX ,    XXXXXXX ,XXXXXXX ,         XXXXXXX  ,XXXXXXX  ,    KC_P0 ,     KC_PDOT ,XXXXXXX  ,KC_RCTL
  341.  //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘        └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  342.   ),
  343.  
  344.   [_ADJUST] = LAYOUT(
  345.   //┌────────┬────────┬────────┬────────┬────────┬────────┐────────┐                         ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  346.      LCTL(KC_GRV) ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO   ,KC_NO,               XXXXXXX,  XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC ,
  347.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                         ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  348.      RGB_TOG ,RGB_MyEFF,RGB_MOD ,RGB_SAD ,RGB_HUI ,RGB_VAI ,RGB_HUI ,                XXXXXXX , XXXXXXX, KC_P7    ,KC_P8   ,KC_P9   ,XXXXXXX ,XXXXXXX ,XXXXXXX,
  349.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  350.      TG(_F_TRPT),XXXXXXX ,XXXXXXX ,RGB_SAI ,RGB_HUD ,RGB_VAD ,XXXXXXX ,              XXXXXXX , XXXXXXX, KC_P4    ,KC_P5   ,KC_P6   ,XXXXXXX ,XXXXXXX ,KC_ENT ,
  351.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐       ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  352.      KC_LSFT ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,_______ ,                 _______ ,XXXXXXX  , KC_P1    ,KC_P2  , KC_P3 , XXXXXXX  ,XXXXXXX ,
  353.   //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤       ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  354.      XXXXXXX ,RGB_SPI ,RGB_SPD ,XXXXXXX ,     XXXXXXX ,    XXXXXXX , XXXXXXX ,       XXXXXXX  ,XXXXXXX  ,    KC_P0 ,     KC_PDOT ,XXXXXXX  ,KC_DOT
  355.   //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘       └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  356.   ),
  357.  
  358.     [_F_TRPT] = LAYOUT(
  359.   //┌────────┬────────┬────────┬────────┬────────┬────────┐────────┐                         ┌────────┌────────┬────────┬────────┬────────┬────────┬────────┐
  360.      QK_GESC ,KC_F1   ,KC_F2   ,KC_F3   ,KC_F4   ,KC_F5   ,KC_F6,                   KC_F7,  KC_F8    ,KC_F9    ,KC_F10 ,_______   ,_______    ,_______ ,
  361.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐                         ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  362.      _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,                _______ , _______, _______    ,_______   ,_______    ,_______    ,_______    ,_______,
  363.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤                         ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  364.      _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,                _______ , _______, _______    ,_______   ,_______    ,_______    ,_______ ,_______ ,
  365.   //├────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┐       ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┼────────┤
  366.      _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ ,                _______ ,_______  ,_______    ,_______  , _______ ,_______    ,_______ ,
  367.   //├────────┼────────┼────────┼────────┼────┬───┴────┬───┼────────┼────────┤       ├────────┼────────┼───┬────┴───┬────┼────────┼────────┼────────┼────────┤
  368.      _______ ,_______ ,_______ ,_______ ,     _______ ,    _______ , _______ ,        _______  ,_______  ,    _______ ,     _______ ,_______  ,_______
  369.   //└────────┴────────┴────────┴────────┘    └────────┘   └────────┴────────┘       └────────┴────────┘   └────────┘    └────────┴────────┴────────┴────────┘
  370.   )
  371.  
  372.  
  373. };
  374.  
  375.  
  376. int cur_dance (tap_dance_state_t *state) {
  377.   if (state->count == 1) {
  378.     if (state->interrupted || !state->pressed)  return SINGLE_TAP;
  379.     //key has not been interrupted, but they key is still held. Means you want to send a 'HOLD'.
  380.     else return SINGLE_HOLD;
  381.   }
  382.   else if (state->count == 2) {
  383.     /*
  384.      * DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap
  385.      * action when hitting 'pp'. Suggested use case for this return value is when you want to send two
  386.      * keystrokes of the key, and not the 'double tap' action/macro.
  387.     */
  388.     if (state->interrupted) return DOUBLE_SINGLE_TAP;
  389.     else if (state->pressed) return DOUBLE_HOLD;
  390.     else return DOUBLE_TAP;
  391.   }
  392.   //Assumes no one is trying to type the same letter three times (at least not quickly).
  393.   //If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add
  394.   //an exception here to return a 'TRIPLE_SINGLE_TAP', and define that enum just like 'DOUBLE_SINGLE_TAP'
  395.   if (state->count == 3) {
  396.     if (state->interrupted || !state->pressed)  return TRIPLE_TAP;
  397.     else return TRIPLE_HOLD;
  398.   }
  399.   else return 8; //magic number. At some point this method will expand to work for more presses
  400. }
  401.  
  402. //instanalize an instance of 'tap' for the 'x' tap dance.
  403. static tap xtap_state = {
  404.   .is_press_action = true,
  405.   .state = 0
  406. };
  407.  
  408. void x_finished (tap_dance_state_t *state, void *user_data) {
  409.   xtap_state.state = cur_dance(state);
  410.   switch (xtap_state.state) {
  411.     case SINGLE_TAP: register_code(KC_4); break;
  412.     case SINGLE_HOLD: register_code(KC_F4); break;
  413.     //Last case is for fast typing. Assuming your key is `f`:
  414.     //For example, when typing the word `buffer`, and you want to make sure that you send `ff` and not `Esc`.
  415.     //In order to type `ff` when typing fast, the next character will have to be hit within the `TAPPING_TERM`, which by default is 200ms.
  416.   }
  417. }
  418.  
  419. void x_reset (tap_dance_state_t *state, void *user_data) {
  420.   switch (xtap_state.state) {
  421.     case SINGLE_TAP: unregister_code(KC_4); break;
  422.     case SINGLE_HOLD: unregister_code(KC_F4); break;
  423.   }
  424.   xtap_state.state = 0;
  425. }
  426.  
  427. tap_dance_action_t tap_dance_actions[] = {
  428.   [F4_HOLD]     = ACTION_TAP_DANCE_FN_ADVANCED(NULL,x_finished, x_reset)
  429. };
  430.  
  431. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement