keymap.c 30 KB

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