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.

482 lines
13 KiB

  1. // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
  2. // this is the style you want to emulate.
  3. //
  4. // To flash planck firmware
  5. // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  6. // Reset keyboard or press hw reset button on base (hole)
  7. //
  8. // cd qmk_firmware/keyboards/planck
  9. // sudo make KEYMAP=sdothum dfu
  10. //
  11. // sudo make clean (good practice before flashing)
  12. // sudo make KEYMAP=sdothum (to compile check)
  13. //
  14. // Package requirements (for arch linux)
  15. // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  16. // avr-gcc-atmel
  17. // avr-libc-atmel
  18. // dfu-programmer
  19. //
  20. // Notes
  21. // ▔▔▔▔▔
  22. // ** E R G O W I D E S P L I T ** Layout
  23. //
  24. // Autocompletion tap dance key pairs (),[],{} are available from the
  25. // number/symbol layer, as well as, numerous (un)shift key values
  26. //
  27. // The navigation pad provides a single hand right thumb activated cluster
  28. // with left hand modifiers
  29. //
  30. // #define PRIVATE_STRING includes private_string.h, a user defined code
  31. // block for the PRIV tap dance e.g. SEND_STRING("secret messape"),
  32. // see function private()
  33. //
  34. // Modifier clusters
  35. // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  36. // The num and sym keys together access the navigation pad layer
  37. //
  38. // ,-----------------------------------------------------------------------------------.
  39. // | Ctrl | GUI | Alt | Esc | Space| Tab | Bksp | Ent | Left | Down | Up | Right|
  40. // `-----------------------------------------------------------------------------------'
  41. //
  42. // Hint
  43. // ▔▔▔▔
  44. // For sculpted keycaps such as Cherry or OEM profile, reverse the Alt, Num,
  45. // Shift, Shift, Nav, Sym keycaps for more ergonomic thumb orientation and
  46. // actuation
  47. //
  48. // Code
  49. // ▔▔▔▔
  50. // This source is shamelessly based on the "default" planck layout
  51. //
  52. // #ifdef/#endif block structures are not indented, as syntax highlighting
  53. // in vim is sufficient for identification
  54. //
  55. // c++ commenting style is used throughout
  56. //
  57. // Change history
  58. // ▔▔▔▔▔▔▔▔▔▔▔▔▔▔
  59. // See http://thedarnedestthing.com/planck%20constant
  60. // See http://thedarnedestthing.com/planck%20done
  61. // === N O T E ===
  62. //
  63. // sudo CPATH=<keymap.c directory>/common make ...
  64. #include QMK_KEYBOARD_H
  65. #ifdef STENO_ENABLE
  66. #include "keymap_steno.h"
  67. #endif
  68. extern keymap_config_t keymap_config;
  69. enum planck_layers {
  70. _BASE = 0
  71. ,_SHIFT
  72. ,_LSHIFT
  73. ,_RSHIFT
  74. ,_PLOVER
  75. ,_NUMBER
  76. ,_SYMBOL
  77. ,_FNCKEY
  78. ,_MOUSE
  79. #ifdef CENTER_TT
  80. ,_TTNUMBER
  81. ,_TTREGEX
  82. ,_TTFNCKEY
  83. ,_TTCURSOR
  84. ,_TTMOUSE
  85. #endif
  86. #ifndef SHIFT_SYMBOLS
  87. ,_NUMSYM
  88. ,_SYMREG
  89. #endif
  90. ,_EDIT
  91. ,_QWERTY
  92. ,_ADJUST
  93. ,_END_LAYERS
  94. };
  95. enum planck_keycodes {
  96. BASE = SAFE_RANGE
  97. ,BASE1
  98. ,BASE2
  99. ,PLOVER
  100. ,PLOEXIT
  101. ,SM_CIRC // pseudo GUI_T(S(KC_6)) for shifted key-codes, see process_record_user()
  102. ,SM_DLR // pseudo SFT_T(S(KC_4)) for shifted key-codes, see process_record_user()
  103. ,SM_G // pseudo MT (MOD_LALT | MOD_LSFT, S(KC_G)) for shifted key-codes, see process_record_user()
  104. ,SM_K // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_K)) for shifted key-codes, see process_record_user()
  105. ,SM_PERC // pseudo ALT_T(S(KC_5)) for shifted key-codes, see process_record_user()
  106. ,SM_LPRN // pseudo CTL_T(S(KC_9)) for shifted key-codes, see process_record_user()
  107. ,SM_W // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_W)) for shifted key-codes, see process_record_user()
  108. ,SL_LEFT // pseudo LT (_MOUSE, S(KC_LEFT)) for shifted key-codes, see process_record_user()
  109. ,SP_DEL // pseudo LT (_MOUSE, KC_DEL) for shifted key-codes, see process_record_user()
  110. ,SL_PIPE // pseudo LT (_ADJUST, S(KC_BSLS)) for shifted key-codes, see process_record_user()
  111. ,SL_TAB // pseudo LT (_FNCKEY, S(KC_TAB)) for shifted key-codes, see process_record_user()
  112. #ifdef CENTER_TT
  113. ,TT_ESC
  114. #endif
  115. #ifdef STENO_ENABLE
  116. ,PS_STNA = STN_A
  117. ,PS_STNO = STN_O
  118. ,PS_STNE = STN_E
  119. ,PS_STNU = STN_U
  120. #else
  121. ,LT_C = LT (_NUMBER, KC_C)
  122. ,LT_V = LT (_FNCKEY, KC_V)
  123. ,LT_N = LT (_EDIT, KC_N)
  124. ,LT_M = LT (_SYMBOL, KC_M)
  125. #endif
  126. ,PS_BASE
  127. };
  128. // modifier keys
  129. #define AT_B ALT_T(KC_B)
  130. #define AT_DOWN ALT_T(KC_DOWN)
  131. #define CT_RGHT CTL_T(KC_RGHT)
  132. #define GT_C GUI_T(KC_C)
  133. #define GT_UP GUI_T(KC_UP)
  134. #define MT_E MT (MOD_LCTL | MOD_LALT, KC_E)
  135. #define MT_X MT (MOD_LALT | MOD_LSFT, KC_X)
  136. #define ST_A SFT_T(KC_A)
  137. #ifdef HOME_MODS
  138. #define HOME_K GUI_T(KC_K)
  139. #define HOME_H CTL_T(KC_H)
  140. #define HOME_E ALT_T(KC_E)
  141. #define HOME_A SFT_T(KC_A)
  142. #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
  143. #define HOME_T SFT_T(KC_T)
  144. #define HOME_R ALT_T(KC_R)
  145. #define HOME_S CTL_T(KC_S)
  146. #define HOME_W GUI_T(KC_W)
  147. #else
  148. #define HOME_T SFT_T(KC_T)
  149. #define HOME_S ALT_T(KC_S)
  150. #define HOME_N GUI_T(KC_N)
  151. #define HOME_B CTL_T(KC_B)
  152. #endif
  153. #else
  154. #define HOME_K KC_K
  155. #define HOME_H KC_H
  156. #define HOME_E KC_E
  157. #define HOME_A KC_A
  158. #define HOME_T KC_T
  159. #define HOME_S KC_S
  160. #define HOME_N KC_N
  161. #define HOME_B KC_B
  162. #endif
  163. #define S_DOWN S (KC_DOWN)
  164. #define S_LEFT S (KC_LEFT)
  165. #define S_RGHT S (KC_RGHT)
  166. #define S_TAB S (KC_TAB)
  167. #define S_UP S (KC_UP)
  168. #include "common/tapdance.h"
  169. // keycodes
  170. #define ___x___ KC_TRNS
  171. #define ___fn__ KC_TRNS
  172. #undef _______
  173. #define _______ KC_NO
  174. #define COPY LCTL(KC_C)
  175. #define CUT LCTL(KC_X)
  176. #define EOT LCTL(KC_D)
  177. #define NAK LCTL(KC_U)
  178. #define PASTE LCTL(KC_V)
  179. #define UNDO LCTL(KC_Z)
  180. #define TMCOPY LALT(LCTL(KC_C))
  181. #define TMPASTE LALT(LCTL(KC_V))
  182. #define LT_BSLS LT (_MOUSE, KC_BSLS) // see process_record_user() for extended handling
  183. #define LT_BSPC LT (_EDIT, KC_BSPC)
  184. #define SP_LEFT LT (_EDIT, KC_LEFT)
  185. #define LT_ESC LT (_NUMBER, KC_ESC)
  186. #define LT_LEFT LT (_SYMBOL, KC_LEFT) // see process_record_user() for extended handling
  187. #define SP_BSPC LT (_SYMBOL, KC_BSPC) // see process_record_user() for extended handling
  188. #define LT_TAB LT (_FNCKEY, KC_TAB)
  189. #define LT_INS LT (_FNCKEY, KC_INS)
  190. #define LT_ALTG LT (_FNCKEY, KC_RALT)
  191. #define ADJUST MO (_ADJUST)
  192. #define OS_ALT OSM (MOD_LALT)
  193. #define OS_CTL OSM (MOD_LCTL)
  194. #define OS_GUI OSM (MOD_LGUI)
  195. #define OS_SFT OSM (MOD_LSFT)
  196. #define OS_CALT OSM (MOD_LALT | MOD_LCTL)
  197. #define OS_CGUI OSM (MOD_LGUI | MOD_LCTL)
  198. #define OS_CSFT OSM (MOD_LSFT | MOD_LCTL)
  199. #define OS_SALT OSM (MOD_LALT | MOD_LSFT)
  200. #define OS_SGUI OSM (MOD_LGUI | MOD_LSFT)
  201. #ifdef CENTER_TT
  202. #ifdef BEAKLSP
  203. #define CNTR_TL OSM (MOD_LSFT)
  204. #else
  205. #define CNTR_TL TT (_TTFNCKEY)
  206. #endif
  207. #define CNTR_TR KC_CAPS
  208. #define CNTR_HL TT (_TTCURSOR)
  209. #define CNTR_HR TT (_TTMOUSE)
  210. #define CNTR_BL TT (_TTNUMBER)
  211. #define CNTR_BR TT (_TTREGEX)
  212. #else
  213. #define CNTR_TL OSM (MOD_LALT | MOD_LCTL)
  214. #define CNTR_TR OSM (MOD_LGUI | MOD_LCTL)
  215. #define CNTR_HL OSM (MOD_LALT | MOD_LSFT)
  216. #define CNTR_HR OSM (MOD_LGUI | MOD_LSFT)
  217. #define CNTR_BL TD (_CAPS)
  218. #define CNTR_BR OSM (MOD_LSFT | MOD_LCTL)
  219. #endif
  220. #ifdef THUMB_0
  221. #define LT_EQL LT (_ADJUST, KC_EQL)
  222. #else
  223. #define LT_0 LT (_ADJUST, KC_0)
  224. #endif
  225. #ifndef SHIFT_SYMBOLS
  226. #define LT_A LT (_NUMSYM, KC_A)
  227. #define LT_LFTX LT (_SYMREG, KC_LEFT)
  228. #endif
  229. // ........................................................ Default Alpha Layout
  230. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  231. #include "beakl.h"
  232. #include "colemak.h"
  233. #include "qwerty.h"
  234. #include "common/steno_layout.h"
  235. // ...................................................... Number / Function Keys
  236. #include "common/number_fkey_layout.h"
  237. // ......................................................... Symbol / Navigation
  238. #include "common/symbol_guifn_layout.h"
  239. // ............................................................... Toggle Layers
  240. #ifdef CENTER_TT
  241. #include "common/toggle_layout.h"
  242. #endif
  243. // ......................................................... Short Cuts / Adjust
  244. #include "common/chord_layout.h"
  245. };
  246. // ...................................................................... Sounds
  247. #include "common/sounds.h"
  248. // ........................................................... User Keycode Trap
  249. #include "common/keycode_functions.h"
  250. #define BASE_1 1
  251. #define BASE_2 2
  252. #define BASE_12 3
  253. static uint8_t base_n = 0;
  254. bool process_record_user(uint16_t keycode, keyrecord_t *record)
  255. {
  256. switch (keycode) {
  257. case BASE1:
  258. if (record->event.pressed) {
  259. base_n = base_n | BASE_1;
  260. if (base_n == BASE_12) {
  261. base_layer();
  262. }
  263. }
  264. else {
  265. base_n = base_n & ~BASE_1;
  266. }
  267. return false;
  268. case BASE2:
  269. if (record->event.pressed) {
  270. base_n = base_n | BASE_2;
  271. if (base_n == BASE_12) {
  272. base_layer();
  273. }
  274. }
  275. else {
  276. base_n = base_n & ~BASE_2;
  277. }
  278. return false;
  279. case AT_DOWN:
  280. #ifdef HOME_MODS
  281. case HOME_E:
  282. #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
  283. case HOME_R:
  284. #else
  285. case HOME_S:
  286. #endif
  287. #endif
  288. tap_mods(record, KC_LALT);
  289. break;
  290. case CT_RGHT:
  291. #ifdef HOME_MODS
  292. case HOME_K:
  293. #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
  294. case HOME_W:
  295. #else
  296. case HOME_B:
  297. #endif
  298. #endif
  299. tap_mods(record, KC_LGUI);
  300. break;
  301. case GT_UP:
  302. #ifdef HOME_MODS
  303. case HOME_H:
  304. #if defined(BEAKLMU) || defined(BEAKLSP) || defined(BEAKLGR)
  305. case HOME_S:
  306. #else
  307. case HOME_N:
  308. #endif
  309. #endif
  310. tap_mods(record, KC_LCTL);
  311. break;
  312. #ifdef HOME_MODS
  313. case HOME_A:
  314. case HOME_T:
  315. tap_mods(record, KC_LSFT);
  316. break;
  317. #endif
  318. #ifdef CENTER_TT
  319. case TT_ESC:
  320. clear_tt(); // exit TT layer
  321. return false;
  322. #endif
  323. case LT_ESC:
  324. #ifdef CENTER_TT
  325. if (tt_keycode != 0) {
  326. clear_tt(); // exit TT layer
  327. return false;
  328. }
  329. #endif
  330. tap_layer(record, _NUMBER);
  331. break;
  332. case LT_LEFT:
  333. case SP_BSPC:
  334. tap_layer(record, _SYMBOL);
  335. // LT (_SYMBOL, KC_LEFT) left right combination layer
  336. thumb_layer(record, RIGHT, 0, 0, _SYMBOL, _LSHIFT);
  337. break;
  338. case OS_ALT:
  339. tap_mods(record, KC_LALT);
  340. break;
  341. case OS_CTL:
  342. tap_mods(record, KC_LCTL);
  343. break;
  344. case OS_GUI:
  345. tap_mods(record, KC_LGUI);
  346. break;
  347. case SM_CIRC:
  348. // GUI_T(S(KC_6))
  349. mt_shift(record, KC_LGUI, 0, KC_6);
  350. break;
  351. case SM_DLR:
  352. // SFT_T(S(KC_4))
  353. mt_shift(record, KC_LSFT, 0, KC_4);
  354. break;
  355. case SM_G:
  356. // MT(MOD_LALT | MOD_LSFT, S(KC_G))
  357. mt_shift(record, KC_LALT, KC_LSFT, KC_G);
  358. break;
  359. case SM_K:
  360. // MT(MOD_LGUI | MOD_LSFT, S(KC_K))
  361. mt_shift(record, KC_LGUI, KC_LSFT, KC_K);
  362. break;
  363. case SM_W:
  364. // MT(MOD_LGUI | MOD_LSFT, S(KC_W))
  365. mt_shift(record, KC_LGUI, KC_LSFT, KC_W);
  366. break;
  367. case SM_LPRN:
  368. // CTL_T(S(KC_9))
  369. mt_shift(record, KC_LCTL, 0, KC_9);
  370. break;
  371. case SM_PERC:
  372. // ALT_T(S(KC_5))
  373. mt_shift(record, KC_LALT, 0, KC_5);
  374. break;
  375. case LT_BSLS:
  376. tap_layer(record, _MOUSE);
  377. // LT (_MOUSE, KC_BSLS) left right combination layer, see #define LT_BSLS
  378. thumb_layer(record, LEFT, 0, 0, _MOUSE, _SYMBOL);
  379. break;
  380. case SL_LEFT:
  381. tap_layer(record, _MOUSE);
  382. // LT (_MOUSE, S(KC_LEFT)) left right combination layer
  383. thumb_layer(record, RIGHT, SHIFT, KC_LEFT, _MOUSE, _LSHIFT);
  384. break;
  385. case SP_DEL:
  386. tap_layer(record, _MOUSE);
  387. // LT (_MOUSE, S(KC_LEFT)) left right combination layer
  388. thumb_layer(record, RIGHT, NOSHIFT, KC_DEL, _MOUSE, _LSHIFT);
  389. break;
  390. case SL_PIPE:
  391. // LT (_ADJUST, S(KC_BSLS)) emulation
  392. lt_shift(record, KC_BSLS, _ADJUST);
  393. break;
  394. case SL_TAB:
  395. // LT (_FNCKEY, S(KC_TAB)) emulation
  396. lt_shift(record, KC_TAB, _FNCKEY);
  397. break;
  398. case TD_ENT:
  399. tap_layer(record, _RSHIFT);
  400. // LT (_RSHIFT, KC_ENT) emulation, see tap dance enter
  401. break;
  402. case TD_SPC:
  403. tap_layer(record, _LSHIFT);
  404. // LT (_LSHIFT, KC_SPC) left right combination layer, see tap dance TD_SPC
  405. thumb_layer(record, LEFT, 0, 0, _LSHIFT, _SYMBOL);
  406. break;
  407. #ifdef CENTER_TT
  408. case CNTR_TL:
  409. case CNTR_TR:
  410. case CNTR_HL:
  411. case CNTR_HR:
  412. case CNTR_BL:
  413. case CNTR_BR:
  414. if (tt_keycode != keycode && tt_keycode != 0) {
  415. clear_tt(); // return to base layer first if different TT layer selected
  416. }
  417. tt_keycode = keycode;
  418. break;
  419. #endif
  420. // #ifdef STENO_ENABLE
  421. // case PS_STNA:
  422. // stn_layer(record, STN_A, _NUMBER);
  423. // break;
  424. // case PS_STNO:
  425. // stn_layer(record, STN_O, _FNCKEY);
  426. // break;
  427. // case PS_STNE:
  428. // stn_layer(record, STN_E, _EDIT);
  429. // break;
  430. // case PS_STNU:
  431. // stn_layer(record, STN_U, _SYMBOL);
  432. // break;
  433. // #endif
  434. case PS_BASE:
  435. if (record->event.pressed) {
  436. base_layer();
  437. }
  438. return false;
  439. case PLOVER:
  440. steno(record);
  441. return false;
  442. case PLOEXIT:
  443. steno_exit(record);
  444. return false;
  445. }
  446. return true;
  447. }
  448. #include "common/init.h"