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.

312 lines
20 KiB

  1. // from <https://github.com/noahfrederick/dots/tree/master/planck
  2. #include QMK_KEYBOARD_H
  3. #include "keymap_plover.h"
  4. #include "version.h"
  5. extern keymap_config_t keymap_config;
  6. // Keymap layers
  7. enum planck_layers {
  8. QWERTY_LAYER,
  9. LOWER_LAYER,
  10. RAISE_LAYER,
  11. NAV_LAYER,
  12. GUI_LAYER,
  13. STENO_LAYER,
  14. ADJUST_LAYER
  15. };
  16. // Dashes (macOS)
  17. #define KC_NDSH LALT(KC_MINS)
  18. #define KC_MDSH S(LALT(KC_MINS))
  19. // Window manager keys
  20. #define WM_FULL LALT(LGUI(KC_F))
  21. #define WM_NEXT LCTL(LALT(LGUI(KC_RGHT)))
  22. #define WM_PREV LCTL(LALT(LGUI(KC_LEFT)))
  23. #define WM_NW LCTL(LGUI(KC_LEFT))
  24. #define WM_N LALT(LGUI(KC_UP))
  25. #define WM_NE LCTL(LGUI(KC_RGHT))
  26. #define WM_E LALT(LGUI(KC_RGHT))
  27. #define WM_SE S(LCTL(LGUI(KC_RGHT)))
  28. #define WM_S LALT(LGUI(KC_DOWN))
  29. #define WM_SW S(LCTL(LGUI(KC_LEFT)))
  30. #define WM_W LALT(LGUI(KC_LEFT))
  31. #define WM_CNTR LALT(LGUI(KC_C))
  32. #define SFT_INS LSFT(KC_INS)
  33. // Unicode
  34. #ifdef UNICODEMAP_ENABLE
  35. enum unicode_name {
  36. IBANG // ‽
  37. };
  38. const uint32_t PROGMEM unicode_map[] = {
  39. [IBANG] = 0x0203D // ‽
  40. };
  41. #endif // UNICODEMAP_ENABLE
  42. // Custom key codes
  43. enum planck_keycodes {
  44. QWERTY = SAFE_RANGE,
  45. STENO,
  46. PV_EXIT,
  47. PV_LOOK,
  48. SEND_VERSION,
  49. SEND_MAKE
  50. };
  51. #define LOWER MO(LOWER_LAYER)
  52. #define RAISE MO(RAISE_LAYER)
  53. #define GUI_L LT(GUI_LAYER, KC_LBRC)
  54. #define GUI_R LT(GUI_LAYER, KC_RBRC)
  55. #define NAV_SCLN LT(NAV_LAYER, KC_SCLN)
  56. #define NAV_O LT(NAV_LAYER, KC_O)
  57. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  58. /* Base layer (Qwerty)
  59. *
  60. * Q W E R T Y U I O P '
  61. *
  62. * Tap for Esc -- A S D F G H J K L ; Nav -- Tap for Enter
  63. *
  64. * Tap for ( -- Z X C V B N M , . / -- Tap for )
  65. *
  66. * Tap for [ -- GUI Hyper Space Hyper GUI -- Tap for ]
  67. *
  68. * / /
  69. * Tap for ] [ --------'-----------------------------------------------------'
  70. */
  71. [QWERTY_LAYER] = LAYOUT_planck_grid(
  72. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT,
  73. CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NAV_SCLN, CTL_T(KC_ENT),
  74. KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
  75. GUI_L, ALL_T(KC_RBRC), KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_RGUI, KC_RALT, ALL_T(KC_LBRC), GUI_R
  76. ),
  77. /* Numeric layer
  78. *
  79. * Application -- ` F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 #
  80. * window
  81. * switcher 1 2 3 4 5 6 7 8 9 0
  82. *
  83. * - + ` SFTIN : | , . \
  84. *
  85. * Backspace
  86. *
  87. */
  88. [LOWER_LAYER] = LAYOUT_planck_grid(
  89. KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_3),
  90. _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
  91. _______, KC_MINS, KC_PLUS, KC_GRV, SFT_INS, KC_COLN, KC_PIPE, X(IBANG), KC_COMM, KC_DOT, KC_BSLS, _______,
  92. _______, _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, _______, _______, _______, _______
  93. ),
  94. /* Symbol layer
  95. *
  96. * ~ F11 F12 F13 F14 F15 F16 F17 F18 F19 F20 #
  97. *
  98. * ! @ # $ % ^ & * ' " │ │ \
  99. * |-- Mostly shifted version
  100. * _ = ~ SFTIN : | , . / / of lower layer
  101. *
  102. * Delete
  103. *
  104. */
  105. [RAISE_LAYER] = LAYOUT_planck_grid(
  106. S(KC_GRV), KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, S(KC_3),
  107. _______, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), KC_QUOT, S(KC_QUOT), _______,
  108. _______, KC_UNDS, KC_EQL, KC_TILD, SFT_INS, KC_COLN, KC_PIPE, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, _______,
  109. _______, _______, _______, _______, _______, KC_DEL, KC_DEL, _______, _______, _______, _______, _______
  110. ),
  111. /* Directional navigation layer
  112. *
  113. * Large movements -----/```````````````````\ /```````````````````\----- Vim-style arrow keys
  114. *
  115. *
  116. *
  117. * Home PgUp PgDn End
  118. *
  119. *
  120. *
  121. *
  122. *
  123. */
  124. [NAV_LAYER] = LAYOUT_planck_grid(
  125. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  126. _______, XXXXXXX, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, NAV_SCLN, _______,
  127. _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
  128. _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, _______, _______
  129. ),
  130. /* GUI (window management/mouse/media controls) layer
  131. *
  132. * Mouse keys -----/```````````````````\ /```````````````````\----- Window manager
  133. *
  134. * Ms B2Ms UpMs B1Ms WD Prev NW N NE
  135. *
  136. * Ms L Ms DnMs R Ms WU Full W Centr E
  137. *
  138. * Undo Cut Copy Paste Next SW S SE
  139. *
  140. * Prev Play Next Sleep Mute Vol- Vol+
  141. *
  142. * \___ Media ___/ \___ Screen/sleep __/ \___ Volume __/
  143. */
  144. [GUI_LAYER] = LAYOUT_planck_grid(
  145. _______, KC_BTN2, KC_MS_U, KC_BTN1, KC_WH_D, XXXXXXX, XXXXXXX, WM_PREV, WM_NW, WM_N, WM_NE, _______,
  146. _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_U, XXXXXXX, XXXXXXX, WM_FULL, WM_W, WM_CNTR, WM_E, _______,
  147. _______, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, XXXXXXX, XXXXXXX, WM_NEXT, WM_SW, WM_S, WM_SE, _______,
  148. _______, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, KC_SLEP, KC_WAKE, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, _______
  149. ),
  150. /* Base layer (Qwerty-Steno)
  151. *
  152. * # # # # # # # # # # # #
  153. *
  154. * Look T P H F P L T D
  155. * -up S *
  156. * K W R R B G S Z
  157. *
  158. * Exit A O E U
  159. *
  160. */
  161. [STENO_LAYER] = LAYOUT_planck_grid(
  162. PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM, PV_NUM,
  163. PV_LOOK, PV_LS, PV_LT, PV_LP, PV_LH, PV_STAR, PV_STAR, PV_RF, PV_RP, PV_RL, PV_RT, PV_RD,
  164. PV_LOOK, PV_LS, PV_LK, PV_LW, PV_LR, PV_STAR, PV_STAR, PV_RR, PV_RB, PV_RG, PV_RS, PV_RZ,
  165. PV_EXIT, XXXXXXX, XXXXXXX, PV_A, PV_O, KC_SPC, KC_BSPC, PV_E, PV_U, XXXXXXX, XXXXXXX, XXXXXXX
  166. ),
  167. /* Keyboard settings layer
  168. *
  169. * Firmware -- ResetMake Vers
  170. *
  171. * -- Qwert
  172. *
  173. * Audio -- Voic-Voic+Mus +Mus -MIDI+MIDI- Aud +Aud -
  174. *
  175. * Steno Swap Norm
  176. *
  177. * Swap GUI/Alt _/________/ \_____________\_ _/
  178. */
  179. [ADJUST_LAYER] = LAYOUT_planck_grid(
  180. XXXXXXX, RESET, SEND_MAKE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, SEND_VERSION, XXXXXXX,
  181. QWERTY, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  182. XXXXXXX, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, XXXXXXX, XXXXXXX, AU_ON, AU_OFF, XXXXXXX,
  183. STENO, XXXXXXX, AG_SWAP, AG_NORM, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  184. )
  185. };
  186. #ifdef AUDIO_ENABLE
  187. float plover_song[][2] = SONG(PLOVER_SOUND);
  188. float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
  189. #endif
  190. // Send PHROPB ({PLOVER:RESUME}).
  191. void plover_resume(void) {
  192. register_code(PV_LP);
  193. register_code(PV_LH);
  194. register_code(PV_LR);
  195. register_code(PV_O);
  196. register_code(PV_RP);
  197. register_code(PV_RB);
  198. unregister_code(PV_LP);
  199. unregister_code(PV_LH);
  200. unregister_code(PV_LR);
  201. unregister_code(PV_O);
  202. unregister_code(PV_RP);
  203. unregister_code(PV_RB);
  204. }
  205. // Send PHROF ({PLOVER:SUSPEND}).
  206. void plover_suspend(void) {
  207. register_code(PV_LP);
  208. register_code(PV_LH);
  209. register_code(PV_LR);
  210. register_code(PV_O);
  211. register_code(PV_RF);
  212. unregister_code(PV_LP);
  213. unregister_code(PV_LH);
  214. unregister_code(PV_LR);
  215. unregister_code(PV_O);
  216. unregister_code(PV_RF);
  217. }
  218. // Send PHROBG ({PLOVER:LOOKUP}).
  219. void plover_lookup(void) {
  220. register_code(PV_LP);
  221. register_code(PV_LH);
  222. register_code(PV_LR);
  223. register_code(PV_O);
  224. register_code(PV_RB);
  225. register_code(PV_RG);
  226. unregister_code(PV_LP);
  227. unregister_code(PV_LH);
  228. unregister_code(PV_LR);
  229. unregister_code(PV_O);
  230. unregister_code(PV_RB);
  231. unregister_code(PV_RG);
  232. }
  233. void matrix_init_user(void) {
  234. set_unicode_input_mode(UC_LNX);
  235. };
  236. layer_state_t layer_state_set_user(layer_state_t state) {
  237. return update_tri_layer_state(state, LOWER_LAYER, RAISE_LAYER, ADJUST_LAYER);
  238. }
  239. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  240. switch (keycode) {
  241. case STENO:
  242. if (record->event.pressed) {
  243. #ifdef AUDIO_ENABLE
  244. stop_all_notes();
  245. PLAY_SONG(plover_song);
  246. #endif
  247. layer_off(RAISE_LAYER);
  248. layer_off(LOWER_LAYER);
  249. layer_off(ADJUST_LAYER);
  250. layer_on(STENO_LAYER);
  251. if (!eeconfig_is_enabled()) {
  252. eeconfig_init();
  253. }
  254. keymap_config.raw = eeconfig_read_keymap();
  255. keymap_config.nkro = 1;
  256. eeconfig_update_keymap(keymap_config.raw);
  257. plover_resume();
  258. }
  259. return false;
  260. case PV_EXIT:
  261. if (record->event.pressed) {
  262. #ifdef AUDIO_ENABLE
  263. PLAY_SONG(plover_gb_song);
  264. #endif
  265. plover_suspend();
  266. layer_off(STENO_LAYER);
  267. }
  268. return false;
  269. case PV_LOOK:
  270. if (record->event.pressed) {
  271. plover_lookup();
  272. }
  273. return false;
  274. case SEND_VERSION:
  275. if (record->event.pressed) {
  276. SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP "@" QMK_VERSION " (" QMK_BUILDDATE ")");
  277. }
  278. return false;
  279. case SEND_MAKE:
  280. if (record->event.pressed) {
  281. SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP ":dfu\n");
  282. }
  283. return false;
  284. }
  285. return true;
  286. }