keymap.c 30 KB

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