keymap.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  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. #include "planck.h"
  4. #include "action_layer.h"
  5. #ifdef AUDIO_ENABLE
  6. #include "audio.h"
  7. #include "musical_notes.h"
  8. #endif
  9. #include "eeconfig.h"
  10. #include "process_unicode.h"
  11. #include "quantum.h"
  12. // #define TOLELOT_ENABLE
  13. #define DOUBLESPACE_LAYER_ENABLE
  14. #define LAYOUT_DVORAK
  15. #define LAYOUT_COLEMAK
  16. #define LAYOUT_WORKMAN
  17. #define LAYOUT_NORMAN
  18. // so i can copy & paste stuff from my other planck-like keyboards
  19. #define KEYMAP( \
  20. k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
  21. k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
  22. k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
  23. k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \
  24. ) \
  25. { \
  26. {k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c}, \
  27. {k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c}, \
  28. {k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c}, \
  29. {k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c} \
  30. }
  31. // Fillers to make layering clearer
  32. #define _______ KC_TRNS
  33. #define XXXXXXX KC_NO
  34. #define G(x) LGUI(x)
  35. #define KC_WWWB KC_WWW_BACK
  36. #define KC_WWWF KC_WWW_FORWARD
  37. // hybrid right-alt & scroll lock (mapped to Compose in OS)
  38. #undef KC_RALT
  39. #define KC_RALT MT(MOD_RALT, KC_SLCK)
  40. bool capslock = false;
  41. #ifdef DOUBLESPACE_LAYER_ENABLE
  42. bool lspace_active = false;
  43. bool rspace_active = false;
  44. bool lspace_emitted = false;
  45. bool rspace_emitted = false;
  46. bool space_layer_entered = false;
  47. #endif
  48. void turn_off_capslock(void);
  49. extern keymap_config_t keymap_config;
  50. enum layers {
  51. _QWERTY,
  52. _DVORAK,
  53. _COLEMAK,
  54. _WORKMAN,
  55. _NORMAN,
  56. _DEFAULT_LAYER_MAX = _NORMAN,
  57. _GREEKU,
  58. _GREEKL,
  59. _NUM,
  60. _FUNC,
  61. _PUNC,
  62. _EMOJI,
  63. _GUI,
  64. _SYS,
  65. };
  66. // double-space layer
  67. #define _SPACE _GUI
  68. enum planck_keycodes {
  69. // layouts
  70. QWERTY = SAFE_RANGE,
  71. DVORAK,
  72. COLEMAK,
  73. WORKMAN,
  74. NORMAN,
  75. // layer switchers
  76. PUNC,
  77. NUM,
  78. FUNC,
  79. EMOJI,
  80. GUI,
  81. GREEK,
  82. // os switchers
  83. LINUX,
  84. WIN,
  85. OSX,
  86. // others
  87. LSPACE,
  88. RSPACE,
  89. GLOW,
  90. // stubs
  91. OUT_BLE
  92. };
  93. // unicode map
  94. enum unicode_name {
  95. GRIN, // grinning face 😊
  96. TJOY, // tears of joy 😂
  97. SMILE, // grining face with smiling eyes 😁
  98. HEART, // heart ❤
  99. EYERT, // smiling face with heart shaped eyes 😍
  100. CRY, // crying face 😭
  101. SMEYE, // smiling face with smiling eyes 😊
  102. UNAMU, // unamused 😒
  103. KISS, // kiss 😘
  104. HART2, // two hearts 💕
  105. WEARY, // weary 😩
  106. OKHND, // ok hand sign 👌
  107. PENSV, // pensive 😔
  108. SMIRK, // smirk 😏
  109. RECYC, // recycle ♻
  110. WINK, // wink 😉
  111. THMUP, // thumb up 👍
  112. THMDN, // thumb down 👎
  113. PRAY, // pray 🙏
  114. PHEW, // relieved 😌
  115. MUSIC, // musical notes
  116. FLUSH, // flushed 😳
  117. CELEB, // celebration 🙌
  118. CRY2, // crying face 😢
  119. COOL, // smile with sunglasses 😎
  120. NOEVS, // see no evil
  121. NOEVH, // hear no evil
  122. NOEVK, // speak no evil
  123. POO, // pile of poo
  124. EYES, // eyes
  125. VIC, // victory hand
  126. BHART, // broken heart
  127. SLEEP, // sleeping face
  128. SMIL2, // smiling face with open mouth & sweat
  129. HUNRD, // 100
  130. CONFU, // confused
  131. TONGU, // face with tongue & winking eye
  132. DISAP, // disappointed
  133. YUMMY, // face savoring delicious food
  134. CLAP, // hand clapping
  135. FEAR, // face screaming in fear
  136. HORNS, // smiling face with horns
  137. HALO, // smiling face with halo
  138. BYE, // waving hand
  139. SUN, // sun
  140. MOON, // moon
  141. SKULL, // skull
  142. // greek letters
  143. UALPH,
  144. UBETA,
  145. UGAMM,
  146. UDELT,
  147. UEPSI,
  148. UZETA,
  149. UETA,
  150. UTHET,
  151. UIOTA,
  152. UKAPP,
  153. ULAMB,
  154. UMU,
  155. UNU,
  156. UXI,
  157. UOMIC,
  158. UPI,
  159. URHO,
  160. USIGM,
  161. UTAU,
  162. UUPSI,
  163. UPHI,
  164. UCHI,
  165. UPSI,
  166. UOMEG,
  167. LALPH,
  168. LBETA,
  169. LGAMM,
  170. LDELT,
  171. LEPSI,
  172. LZETA,
  173. LETA,
  174. LTHET,
  175. LIOTA,
  176. LKAPP,
  177. LLAMB,
  178. LMU,
  179. LNU,
  180. LXI,
  181. LOMIC,
  182. LPI,
  183. LRHO,
  184. LSIGM,
  185. LTAU,
  186. LUPSI,
  187. LPHI,
  188. LCHI,
  189. LPSI,
  190. LOMEG,
  191. FSIGM,
  192. };
  193. const uint32_t PROGMEM unicode_map[] = {
  194. [GRIN] = 0x1F600,
  195. [TJOY] = 0x1F602,
  196. [SMILE] = 0x1F601,
  197. [HEART] = 0x2764,
  198. [EYERT] = 0x1f60d,
  199. [CRY] = 0x1f62d,
  200. [SMEYE] = 0x1F60A,
  201. [UNAMU] = 0x1F612,
  202. [KISS] = 0x1F618,
  203. [HART2] = 0x1F495,
  204. [WEARY] = 0x1F629,
  205. [OKHND] = 0x1F44C,
  206. [PENSV] = 0x1F614,
  207. [SMIRK] = 0x1F60F,
  208. [RECYC] = 0x267B,
  209. [WINK] = 0x1F609,
  210. [THMUP] = 0x1F44D,
  211. [THMDN] = 0x1F44E,
  212. [PRAY] = 0x1F64F,
  213. [PHEW] = 0x1F60C,
  214. [MUSIC] = 0x1F3B6,
  215. [FLUSH] = 0x1F633,
  216. [CELEB] = 0x1F64C,
  217. [CRY2] = 0x1F622,
  218. [COOL] = 0x1F60E,
  219. [NOEVS] = 0x1F648,
  220. [NOEVH] = 0x1F649,
  221. [NOEVK] = 0x1F64A,
  222. [POO] = 0x1F4A9,
  223. [EYES] = 0x1F440,
  224. [VIC] = 0x270C,
  225. [BHART] = 0x1F494,
  226. [SLEEP] = 0x1F634,
  227. [SMIL2] = 0x1F605,
  228. [HUNRD] = 0x1F4AF,
  229. [CONFU] = 0x1F615,
  230. [TONGU] = 0x1F61C,
  231. [DISAP] = 0x1F61E,
  232. [YUMMY] = 0x1F60B,
  233. [CLAP] = 0x1F44F,
  234. [FEAR] = 0x1F631,
  235. [HORNS] = 0x1F608,
  236. [HALO] = 0x1F607,
  237. [BYE] = 0x1F44B,
  238. [SUN] = 0x2600,
  239. [MOON] = 0x1F314,
  240. [SKULL] = 0x1F480,
  241. // greek letters
  242. [UALPH] = 0x0391,
  243. [UBETA] = 0x0392,
  244. [UGAMM] = 0x0393,
  245. [UDELT] = 0x0394,
  246. [UEPSI] = 0x0395,
  247. [UZETA] = 0x0396,
  248. [UETA] = 0x0397,
  249. [UTHET] = 0x0398,
  250. [UIOTA] = 0x0399,
  251. [UKAPP] = 0x039A,
  252. [ULAMB] = 0x039B,
  253. [UMU] = 0x039C,
  254. [UNU] = 0x039D,
  255. [UXI] = 0x039E,
  256. [UOMIC] = 0x039F,
  257. [UPI] = 0x03A0,
  258. [URHO] = 0x03A1,
  259. [USIGM] = 0x03A3,
  260. [UTAU] = 0x03A4,
  261. [UUPSI] = 0x03A5,
  262. [UPHI] = 0x03A6,
  263. [UCHI] = 0x03A7,
  264. [UPSI] = 0x03A8,
  265. [UOMEG] = 0x03A9,
  266. [LALPH] = 0x03B1,
  267. [LBETA] = 0x03B2,
  268. [LGAMM] = 0x03B3,
  269. [LDELT] = 0x03B4,
  270. [LEPSI] = 0x03B5,
  271. [LZETA] = 0x03B6,
  272. [LETA] = 0x03B7,
  273. [LTHET] = 0x03B8,
  274. [LIOTA] = 0x03B9,
  275. [LKAPP] = 0x03BA,
  276. [LLAMB] = 0x03BB,
  277. [LMU] = 0x03BC,
  278. [LNU] = 0x03BD,
  279. [LXI] = 0x03BE,
  280. [LOMIC] = 0x03BF,
  281. [LPI] = 0x03C0,
  282. [LRHO] = 0x03C1,
  283. [LSIGM] = 0x03C3,
  284. [LTAU] = 0x03C4,
  285. [LUPSI] = 0x03C5,
  286. [LPHI] = 0x03C6,
  287. [LCHI] = 0x03C7,
  288. [LPSI] = 0x03C8,
  289. [LOMEG] = 0x03C9,
  290. [FSIGM] = 0x03C2,
  291. };
  292. // hybrid right-gui & scroll lock (mapped to Compose in OS)
  293. #undef KC_RALT
  294. #define KC_RALT MT(MOD_RALT, KC_SLCK)
  295. // keymaps
  296. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  297. /* Qwerty
  298. * ,-----------------------------------------------------------------------------------.
  299. * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
  300. * |------+------+------+------+------+-------------+------+------+------+------+------|
  301. * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
  302. * |------+------+------+------+------+------|------+------+------+------+------+------|
  303. * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
  304. * |------+------+------+------+------+------+------+------+------+------+------+------|
  305. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  306. * `-----------------------------------------------------------------------------------'
  307. */
  308. [_QWERTY] = KEYMAP(
  309. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  310. KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
  311. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  312. KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX, NUM, LSPACE, RSPACE, FUNC, GREEK, KC_RGUI, KC_RALT, KC_RCTL
  313. ),
  314. /* Dvorak
  315. * ,-----------------------------------------------------------------------------------.
  316. * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
  317. * |------+------+------+------+------+-------------+------+------+------+------+------|
  318. * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
  319. * |------+------+------+------+------+------|------+------+------+------+------+------|
  320. * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
  321. * |------+------+------+------+------+------+------+------+------+------+------+------|
  322. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  323. * `-----------------------------------------------------------------------------------'
  324. */
  325. #ifdef LAYOUT_DVORAK
  326. [_DVORAK] = KEYMAP(
  327. _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
  328. _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
  329. _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
  330. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  331. ),
  332. #endif
  333. /* Colemak
  334. * ,-----------------------------------------------------------------------------------.
  335. * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
  336. * |------+------+------+------+------+-------------+------+------+------+------+------|
  337. * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
  338. * |------+------+------+------+------+------|------+------+------+------+------+------|
  339. * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
  340. * |------+------+------+------+------+------+------+------+------+------+------+------|
  341. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  342. * `-----------------------------------------------------------------------------------'
  343. */
  344. #ifdef LAYOUT_COLEMAK
  345. [_COLEMAK] = KEYMAP(
  346. _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
  347. _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
  348. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  349. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  350. ),
  351. #endif
  352. /* Norman
  353. * ,-----------------------------------------------------------------------------------.
  354. * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
  355. * |------+------+------+------+------+-------------+------+------+------+------+------|
  356. * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
  357. * |------+------+------+------+------+------|------+------+------+------+------+------|
  358. * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
  359. * |------+------+------+------+------+------+------+------+------+------+------+------|
  360. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  361. * `-----------------------------------------------------------------------------------'
  362. */
  363. #ifdef LAYOUT_NORMAN
  364. [_NORMAN] = KEYMAP(
  365. _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
  366. _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
  367. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  368. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  369. ),
  370. #endif
  371. /* Workman
  372. * ,-----------------------------------------------------------------------------------.
  373. * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
  374. * |------+------+------+------+------+-------------+------+------+------+------+------|
  375. * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
  376. * |------+------+------+------+------+------|------+------+------+------+------+------|
  377. * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
  378. * |------+------+------+------+------+------+------+------+------+------+------+------|
  379. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  380. * `-----------------------------------------------------------------------------------'
  381. */
  382. #ifdef LAYOUT_WORKMAN
  383. [_WORKMAN] = KEYMAP(
  384. _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
  385. _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
  386. _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
  387. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  388. ),
  389. #endif
  390. /* Punc
  391. * ,-----------------------------------------------------------------------------------.
  392. * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | ` |
  393. * |------+------+------+------+------+-------------+------+------+------+------+------|
  394. * | | * | \ | - | = | / | | ( | ) | < | > | |
  395. * |------+------+------+------+------+------|------+------+------+------+------+------|
  396. * | & | ^ | | | _ | + | ? | | [ | ] | { | } | : |
  397. * |------+------+------+------+------+------+------+------+------+------+------+------|
  398. * | | | | | | | | | | | |
  399. * `-----------------------------------------------------------------------------------'
  400. */
  401. [_PUNC] = KEYMAP(
  402. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
  403. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, XXXXXXX, KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
  404. KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
  405. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  406. ),
  407. /* Num
  408. * ,-----------------------------------------------------------------------------------.
  409. * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | ` |
  410. * |------+------+------+------+------+-------------+------+------+------+------+------|
  411. * | | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
  412. * |------+------+------+------+------+------|------+------+------+------+------+------|
  413. * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | : |
  414. * |------+------+------+------+------+------+------+------+------+------+------+------|
  415. * | | | | | | | x | 0 | , | . | | |
  416. * `-----------------------------------------------------------------------------------'
  417. */
  418. [_NUM] = KEYMAP(
  419. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_7, KC_8, KC_9, S(KC_D), _______,
  420. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
  421. KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_1, KC_2, KC_3, S(KC_F), KC_COLN,
  422. _______, _______, _______, _______, _______, _______, _______, LT(_PUNC, KC_0), KC_COMM, KC_DOT, KC_X, _______
  423. ),
  424. /* Func
  425. * ,-----------------------------------------------------------------------------------.
  426. * | | F1 | F2 | F3 | F4 | | | PgUp | Up | PgDn | PgUp | Del |
  427. * |------+------+------+------+------+-------------+------+------+------+------+------|
  428. * | | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | Ins |
  429. * |------+------+------+------+------+------|------+------+------+------+------+------|
  430. * | | F9 | F10 | F11 | F12 | | | | Home | End | | |
  431. * |------+------+------+------+------+------+------+------+------+------+------+------|
  432. * | | | | | | | | | | | |
  433. * `-----------------------------------------------------------------------------------'
  434. */
  435. [_FUNC] = KEYMAP(
  436. XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
  437. XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_INS,
  438. _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
  439. _______, _______, _______, _______, PUNC, _______, _______, _______, _______, _______, _______, _______
  440. ),
  441. /* Uppercase Greek
  442. * ,-----------------------------------------------------------------------------------.
  443. * | | | | | | | | | | | | |
  444. * |------+------+------+------+------+-------------+------+------+------+------+------|
  445. * | | | | | | | | | | | | |
  446. * |------+------+------+------+------+------+------+------+------+------+------+------|
  447. * | | | | | | | | | | | | |
  448. * |------+------+------+------+------+------+------+------+------+------+------+------|
  449. * | | | | | | | | | | | | |
  450. * `-----------------------------------------------------------------------------------'
  451. */
  452. [_GREEKU] = KEYMAP(
  453. _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
  454. _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
  455. _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  456. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  457. ),
  458. /* Lowercase Greek
  459. * ,-----------------------------------------------------------------------------------.
  460. * | | | | | | | | | | | | |
  461. * |------+------+------+------+------+-------------+------+------+------+------+------|
  462. * | | | | | | | | | | | | |
  463. * |------+------+------+------+------+------+------+------+------+------+------+------|
  464. * | | | | | | | | | | | | |
  465. * |------+------+------+------+------+------+------+------+------+------+------+------|
  466. * | | | | | | | | | | | | |
  467. * `-----------------------------------------------------------------------------------'
  468. */
  469. [_GREEKL] = KEYMAP(
  470. _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
  471. _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
  472. _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  473. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  474. ),
  475. /* Emoji
  476. * ,-----------------------------------------------------------------------------------.
  477. * | | | | | | | | | | | | |
  478. * |------+------+------+------+------+-------------+------+------+------+------+------|
  479. * | | | | | | | | | | | | |
  480. * |------+------+------+------+------+------+------+------+------+------+------+------|
  481. * | | | | | | | | | | | | |
  482. * |------+------+------+------+------+------+------+------+------+------+------+------|
  483. * | | | | | | | | | | | | |
  484. * `-----------------------------------------------------------------------------------'
  485. */
  486. [_EMOJI] = KEYMAP(
  487. X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
  488. X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
  489. X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
  490. X(POO), X(EYES), _______,X(HUNRD), X(SKULL),X(HORNS), X(HALO), X(FEAR),X(YUMMY),_______,X(DISAP),X(NOEVK)
  491. ),
  492. /* GUI
  493. * ,-----------------------------------------------------------------------------------.
  494. * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
  495. * |------+------+------+------+------+-------------+------+------+------+------+------|
  496. * | | | Vol- | Mute | Vol+ | | | Prev | | Next | | |
  497. * |------+------+------+------+------+------+------+------+------+------+------+------|
  498. * | | | Prev | Play | Next | BTab | Tab | | | | | |
  499. * |------+------+------+------+------+------+------+------+------+------+------+------|
  500. * | | | | | | | | | | | | |
  501. * `-----------------------------------------------------------------------------------'
  502. */
  503. [_GUI] = KEYMAP(
  504. XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
  505. XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, S(KC_TAB),KC_TAB, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
  506. XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, KC_SPC, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  507. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  508. ),
  509. /* Sys
  510. * ,-----------------------------------------------------------------------------------.
  511. * | |Qwerty| Win | |Reset | | | USB | | | | |
  512. * |------+------+------+------+------+-------------+------+------+------+------+------|
  513. * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
  514. * |------+------+------+------+------+------+------+------+------+------+------+------|
  515. * | | | |Colmak| | BLE |Norman|MacOS | | | | |
  516. * |------+------+------+------+------+------+------+------+------+------+------+------|
  517. * | | | | | | | | | | | | |
  518. * `-----------------------------------------------------------------------------------'
  519. */
  520. [_SYS] = KEYMAP(
  521. XXXXXXX, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  522. XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
  523. XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  524. _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
  525. ),
  526. };
  527. #ifdef AUDIO_ENABLE
  528. float tone_startup[][2] = SONG(STARTUP_SOUND);
  529. float tone_qwerty[][2] = SONG(QWERTY_SOUND);
  530. float tone_colemak[][2] = SONG(COLEMAK_SOUND);
  531. float tone_workman[][2] = SONG(DVORAK_SOUND);
  532. float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
  533. float tone_linux[][2] = SONG(CAPS_LOCK_ON_SOUND);
  534. float tone_windows[][2] = SONG(SCROLL_LOCK_ON_SOUND);
  535. float tone_osx[][2] = SONG(NUM_LOCK_ON_SOUND);
  536. float tone_click[][2] = SONG(MUSICAL_NOTE(_F3, 2));
  537. float tone_release[][2] = SONG(MUSICAL_NOTE(_A3, 2));
  538. float tone_tolelot[][2] = SONG(Q__NOTE(_E5), Q__NOTE(_C5), Q__NOTE(_D5));
  539. #endif
  540. void persistant_default_layer_set(uint16_t default_layer) {
  541. eeconfig_update_default_layer(default_layer);
  542. default_layer_set(default_layer);
  543. }
  544. #ifdef DOUBLESPACE_LAYER_ENABLE
  545. void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
  546. if (pressed) {
  547. *isactive = true;
  548. if (*otheractive) {
  549. layer_on(_SPACE);
  550. register_code(KC_LALT); // sends alt and enter layer
  551. space_layer_entered = true;
  552. }
  553. } else {
  554. *isactive = false;
  555. if (space_layer_entered) {
  556. unregister_code(KC_LALT); // release alt and exit layer
  557. layer_off(_SPACE);
  558. if (!*otheractive) {
  559. space_layer_entered = false;
  560. }
  561. } else {
  562. if (!*isemitted) {
  563. register_code(KC_SPC);
  564. unregister_code(KC_SPC);
  565. }
  566. *isemitted = false;
  567. }
  568. }
  569. }
  570. #endif
  571. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  572. // faux clicky
  573. // if (record->event.pressed) PLAY_NOTE_ARRAY(tone_click, false, 0);
  574. #ifdef AUDIO_ENABLE
  575. #ifdef TOLELOT_ENABLE
  576. if (record->event.pressed) {
  577. PLAY_NOTE_ARRAY(tone_tolelot, false, 0);
  578. }
  579. #else
  580. if (record->event.pressed) {
  581. PLAY_NOTE_ARRAY(tone_click, false, 0);
  582. } else {
  583. PLAY_NOTE_ARRAY(tone_release, false, 0);
  584. }
  585. #endif
  586. #endif
  587. bool lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
  588. bool rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
  589. #ifdef DOUBLESPACE_LAYER_ENABLE
  590. // double-space: send space immediately if any other key depressed before space is released
  591. if ((lspace_active ^ rspace_active)
  592. && keycode != LSPACE
  593. && keycode != RSPACE
  594. && record->event.pressed)
  595. {
  596. if (lspace_active) {
  597. if (!lspace_emitted) {
  598. register_code(KC_SPC);
  599. unregister_code(KC_SPC);
  600. }
  601. lspace_emitted = true;
  602. }
  603. if (rspace_active) {
  604. if (!rspace_emitted) {
  605. register_code(KC_SPC);
  606. unregister_code(KC_SPC);
  607. }
  608. rspace_emitted = true;
  609. }
  610. }
  611. if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
  612. if (record->event.pressed) {
  613. unregister_code(KC_LALT);
  614. } else {
  615. register_code(KC_LALT);
  616. }
  617. }
  618. #endif
  619. switch (keycode) {
  620. #ifdef DOUBLESPACE_LAYER_ENABLE
  621. // double-space enter space layer
  622. case LSPACE:
  623. process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
  624. return false;
  625. break;
  626. case RSPACE:
  627. process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
  628. return false;
  629. break;
  630. #endif
  631. // handle greek layer shift
  632. // handle both shift = capslock
  633. case KC_LSFT:
  634. case KC_RSFT:
  635. ;
  636. uint8_t layer = biton32(layer_state);
  637. if (layer == _GREEKU || layer == _GREEKL) {
  638. if (record->event.pressed) {
  639. layer_on(_GREEKU);
  640. layer_off(_GREEKL);
  641. } else {
  642. if (lshift ^ rshift) { // if only one shift was pressed
  643. layer_on(_GREEKL);
  644. layer_off(_GREEKU);
  645. }
  646. }
  647. } else {
  648. if (record->event.pressed) {
  649. if (lshift ^ rshift) { // if only one shift was pressed
  650. register_code(KC_CAPS);
  651. unregister_code(KC_CAPS);
  652. }
  653. }
  654. }
  655. return true;
  656. break;
  657. // press both ctrls to activate SYS layer
  658. case KC_LCTL:
  659. case KC_RCTL:
  660. ;
  661. bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
  662. bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
  663. if (record->event.pressed) {
  664. if (lctrl ^ rctrl) { // if only one ctrl was pressed
  665. layer_on(_SYS);
  666. }
  667. } else {
  668. layer_off(_SYS);
  669. }
  670. return true;
  671. break;
  672. // QWERTZ style comma and dot: semicolon and colon when shifted
  673. case KC_COMM:
  674. if (record->event.pressed) {
  675. if (lshift || rshift) {
  676. if (lshift) unregister_code(KC_LSFT);
  677. if (rshift) unregister_code(KC_RSFT);
  678. register_code(KC_SCLN);
  679. unregister_code(KC_SCLN);
  680. if (lshift) register_code(KC_LSFT);
  681. if (rshift) register_code(KC_RSFT);
  682. } else {
  683. register_code(KC_COMM);
  684. unregister_code(KC_COMM);
  685. }
  686. }
  687. return false;
  688. break;
  689. case KC_DOT:
  690. if (record->event.pressed) {
  691. if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
  692. register_code(KC_SCLN);
  693. unregister_code(KC_SCLN);
  694. } else {
  695. register_code(KC_DOT);
  696. unregister_code(KC_DOT);
  697. }
  698. }
  699. return false;
  700. break;
  701. // layout switcher
  702. case QWERTY:
  703. if (record->event.pressed) {
  704. persistant_default_layer_set(1UL<<_QWERTY);
  705. }
  706. return false;
  707. break;
  708. #ifdef LAYOUT_DVORAK
  709. case DVORAK:
  710. if (record->event.pressed) {
  711. persistant_default_layer_set(1UL<<_DVORAK);
  712. }
  713. return false;
  714. break;
  715. #endif
  716. #ifdef LAYOUT_COLEMAK
  717. case COLEMAK:
  718. if (record->event.pressed) {
  719. persistant_default_layer_set(1UL<<_COLEMAK);
  720. }
  721. return false;
  722. break;
  723. #endif
  724. #ifdef LAYOUT_WORKMAN
  725. case WORKMAN:
  726. if (record->event.pressed) {
  727. persistant_default_layer_set(1UL<<_WORKMAN);
  728. }
  729. return false;
  730. break;
  731. #endif
  732. #ifdef LAYOUT_NORMAN
  733. case NORMAN:
  734. if (record->event.pressed) {
  735. persistant_default_layer_set(1UL<<_NORMAN);
  736. }
  737. return false;
  738. break;
  739. #endif
  740. // layer switchers
  741. case PUNC:
  742. if (record->event.pressed) {
  743. layer_on(_PUNC);
  744. update_tri_layer(_PUNC, _GREEKL, _EMOJI);
  745. } else {
  746. layer_off(_PUNC);
  747. update_tri_layer(_PUNC, _GREEKL, _EMOJI);
  748. }
  749. return false;
  750. break;
  751. case GREEK:
  752. if (record->event.pressed) {
  753. if (lshift || rshift) {
  754. layer_on(_GREEKU);
  755. layer_off(_GREEKL);
  756. } else {
  757. layer_on(_GREEKL);
  758. layer_off(_GREEKU);
  759. update_tri_layer(_PUNC, _GREEKL, _EMOJI);
  760. }
  761. } else {
  762. layer_off(_GREEKU);
  763. layer_off(_GREEKL);
  764. update_tri_layer(_PUNC, _GREEKL, _EMOJI);
  765. }
  766. return false;
  767. break;
  768. case NUM:
  769. if (record->event.pressed) {
  770. layer_on(_NUM);
  771. } else {
  772. layer_off(_NUM);
  773. }
  774. return false;
  775. break;
  776. case FUNC:
  777. if (record->event.pressed) {
  778. layer_on(_FUNC);
  779. } else {
  780. layer_off(_FUNC);
  781. }
  782. return false;
  783. break;
  784. // OS switchers
  785. case LINUX:
  786. set_unicode_input_mode(UC_LNX);
  787. #ifdef AUDIO_ENABLE
  788. PLAY_NOTE_ARRAY(tone_linux, false, 0);
  789. #endif
  790. return false;
  791. break;
  792. case WIN:
  793. set_unicode_input_mode(UC_WINC);
  794. #ifdef AUDIO_ENABLE
  795. PLAY_NOTE_ARRAY(tone_windows, false, 0);
  796. #endif
  797. return false;
  798. break;
  799. case OSX:
  800. set_unicode_input_mode(UC_OSX);
  801. #ifdef AUDIO_ENABLE
  802. PLAY_NOTE_ARRAY(tone_osx, false, 0);
  803. #endif
  804. return false;
  805. break;
  806. // faux clicky toggle, TBD
  807. case FC_TOG:
  808. return true;
  809. break;
  810. }
  811. return true;
  812. }
  813. void matrix_init_user(void) {
  814. #ifdef AUDIO_ENABLE
  815. startup_user();
  816. #endif
  817. set_unicode_input_mode(UC_LNX);
  818. }
  819. #ifdef AUDIO_ENABLE
  820. void startup_user()
  821. {
  822. _delay_ms(20); // gets rid of tick
  823. PLAY_NOTE_ARRAY(tone_startup, false, 0);
  824. }
  825. void shutdown_user()
  826. {
  827. PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
  828. _delay_ms(150);
  829. stop_all_notes();
  830. }
  831. #endif
  832. void matrix_scan_user(void) {
  833. }
  834. void led_set_user(uint8_t usb_led) {
  835. }
  836. void turn_off_capslock() {
  837. if (capslock) {
  838. register_code(KC_CAPS);
  839. unregister_code(KC_CAPS);
  840. }
  841. }