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.

242 lines
11 KiB

[Keymap] New Planck 2x2U keymap (#5519) * Initial keymapping * Removed unneccessary config files * Update readme.md * Updated symbol locations, tap dance on parentheses for brackets. * Update readme.md * Fixed layout image inconsistencies * More quality shift key layer control, swapped enter + shift enter * Keyap tweaks and config cleanup * Almost compiling, still has layout reference issues. * Finally compiling. 2x2u layout (default, not mine) had nonexistent keys on it * Super minor changes * Ctrl+Bksp after first tap * Changed bind so un/lock is explicit to work with remote un/locking * Added keyboard passwords please don't hate me * Changed backspace functionality and added em dash * Changed to send_string because it's preferred for macros * Minor fixes * Removed global redefinition and fixed possible issue between 6KRO and NKRO * Cleanup * Layer names, password layer is OSL over toggle * Hopefully now in QMK preferred format. * Blank passwords.c I realized with me excluding this it wouldn't compile - so adding a blank one. * Fixed OSLs not cancelling after tapping term * Matrix change. KC_NO instead of repeating. * Unneeded line. Co-Authored-By: IsaacElenbaas <34344969+IsaacElenbaas@users.noreply.github.com> * Fixed return statements to work with after-press functions * External image host * Removed image from github * Removed unneccessary rules.mk lines and fixed tabbing * Typos * Fixes upon part arrival. * Final changes and bug fixes * Preventing KC_NO from waking monitors. * Fix to rest of matrices In response to https://github.com/evillemez/qmk_firmware/issues/1—the rest have the same problem. The switch of k37 for k36 is just for consistency between that and the 2x2u. * Workaround for #6214, minor changes, CRLF change in passwords because it won't leave my modified no matter what I do.
5 years ago
  1. #include QMK_KEYBOARD_H
  2. #include "passwords.c" //Instead of extern just to cut down on compile time. Holds a single array.
  3. #define MOUSEL KC_BTN1
  4. #define MOUSER KC_BTN2
  5. #define CTRLL LCTL(KC_LEFT)
  6. #define CTRLR LCTL(KC_RGHT)
  7. #define CAD LCTL(LALT(KC_DEL))
  8. #define BASE_L 0
  9. #define SHFT_L 1
  10. #define MOD_L 2
  11. #define NAV_L 3
  12. #define AHK_L 4
  13. #define LOCK_L 5
  14. #define PASS_L 6
  15. static host_driver_t *host_driver = 0;
  16. enum {
  17. HK_SLP = SAFE_RANGE,
  18. HK_IF,
  19. HK_ELSE,
  20. HK_COSL
  21. };
  22. enum {
  23. FB = 0,
  24. LPN,
  25. RPN,
  26. BCK,
  27. DSH
  28. };
  29. enum {
  30. SINGLE_TAP = 1,
  31. SINGLE_HOLD = 2,
  32. DOUBLE_TAP = 3,
  33. DOUBLE_HOLD = 4,
  34. DOUBLE_SINGLE_TAP = 5, //Distinguishes between double tapping and typing, "tapping", for example. Not sure how accurate it is, and I have no need, so avoiding it at the moment.
  35. TRIPLE_TAP = 6,
  36. TRIPLE_HOLD = 7
  37. };
  38. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  39. /* Base
  40. * ,-----------------------------------------------------------------------------------.
  41. * | Tab | ' | , | . | p | y | f | g | c | r | l | Bksp |
  42. * |------+------+------+------+------+-------------+------+------+------+------+------|
  43. * | Nav | a | o | e | u | i | d | h | t | n | s | Enter|
  44. * |------+------+------+------+------+------|------+------+------+------+------+------|
  45. * | Shft | ; | q | j | k | x | b | m | w | v | z | Shft |
  46. * |------+------+------+------+------+------+------+------+------+------+------+------|
  47. * | Esc | RClk | LClk | Ctrl | Space | Modifier | GUI | VolD | VolU |Macros|
  48. * `-----------------------------------------------------------------------------------'
  49. */
  50. [0] = LAYOUT_planck_2x2u(
  51. KC_TAB, KC_QUOT,KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, TD(BCK),
  52. MO(NAV_L),KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENT,
  53. KC_LSFT, KC_SCLN,KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
  54. KC_ESC, MOUSER, MOUSEL, KC_LCTL, KC_SPC, MO(MOD_L), KC_LGUI, KC_VOLD, KC_VOLU, OSL(AHK_L)
  55. ),
  56. /* Custom Shifts
  57. * ,-----------------------------------------------------------------------------------.
  58. * | | | ? | ! | | | | | | | | |
  59. * |------+------+------+------+------+-------------+------+------+------+------+------|
  60. * | | | | | | | | | | | | |
  61. * |------+------+------+------+------+------|------+------+------+------+------+------|
  62. * | | | | | | | | | | | | |
  63. * |------+------+------+------+------+------+------+------+------+------+------+------|
  64. * | | | | | | | | | | |
  65. * `-----------------------------------------------------------------------------------'
  66. */
  67. [1] = LAYOUT_planck_2x2u(
  68. KC_TRNS,KC_TRNS,KC_SLSH,KC_1, KC_TRNS,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,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  70. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
  71. KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_NO, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
  72. ),
  73. /* Modifier
  74. * ,-----------------------------------------------------------------------------------.
  75. * | Tab | + | - | * | / \ | if | else | ( [ | ) ] | { | } | Bksp |
  76. * |------+------+------+------+------+-------------+------+------+------+------+------|
  77. * | = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Enter|
  78. * |------+------+------+------+------+------|------+------+------+------+------+------|
  79. * | ` | < | > | & | | | _ | $ | @ | # | % | ^ | ~ |
  80. * |------+------+------+------+------+------+------+------+------+------+------+------|
  81. * | | | | | Space | | | | | |
  82. * `-----------------------------------------------------------------------------------'
  83. */
  84. [2] = LAYOUT_planck_2x2u(
  85. KC_TRNS,KC_PLUS,TD(DSH),KC_ASTR,TD(FB), HK_IF, HK_ELSE,TD(LPN),TD(RPN),KC_LCBR,KC_RCBR,KC_TRNS,
  86. KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
  87. KC_GRV, KC_LT, KC_GT, KC_AMPR,KC_PIPE,KC_UNDS,KC_DLR, KC_AT, KC_HASH,KC_PERC,KC_CIRC,LSFT(KC_GRV),
  88. KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO
  89. ),
  90. //Nav
  91. [3] = LAYOUT_planck_2x2u(
  92. KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME,KC_UP, KC_END, KC_NO, KC_TRNS,
  93. KC_TRNS,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, CTRLL, KC_LEFT,KC_DOWN,KC_RGHT, CTRLR, KC_TRNS,
  94. KC_LSFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  95. KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
  96. ),
  97. //AHK-Bindable Macros
  98. [4] = LAYOUT_planck_2x2u(
  99. KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24,
  100. LCTL(KC_F13),LCTL(KC_F14),LCTL(KC_F15),LCTL(KC_F16),LCTL(KC_F17),LCTL(KC_F18),LCTL(KC_F19),LCTL(KC_F20),LCTL(KC_F21),LCTL(KC_F22),LCTL(KC_F23),LCTL(KC_F24),
  101. LSFT(KC_F13),LSFT(KC_F14),LSFT(KC_F15),LSFT(KC_F16),LSFT(KC_F17),LSFT(KC_F18),LSFT(KC_F19),LSFT(KC_F20),LSFT(KC_F21),LSFT(KC_F22),LSFT(KC_F23),LSFT(KC_F24),
  102. RESET, LALT(KC_F14),LALT(KC_F15),OSL(PASS_L), CAD, LALT(KC_F19), LALT(KC_F21),LALT(KC_F22),HK_SLP, HK_COSL
  103. ),
  104. //Locked Screen
  105. [5] = LAYOUT_planck_2x2u(
  106. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  107. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  108. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  109. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, HK_SLP, KC_NO
  110. ),
  111. //Passwords (by first letter of service name, at least better than just one)
  112. [6] = LAYOUT_planck_2x2u(
  113. KC_NO, KC_NO, KC_NO, KC_NO, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_NO,
  114. KC_NO, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_NO,
  115. KC_NO, KC_NO, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_NO,
  116. KC_NO, KC_NO, KC_NO, HK_COSL, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
  117. )
  118. };
  119. bool process_record_user(uint16_t keycode, keyrecord_t *record) { //X_KEY doesn't support aliases
  120. switch(keycode) {
  121. //if shift pressed and not shift layer or released and other shift not pressed
  122. //in separate things because MOD_BIT (probably?) isn't toggled until after this returns true and shift is actually toggled
  123. case KC_LSFT: //if pressed and not shift layer or released and other shift not pressed
  124. if((record->event.pressed && IS_LAYER_OFF(SHFT_L)) || (!record->event.pressed && !(get_mods() & MOD_BIT(KC_RSFT)))) { layer_invert(SHFT_L); }
  125. break;
  126. case KC_RSFT:
  127. if((record->event.pressed && IS_LAYER_OFF(SHFT_L)) || (!record->event.pressed && !(get_mods() & MOD_BIT(KC_LSFT)))) { layer_invert(SHFT_L); }
  128. break;
  129. case KC_ENT: //won't repeat on hold and I can't find a solution other than hardcoding timers but I kinda prefer it anyway. Swaps enter and shift enter
  130. if(record->event.pressed) {
  131. (IS_LAYER_ON(SHFT_L)) //if shifted release correct shift, send, and press same shift, else send shift enter
  132. ? (get_mods() & MOD_BIT(KC_LSFT))
  133. ? SEND_STRING(SS_UP(X_LSHIFT) SS_TAP(X_ENTER) SS_DOWN(X_LSHIFT))
  134. : SEND_STRING(SS_UP(X_RSHIFT) SS_TAP(X_ENTER) SS_DOWN(X_RSHIFT))
  135. : SEND_STRING(SS_LSFT(SS_TAP(X_ENTER)));
  136. }
  137. return false;
  138. case HK_IF:
  139. if(record->event.pressed) { SEND_STRING("if"); }
  140. break;
  141. case HK_ELSE:
  142. if(record->event.pressed) { SEND_STRING("else"); }
  143. break;
  144. case HK_COSL:
  145. clear_keyboard();
  146. break;
  147. case HK_SLP:
  148. if(record->event.pressed) {
  149. if(IS_LAYER_OFF(LOCK_L)) {
  150. host_driver = host_get_driver();
  151. SEND_STRING(SS_LALT(SS_TAP(X_F23)));
  152. host_set_driver(0);
  153. }
  154. else {
  155. host_set_driver(host_driver);
  156. SEND_STRING(SS_LALT(SS_TAP(X_F24)));
  157. }
  158. return false;
  159. }
  160. layer_invert(LOCK_L);
  161. if(IS_LAYER_ON(AHK_L))
  162. layer_invert(AHK_L);
  163. break;
  164. default:
  165. if(IS_LAYER_ON(PASS_L) && keycode <= KC_Z) {
  166. SEND_STRING(passwords[keycode - KC_A]);
  167. layer_invert(PASS_L);
  168. return false;
  169. }
  170. }
  171. return true;
  172. };
  173. //tapdance state evaluation
  174. int cur_dance(qk_tap_dance_state_t *state) {
  175. int press = 0;
  176. switch(state->count) {
  177. case 1:
  178. press = (state->interrupted || !state->pressed)
  179. ? SINGLE_TAP
  180. : SINGLE_HOLD;
  181. break;
  182. case 2:
  183. press = DOUBLE_TAP;
  184. break;
  185. case 3:
  186. press = TRIPLE_TAP;
  187. }
  188. return press;
  189. }
  190. void back_tap(qk_tap_dance_state_t *state, void *user_data) { tap_code(KC_BSPACE); }
  191. void back_finished(qk_tap_dance_state_t *state, void *user_data) { if(!(state->interrupted || !state->pressed)) tap_code16(LCTL(KC_BSPACE)); }
  192. void slash_finished(qk_tap_dance_state_t *state, void *user_data) {
  193. int td_state = cur_dance(state);
  194. switch(td_state) {
  195. case SINGLE_TAP:
  196. clear_mods();
  197. clear_weak_mods();
  198. tap_code(KC_SLSH);
  199. break;
  200. case DOUBLE_TAP:
  201. tap_code(KC_NUBS);
  202. }
  203. }
  204. void dash_finished(qk_tap_dance_state_t *state, void *user_data) {
  205. int td_state = cur_dance(state);
  206. switch(td_state) {
  207. case SINGLE_TAP:
  208. tap_code(KC_PMNS);
  209. break;
  210. case SINGLE_HOLD:
  211. register_mods(MOD_BIT(KC_LALT));
  212. tap_code(KC_KP_0);
  213. tap_code(KC_KP_1);
  214. tap_code(KC_KP_5);
  215. tap_code(KC_KP_1);
  216. unregister_mods(MOD_BIT(KC_LALT));
  217. break;
  218. case DOUBLE_TAP:
  219. tap_code(KC_PMNS);
  220. tap_code(KC_PMNS);
  221. }
  222. }
  223. qk_tap_dance_action_t tap_dance_actions[] = {
  224. [LPN] = ACTION_TAP_DANCE_DOUBLE(KC_LPRN, KC_LBRC),
  225. [RPN] = ACTION_TAP_DANCE_DOUBLE(KC_RPRN, KC_RBRC),
  226. [FB] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, slash_finished, NULL),
  227. [BCK] = ACTION_TAP_DANCE_FN_ADVANCED(back_tap, back_finished, NULL), //each tap, on finished, and reset. Normally register_code on press unregister on reset so keys can be held down.
  228. [DSH] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dash_finished, NULL)
  229. };