keymap.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  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 "config.h"
  65. #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
  66. #include "planck.h"
  67. #include "action_layer.h"
  68. #ifdef STENO_ENABLE
  69. #include "keymap_steno.h"
  70. #endif
  71. #ifdef AUDIO_ENABLE
  72. #include "audio.h"
  73. #endif
  74. #include "eeconfig.h"
  75. extern keymap_config_t keymap_config;
  76. enum planck_layers {
  77. _BASE = 0
  78. ,_SHIFT
  79. ,_LSHIFT
  80. ,_RSHIFT
  81. ,_LSYMBOL
  82. ,_RSYMBOL
  83. ,_PLOVER
  84. ,_NUMBER
  85. ,_SYMBOL
  86. ,_FNCKEY
  87. ,_MOUSE
  88. ,_EDIT
  89. ,_ADJUST
  90. #ifdef CENTER_TT
  91. ,_TTNUMBER
  92. ,_TTREGEX
  93. ,_TTFNCKEY
  94. ,_TTCURSOR
  95. ,_TTMOUSE
  96. #endif
  97. ,_END_LAYERS
  98. };
  99. enum planck_keycodes {
  100. BASE = SAFE_RANGE
  101. ,BASE1
  102. ,BASE2
  103. ,PLOVER
  104. ,SM_CIRC // pseudo GUI_T(S(KC_6)) for shifted key-codes, see process_record_user()
  105. ,SM_DLR // pseudo SFT_T(S(KC_4)) for shifted key-codes, see process_record_user()
  106. ,SM_G // pseudo MT (MOD_LALT | MOD_LSFT, S(KC_G)) for shifted key-codes, see process_record_user()
  107. ,SM_H // pseudo MT (MOD_LCTL | MOD_LSFT, S(KC_H)) for shifted key-codes, see process_record_user()
  108. ,SM_PERC // pseudo ALT_T(S(KC_5)) for shifted key-codes, see process_record_user()
  109. ,SM_W // pseudo MT (MOD_LGUI | MOD_LSFT, S(KC_W)) for shifted key-codes, see process_record_user()
  110. ,SL_LEFT // pseudo LT (_MOUSE, S(KC_LEFT)) for shifted key-codes, see process_record_user()
  111. ,SP_DEL // pseudo LT (_MOUSE, KC_DEL) for shifted key-codes, see process_record_user()
  112. ,SL_TAB // pseudo LT (_FNCKEY, S(KC_TAB)) for shifted key-codes, see process_record_user()
  113. ,SL_SPC // pseudo LT (S(_SYMBOL), KC_SPC) for home row shifted GUIFN
  114. #ifdef HOME_MODS
  115. ,HOME_A // pseudo SFT_T(KC_A)
  116. ,HOME_T // pseudo SFT_T(KC_T)
  117. #endif
  118. #ifdef CENTER_TT
  119. ,TT_ESC
  120. #endif
  121. #ifdef STENO_ENABLE
  122. ,PS_STNA = STN_A
  123. ,PS_STNO = STN_O
  124. ,PS_STNE = STN_E
  125. ,PS_STNU = STN_U
  126. #else
  127. ,LT_C = LT (_NUMBER, KC_C)
  128. ,LT_V = LT (_FNCKEY, KC_V)
  129. ,LT_N = LT (_EDIT, KC_N)
  130. ,LT_M = LT (_SYMBOL, KC_M)
  131. #endif
  132. };
  133. // modifier keys
  134. #define AT_B ALT_T(KC_B)
  135. #define AT_DOWN ALT_T(KC_DOWN)
  136. #define CT_RGHT CTL_T(KC_RGHT)
  137. #define GT_C GUI_T(KC_C)
  138. #define GT_UP GUI_T(KC_UP)
  139. #define MT_E MT (MOD_LCTL | MOD_LALT, KC_E)
  140. #define ST_A SFT_T(KC_A)
  141. #ifdef HOME_MODS
  142. #define HOME_H GUI_T(KC_H)
  143. #define HOME_I CTL_T(KC_I)
  144. #define HOME_E ALT_T(KC_E)
  145. #define HOME_R ALT_T(KC_R)
  146. #define HOME_S CTL_T(KC_S)
  147. #define HOME_W GUI_T(KC_W)
  148. #else
  149. #define HOME_H KC_H
  150. #define HOME_I KC_I
  151. #define HOME_E KC_E
  152. #define HOME_A KC_A
  153. #define HOME_T KC_T
  154. #define HOME_R KC_R
  155. #define HOME_S KC_S
  156. #define HOME_W KC_W
  157. #endif
  158. #define S_DOWN S (KC_DOWN)
  159. #define S_LEFT S (KC_LEFT)
  160. #define S_RGHT S (KC_RGHT)
  161. #define S_TAB S (KC_TAB)
  162. #define S_UP S (KC_UP)
  163. #include "tapdance.h"
  164. // keycodes
  165. #define ___x___ KC_TRNS
  166. #define ___fn__ KC_TRNS
  167. #ifdef _______
  168. #undef _______
  169. #endif
  170. #define _______ KC_NO
  171. #define COPY LCTL(KC_C)
  172. #define CUT LCTL(KC_X)
  173. #define EOT LCTL(KC_D)
  174. #define NAK LCTL(KC_U)
  175. #define PASTE LCTL(KC_V)
  176. #define UNDO LCTL(KC_Z)
  177. #define TMCOPY LALT(LCTL(KC_C))
  178. #define TMPASTE LALT(LCTL(KC_V))
  179. #define LT_BSLS LT (_MOUSE, KC_BSLS) // see process_record_user() for extended handling
  180. #define LT_BSPC LT (_EDIT, KC_BSPC)
  181. #define SP_LEFT LT (_EDIT, KC_LEFT)
  182. #define LT_ESC LT (_NUMBER, KC_ESC)
  183. #define LT_LEFT LT (_SYMBOL, KC_LEFT) // see process_record_user() for extended handling
  184. #define SP_BSPC LT (_SYMBOL, KC_BSPC) // see process_record_user() for extended handling
  185. #define LT_TAB LT (_FNCKEY, KC_TAB)
  186. #define LT_INS LT (_FNCKEY, KC_INS)
  187. #define ADJUST MO (_ADJUST)
  188. #define OS_ALT OSM (MOD_LALT)
  189. #define OS_CTL OSM (MOD_LCTL)
  190. #define OS_GUI OSM (MOD_LGUI)
  191. #define OS_SFT OSM (MOD_LSFT)
  192. #ifdef CENTER_TT
  193. #define CNTR_TL TT (_TTFNCKEY)
  194. #define CNTR_TR KC_CAPS
  195. #define CNTR_HL TT (_TTCURSOR)
  196. #define CNTR_HR TT (_TTMOUSE)
  197. #define CNTR_BL TT (_TTNUMBER)
  198. #define CNTR_BR TT (_TTREGEX)
  199. #else
  200. #define CNTR_TL OSM (MOD_LALT | MOD_LCTL)
  201. #define CNTR_TR OSM (MOD_LGUI | MOD_LCTL)
  202. #define CNTR_HL OSM (MOD_LALT | MOD_LSFT)
  203. #define CNTR_HR OSM (MOD_LGUI | MOD_LSFT)
  204. #define CNTR_BL TD (_CAPS)
  205. #define CNTR_BR OSM (MOD_LSFT | MOD_LCTL)
  206. #endif
  207. // LT can only reference layers 0-15
  208. #ifdef THUMB_0
  209. #define LT_EQL LT (_ADJUST, KC_EQL)
  210. #else
  211. #define LT_0 LT (_ADJUST, KC_0)
  212. #endif
  213. // ........................................................ Default Alpha Layout
  214. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  215. #include "hiea.h"
  216. #include "steno_layout.h"
  217. // ...................................................... Number / Function Keys
  218. #include "number_fkey_layout.h"
  219. // ......................................................... Symbol / Navigation
  220. #include "symbol_guifn_layout.h"
  221. // ............................................................... Toggle Layers
  222. #ifdef CENTER_TT
  223. #include "toggle_layout.h"
  224. #endif
  225. // ......................................................... Short Cuts / Adjust
  226. #include "chord_layout.h"
  227. };
  228. // ...................................................................... Sounds
  229. #include "sounds.h"
  230. // ........................................................... User Keycode Trap
  231. #include "keycode_functions.h"
  232. #define BASE_1 1
  233. #define BASE_2 2
  234. #define BASE_12 3
  235. static uint8_t base_n = 0;
  236. bool process_record_user(uint16_t keycode, keyrecord_t *record)
  237. {
  238. switch (keycode) {
  239. case BASE1:
  240. if (record->event.pressed) {
  241. base_n = base_n | BASE_1;
  242. if (base_n == BASE_12) {
  243. base_layer();
  244. }
  245. }
  246. else {
  247. base_n = base_n & ~BASE_1;
  248. }
  249. return false;
  250. case BASE2:
  251. if (record->event.pressed) {
  252. base_n = base_n | BASE_2;
  253. if (base_n == BASE_12) {
  254. base_layer();
  255. }
  256. }
  257. else {
  258. base_n = base_n & ~BASE_2;
  259. }
  260. return false;
  261. #ifdef HOME_MODS
  262. case HOME_E:
  263. case HOME_R:
  264. tap_mods(record, KC_LALT);
  265. symbol_shift(record, 0);
  266. break;
  267. case HOME_H:
  268. case HOME_W:
  269. tap_mods(record, KC_LGUI);
  270. symbol_shift(record, 0);
  271. break;
  272. case HOME_I:
  273. case HOME_S:
  274. tap_mods(record, KC_LCTL);
  275. symbol_shift(record, 0);
  276. break;
  277. case HOME_A:
  278. tap_mods(record, KC_LSFT);
  279. symbol_shift(record, KC_A);
  280. break;
  281. case HOME_T:
  282. tap_mods(record, KC_RSFT);
  283. symbol_shift(record, KC_T);
  284. break;
  285. #else
  286. case AT_DOWN:
  287. tap_mods(record, KC_LALT);
  288. break;
  289. case CT_RGHT:
  290. tap_mods(record, KC_LGUI);
  291. break;
  292. case GT_UP:
  293. tap_mods(record, KC_LCTL);
  294. break;
  295. #endif
  296. case SL_SPC:
  297. lt(record, NOSHIFT, KC_SPC, KC_LSFT, _SYMBOL);
  298. break;
  299. #ifdef CENTER_TT
  300. case TT_ESC:
  301. clear_tt(); // exit TT layer
  302. return false;
  303. #endif
  304. case LT_ESC:
  305. #ifdef CENTER_TT
  306. if (tt_keycode != 0) {
  307. clear_tt(); // exit TT layer
  308. return false;
  309. }
  310. #endif
  311. tap_layer(record, _NUMBER);
  312. break;
  313. case LT_LEFT:
  314. case SP_BSPC:
  315. tap_layer(record, _SYMBOL);
  316. // LT (_SYMBOL, KC_LEFT) left right combination layer
  317. thumb_layer(record, RIGHT, 0, 0, _SYMBOL, _LSHIFT);
  318. break;
  319. case OS_ALT:
  320. tap_mods(record, KC_LALT);
  321. break;
  322. case OS_CTL:
  323. tap_mods(record, KC_LCTL);
  324. break;
  325. case OS_GUI:
  326. tap_mods(record, KC_LGUI);
  327. break;
  328. case SM_CIRC:
  329. // GUI_T(S(KC_6))
  330. mt_shift(record, KC_LGUI, 0, KC_6);
  331. break;
  332. case SM_DLR:
  333. // SFT_T(S(KC_4))
  334. mt_shift(record, KC_LSFT, 0, KC_4);
  335. break;
  336. case SM_G:
  337. // MT(MOD_LALT | MOD_LSFT, S(KC_G))
  338. mt_shift(record, KC_LALT, KC_LSFT, KC_G);
  339. break;
  340. case SM_H:
  341. // MT(MOD_LCTL | MOD_LSFT, S(KC_K))
  342. mt_shift(record, KC_LCTL, KC_LSFT, KC_H);
  343. break;
  344. case SM_W:
  345. // MT(MOD_LGUI | MOD_LSFT, S(KC_W))
  346. mt_shift(record, KC_LGUI, KC_LSFT, KC_W);
  347. break;
  348. case SM_PERC:
  349. // ALT_T(S(KC_5))
  350. mt_shift(record, KC_LALT, 0, KC_5);
  351. break;
  352. case LT_BSLS:
  353. tap_layer(record, _MOUSE);
  354. // LT (_MOUSE, KC_BSLS) left right combination layer, see #define LT_BSLS
  355. thumb_layer(record, LEFT, 0, 0, _MOUSE, _SYMBOL);
  356. break;
  357. case SL_LEFT:
  358. tap_layer(record, _MOUSE);
  359. // LT (_MOUSE, S(KC_LEFT)) left right combination layer
  360. thumb_layer(record, RIGHT, SHIFT, KC_LEFT, _MOUSE, _LSHIFT);
  361. break;
  362. case SP_DEL:
  363. tap_layer(record, _MOUSE);
  364. // LT (_MOUSE, S(KC_LEFT)) left right combination layer
  365. thumb_layer(record, RIGHT, NOSHIFT, KC_DEL, _MOUSE, _LSHIFT);
  366. break;
  367. case SL_TAB:
  368. // LT (_FNCKEY, S(KC_TAB)) emulation
  369. lt_shift(record, KC_TAB, _FNCKEY);
  370. break;
  371. case TD_ENT:
  372. tap_layer(record, _RSHIFT);
  373. // LT (_RSHIFT, KC_ENT) emulation, see tap dance enter
  374. break;
  375. case TD_SPC:
  376. tap_layer(record, _LSHIFT);
  377. // LT (_LSHIFT, KC_SPC) left right combination layer, see tap dance TD_SPC
  378. thumb_layer(record, LEFT, 0, 0, _LSHIFT, _SYMBOL);
  379. break;
  380. #ifdef CENTER_TT
  381. case CNTR_TL:
  382. case CNTR_TR:
  383. case CNTR_HL:
  384. case CNTR_HR:
  385. case CNTR_BL:
  386. case CNTR_BR:
  387. if (tt_keycode != keycode && tt_keycode != 0) {
  388. clear_tt(); // return to base layer first if different TT layer selected
  389. }
  390. tt_keycode = keycode;
  391. break;
  392. #endif
  393. // #ifdef STENO_ENABLE
  394. // case PS_STNA:
  395. // stn_layer(record, STN_A, _NUMBER);
  396. // break;
  397. // case PS_STNO:
  398. // stn_layer(record, STN_O, _FNCKEY);
  399. // break;
  400. // case PS_STNE:
  401. // stn_layer(record, STN_E, _EDIT);
  402. // break;
  403. // case PS_STNU:
  404. // stn_layer(record, STN_U, _SYMBOL);
  405. // break;
  406. // #endif
  407. case PLOVER:
  408. steno(record);
  409. return false;
  410. }
  411. return true;
  412. }
  413. #include "init.h"