You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.2 KiB

  1. /* Copyright 2021 imchipwood
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include "imchipwood.h"
  17. static td_state_t td_state[3];
  18. // determine the tapdance state to return
  19. int cur_dance(qk_tap_dance_state_t *state) {
  20. if (state->count == 1) {
  21. if (state->interrupted || !state->pressed) {
  22. return SINGLE_TAP;
  23. } else {
  24. return SINGLE_HOLD;
  25. }
  26. }
  27. if (state->count == 2) {
  28. return DOUBLE_TAP;
  29. } else {
  30. return 3;
  31. } // any number higher than the maximum state value you return above
  32. }
  33. void altf2_finished(qk_tap_dance_state_t *state, void *user_data) {
  34. td_state[0] = cur_dance(state);
  35. switch (td_state[0]) {
  36. case SINGLE_TAP:
  37. register_code(KC_F2);
  38. break;
  39. case SINGLE_HOLD:
  40. register_mods(MOD_BIT(KC_LALT));
  41. break;
  42. case DOUBLE_TAP:
  43. register_mods(MOD_BIT(KC_LALT));
  44. tap_code(KC_F2);
  45. break;
  46. }
  47. }
  48. void altf2_reset(qk_tap_dance_state_t *state, void *user_data) {
  49. switch (td_state[0]) {
  50. case SINGLE_TAP:
  51. unregister_code(KC_F2);
  52. break;
  53. case SINGLE_HOLD:
  54. unregister_mods(MOD_BIT(KC_LALT));
  55. break;
  56. case DOUBLE_TAP:
  57. unregister_code(KC_F2);
  58. unregister_mods(MOD_BIT(KC_LALT));
  59. break;
  60. }
  61. }
  62. void ctlf5_finished(qk_tap_dance_state_t *state, void *user_data) {
  63. td_state[1] = cur_dance(state);
  64. switch (td_state[1]) {
  65. case SINGLE_TAP:
  66. register_code(KC_F5);
  67. break;
  68. case SINGLE_HOLD:
  69. register_mods(MOD_BIT(KC_LCTL));
  70. break;
  71. case DOUBLE_TAP:
  72. register_mods(MOD_BIT(KC_LCTL));
  73. tap_code(KC_F5);
  74. break;
  75. }
  76. }
  77. void ctlf5_reset(qk_tap_dance_state_t *state, void *user_data) {
  78. switch (td_state[1]) {
  79. case SINGLE_TAP:
  80. unregister_code(KC_F5);
  81. break;
  82. case SINGLE_HOLD:
  83. unregister_mods(MOD_BIT(KC_LCTL));
  84. break;
  85. case DOUBLE_TAP:
  86. unregister_code(KC_F5);
  87. unregister_mods(MOD_BIT(KC_LCTL));
  88. break;
  89. }
  90. }
  91. void altf7_finished(qk_tap_dance_state_t *state, void *user_data) {
  92. td_state[2] = cur_dance(state);
  93. switch (td_state[2]) {
  94. case SINGLE_TAP:
  95. register_code(KC_F7);
  96. break;
  97. case SINGLE_HOLD:
  98. register_mods(MOD_BIT(KC_LALT));
  99. break;
  100. case DOUBLE_TAP:
  101. register_mods(MOD_BIT(KC_LALT));
  102. tap_code(KC_F7);
  103. break;
  104. }
  105. }
  106. void altf7_reset(qk_tap_dance_state_t *state, void *user_data) {
  107. switch (td_state[2]) {
  108. case SINGLE_TAP:
  109. unregister_code(KC_F7);
  110. break;
  111. case SINGLE_HOLD:
  112. unregister_mods(MOD_BIT(KC_LALT));
  113. break;
  114. case DOUBLE_TAP:
  115. unregister_code(KC_F7);
  116. unregister_mods(MOD_BIT(KC_LALT));
  117. break;
  118. }
  119. }
  120. qk_tap_dance_action_t tap_dance_actions[] = {
  121. [ALT_F2] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altf2_finished, altf2_reset),
  122. [CTL_F5] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctlf5_finished, ctlf5_reset),
  123. [ALT_F7] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altf7_finished, altf7_reset),
  124. [DEL_NLCK] = ACTION_TAP_DANCE_DOUBLE(KC_DEL, KC_NLCK),
  125. // Double tap right -> END
  126. [TD_REND] = ACTION_TAP_DANCE_DOUBLE(KC_RIGHT, KC_END),
  127. // Double tap left -> HOME
  128. [TD_LOME] = ACTION_TAP_DANCE_DOUBLE(KC_LEFT, KC_HOME),
  129. // Double tap right shift -> CAPS LOCK
  130. [TD_RSFT_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_RSFT, KC_CAPS),
  131. };