keymap.c 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include <stdbool.h>
  2. #include QMK_KEYBOARD_H
  3. #include "action_layer.h"
  4. enum {
  5. BASE = 0, // Default layer
  6. ARROWS = 1, // Arrows and Fx keys layer
  7. MOUSE = 2, // Mouse movement and buttons layer
  8. PARENS = 3, // Parenthesis easy access layer
  9. TD_L = 0, // Tap dance index for left shift
  10. TD_R = 1 // Tap dance index for right shift
  11. };
  12. // See the videck.png image for a visualization of the layout.
  13. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  14. [BASE] = LAYOUT_ergodox(
  15. // left hand
  16. KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_HOME,
  17. KC_EQL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_END,
  18. MO(PARENS), KC_A, KC_S, KC_D, KC_F, KC_G,
  19. TD(TD_L), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BSPC,
  20. KC_LCTL, KC_LALT, KC_VOLD, KC_VOLU, KC_MUTE,
  21. KC_ESC, KC_LGUI,
  22. TG(MOUSE),
  23. KC_SPC, KC_TAB, TG(ARROWS),
  24. // right hand
  25. KC_PGUP, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
  26. KC_PGDN, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
  27. KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
  28. KC_DELT, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD(TD_R),
  29. KC_LBRC, KC_RBRC, KC_EQL, KC_RALT, KC_RCTL,
  30. KC_APP, KC_ESC,
  31. KC_INS,
  32. KC_SLCK, KC_ENT, KC_SPC
  33. ),
  34. [ARROWS] = LAYOUT_ergodox(
  35. // left hand
  36. KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  37. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  38. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  39. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  40. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  41. KC_TRNS, KC_TRNS,
  42. KC_NO,
  43. KC_TRNS, KC_TRNS, KC_TRNS,
  44. // right hand
  45. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  46. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F12,
  47. KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TRNS, KC_TRNS,
  48. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  49. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  50. KC_TRNS, KC_TRNS,
  51. KC_TRNS,
  52. KC_TRNS, KC_TRNS, KC_TRNS
  53. ),
  54. [MOUSE] = LAYOUT_ergodox(
  55. // left hand
  56. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  57. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  58. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  59. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  60. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  61. KC_BTN3, KC_TRNS,
  62. KC_TRNS,
  63. KC_BTN1, KC_BTN2, KC_NO,
  64. // right hand
  65. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  66. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  67. KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_TRNS, KC_TRNS,
  68. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  69. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  70. KC_TRNS, KC_TRNS,
  71. KC_TRNS,
  72. KC_TRNS, KC_TRNS, KC_TRNS
  73. ),
  74. [PARENS] = LAYOUT_ergodox(
  75. // left hand
  76. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  77. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  78. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  79. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  80. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  81. KC_TRNS, KC_TRNS,
  82. KC_NO,
  83. KC_TRNS, KC_TRNS, KC_NO,
  84. // right hand
  85. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  86. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LCBR, KC_RCBR, KC_TRNS,
  87. KC_TRNS, KC_TRNS, KC_TRNS, KC_LPRN, KC_RPRN, KC_TRNS,
  88. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LBRC, KC_RBRC, KC_TRNS,
  89. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  90. KC_TRNS, KC_TRNS,
  91. KC_TRNS,
  92. KC_TRNS, KC_TRNS, KC_TRNS
  93. )
  94. };
  95. typedef void (*videck_tap_dance_trigger_t) (const uint16_t kc);
  96. typedef struct
  97. {
  98. uint16_t kc1;
  99. uint16_t kc2;
  100. videck_tap_dance_trigger_t trigger;
  101. } videck_tap_dance_tuple_t;
  102. static void videck_tap_dance_finished (qk_tap_dance_state_t *state, void *user_data) {
  103. videck_tap_dance_tuple_t *const tuple = (videck_tap_dance_tuple_t *)user_data;
  104. if (state->count == 1) {
  105. register_code16 (tuple->kc1);
  106. } else if (state->count == 2) {
  107. register_code16 (tuple->kc2);
  108. }
  109. }
  110. static void videck_tap_dance_reset (qk_tap_dance_state_t *state, void *user_data) {
  111. videck_tap_dance_tuple_t *const tuple = (videck_tap_dance_tuple_t *)user_data;
  112. if (state->count == 1) {
  113. unregister_code16 (tuple->kc1);
  114. } else if (state->count == 2) {
  115. unregister_code16 (tuple->kc2);
  116. tuple->trigger(tuple->kc2);
  117. }
  118. }
  119. static bool caps_lock_is_on;
  120. // Toggles caps lock status.
  121. static void videck_caps_trigger (const uint16_t kc) {
  122. caps_lock_is_on ^= true;
  123. }
  124. #define ACTION_TAP_DANCE_DOUBLE_TRIGGER(kc1, kc2, double_trigger) { \
  125. .fn = { NULL, videck_tap_dance_finished, videck_tap_dance_reset }, \
  126. .user_data = (void *)&((videck_tap_dance_tuple_t) { kc1, kc2, double_trigger }), \
  127. }
  128. qk_tap_dance_action_t tap_dance_actions[] = {
  129. [TD_L] = ACTION_TAP_DANCE_DOUBLE_TRIGGER(KC_LSFT, KC_CAPS, videck_caps_trigger),
  130. [TD_R] = ACTION_TAP_DANCE_DOUBLE_TRIGGER(KC_RSFT, KC_CAPS, videck_caps_trigger)
  131. };
  132. // Runs just one time when the keyboard initializes.
  133. void matrix_init_user(void) {
  134. ergodox_led_all_set(LED_BRIGHTNESS_LO);
  135. caps_lock_is_on = false;
  136. };
  137. static void indicate_using_led(const uint8_t led, const bool enabled) {
  138. if (enabled) {
  139. ergodox_right_led_on(led);
  140. } else {
  141. ergodox_right_led_off(led);
  142. }
  143. }
  144. static inline void indicate_caps_lock_state(const bool enabled) {
  145. indicate_using_led(1, enabled);
  146. }
  147. static inline void indicate_arrows_layer_state(const bool enabled) {
  148. indicate_using_led(2, enabled);
  149. }
  150. static inline void indicate_mouse_layer_state(const bool enabled) {
  151. indicate_using_led(3, enabled);
  152. }
  153. // Runs constantly in the background, in a loop.
  154. void matrix_scan_user(void) {
  155. // Check if we have shift locked.
  156. indicate_caps_lock_state(caps_lock_is_on);
  157. indicate_arrows_layer_state(IS_LAYER_ON(ARROWS));
  158. indicate_mouse_layer_state(IS_LAYER_ON(MOUSE));
  159. };