keymap.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  1. /*
  2. Copyright 2017 Priyadi Iman Nurcahyo
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #if defined(PRIYADI_PROMETHIUM)
  15. #include "promethium.h"
  16. #elif defined(PRIYADI_PLANCK)
  17. #include "planck.h"
  18. #else
  19. #error "no keyboard defined"
  20. #endif
  21. #include "action_layer.h"
  22. #ifdef AUDIO_ENABLE
  23. #include "audio.h"
  24. #include "musical_notes.h"
  25. #endif
  26. #include "eeconfig.h"
  27. #include "process_unicode.h"
  28. #include "quantum.h"
  29. #ifdef RGBSPS_ENABLE
  30. #include "rgbsps.h"
  31. #endif
  32. #ifdef PS2_MOUSE_ENABLE
  33. #include "ps2_mouse.h"
  34. #include "ps2.h"
  35. #endif
  36. #ifdef FAUXCLICKY_ENABLE
  37. #include "fauxclicky.h"
  38. #endif
  39. #include "outputselect.h"
  40. #include "led.h"
  41. #define COUNT(x) (sizeof (x) / sizeof (*(x)))
  42. // Fillers to make layering clearer
  43. #define _______ KC_TRNS
  44. #define XXXXXXX KC_NO
  45. #define G(x) LGUI(x)
  46. #define KC_WWWB KC_WWW_BACK
  47. #define KC_WWWF KC_WWW_FORWARD
  48. // hybrid right-alt & scroll lock (mapped to Compose in OS)
  49. #undef KC_RALT
  50. #define KC_RALT MT(MOD_RALT, KC_SLCK)
  51. bool capslock = false;
  52. #ifdef DOUBLESPACE_LAYER_ENABLE
  53. bool lspace_active = false;
  54. bool rspace_active = false;
  55. bool lspace_emitted = false;
  56. bool rspace_emitted = false;
  57. bool space_layer_entered = false;
  58. #endif
  59. // glow
  60. enum glow_modes {
  61. GLOW_NONE,
  62. GLOW_MIN,
  63. GLOW_FULL
  64. };
  65. uint8_t glow_mode = GLOW_MIN;
  66. void turn_off_capslock(void);
  67. extern keymap_config_t keymap_config;
  68. // layers, ordering is important!
  69. enum layers {
  70. _QWERTY,
  71. _DVORAK,
  72. _COLEMAK,
  73. _WORKMAN,
  74. _NORMAN,
  75. _DEFAULT_LAYER_MAX = _NORMAN,
  76. _GREEKU,
  77. _GREEKL,
  78. _NUM,
  79. _FUN,
  80. _PUNC,
  81. _EMPTY,
  82. _EMOJI,
  83. _GUI,
  84. _SYS
  85. };
  86. // double-space layer
  87. #define _SPACE _GUI
  88. enum planck_keycodes {
  89. // layouts
  90. QWERTY = SAFE_RANGE,
  91. DVORAK,
  92. COLEMAK,
  93. WORKMAN,
  94. NORMAN,
  95. // layer switchers
  96. EMOJI,
  97. GUI,
  98. GREEK,
  99. // os switchers
  100. LINUX,
  101. WIN,
  102. OSX,
  103. // others
  104. LSPACE,
  105. RSPACE,
  106. GLOW,
  107. // stub
  108. #ifndef FAUXCLICKY_ENABLE
  109. FC_TOG,
  110. #endif
  111. #ifndef ADAFRUIT_BLE_ENABLE
  112. OUT_BLE,
  113. #endif
  114. KEYCODE_END
  115. };
  116. #define EMPTY MO(_EMPTY)
  117. #define NUM MO(_NUM)
  118. #define FUN MO(_FUN)
  119. #define FUN0 LT(_FUN, KC_0)
  120. // unicode map
  121. enum unicode_name {
  122. GRIN, // grinning face 😊
  123. TJOY, // tears of joy 😂
  124. SMILE, // grining face with smiling eyes 😁
  125. HEART, // heart ❤
  126. EYERT, // smiling face with heart shaped eyes 😍
  127. CRY, // crying face 😭
  128. SMEYE, // smiling face with smiling eyes 😊
  129. UNAMU, // unamused 😒
  130. KISS, // kiss 😘
  131. HART2, // two hearts 💕
  132. WEARY, // weary 😩
  133. OKHND, // ok hand sign 👌
  134. PENSV, // pensive 😔
  135. SMIRK, // smirk 😏
  136. RECYC, // recycle ♻
  137. WINK, // wink 😉
  138. THMUP, // thumb up 👍
  139. THMDN, // thumb down 👎
  140. PRAY, // pray 🙏
  141. PHEW, // relieved 😌
  142. MUSIC, // musical notes
  143. FLUSH, // flushed 😳
  144. CELEB, // celebration 🙌
  145. CRY2, // crying face 😢
  146. COOL, // smile with sunglasses 😎
  147. NOEVS, // see no evil
  148. NOEVH, // hear no evil
  149. NOEVK, // speak no evil
  150. POO, // pile of poo
  151. EYES, // eyes
  152. VIC, // victory hand
  153. BHART, // broken heart
  154. SLEEP, // sleeping face
  155. SMIL2, // smiling face with open mouth & sweat
  156. HUNRD, // 100
  157. CONFU, // confused
  158. TONGU, // face with tongue & winking eye
  159. DISAP, // disappointed
  160. YUMMY, // face savoring delicious food
  161. CLAP, // hand clapping
  162. FEAR, // face screaming in fear
  163. HORNS, // smiling face with horns
  164. HALO, // smiling face with halo
  165. BYE, // waving hand
  166. SUN, // sun
  167. MOON, // moon
  168. SKULL, // skull
  169. // greek letters
  170. UALPH,
  171. UBETA,
  172. UGAMM,
  173. UDELT,
  174. UEPSI,
  175. UZETA,
  176. UETA,
  177. UTHET,
  178. UIOTA,
  179. UKAPP,
  180. ULAMB,
  181. UMU,
  182. UNU,
  183. UXI,
  184. UOMIC,
  185. UPI,
  186. URHO,
  187. USIGM,
  188. UTAU,
  189. UUPSI,
  190. UPHI,
  191. UCHI,
  192. UPSI,
  193. UOMEG,
  194. LALPH,
  195. LBETA,
  196. LGAMM,
  197. LDELT,
  198. LEPSI,
  199. LZETA,
  200. LETA,
  201. LTHET,
  202. LIOTA,
  203. LKAPP,
  204. LLAMB,
  205. LMU,
  206. LNU,
  207. LXI,
  208. LOMIC,
  209. LPI,
  210. LRHO,
  211. LSIGM,
  212. LTAU,
  213. LUPSI,
  214. LPHI,
  215. LCHI,
  216. LPSI,
  217. LOMEG,
  218. FSIGM,
  219. LTEQ,
  220. GTEQ,
  221. NOTEQ,
  222. PLMIN,
  223. };
  224. const uint32_t PROGMEM unicode_map[] = {
  225. [GRIN] = 0x1F600,
  226. [TJOY] = 0x1F602,
  227. [SMILE] = 0x1F601,
  228. [HEART] = 0x2764,
  229. [EYERT] = 0x1f60d,
  230. [CRY] = 0x1f62d,
  231. [SMEYE] = 0x1F60A,
  232. [UNAMU] = 0x1F612,
  233. [KISS] = 0x1F618,
  234. [HART2] = 0x1F495,
  235. [WEARY] = 0x1F629,
  236. [OKHND] = 0x1F44C,
  237. [PENSV] = 0x1F614,
  238. [SMIRK] = 0x1F60F,
  239. [RECYC] = 0x267B,
  240. [WINK] = 0x1F609,
  241. [THMUP] = 0x1F44D,
  242. [THMDN] = 0x1F44E,
  243. [PRAY] = 0x1F64F,
  244. [PHEW] = 0x1F60C,
  245. [MUSIC] = 0x1F3B6,
  246. [FLUSH] = 0x1F633,
  247. [CELEB] = 0x1F64C,
  248. [CRY2] = 0x1F622,
  249. [COOL] = 0x1F60E,
  250. [NOEVS] = 0x1F648,
  251. [NOEVH] = 0x1F649,
  252. [NOEVK] = 0x1F64A,
  253. [POO] = 0x1F4A9,
  254. [EYES] = 0x1F440,
  255. [VIC] = 0x270C,
  256. [BHART] = 0x1F494,
  257. [SLEEP] = 0x1F634,
  258. [SMIL2] = 0x1F605,
  259. [HUNRD] = 0x1F4AF,
  260. [CONFU] = 0x1F615,
  261. [TONGU] = 0x1F61C,
  262. [DISAP] = 0x1F61E,
  263. [YUMMY] = 0x1F60B,
  264. [CLAP] = 0x1F44F,
  265. [FEAR] = 0x1F631,
  266. [HORNS] = 0x1F608,
  267. [HALO] = 0x1F607,
  268. [BYE] = 0x1F44B,
  269. [SUN] = 0x2600,
  270. [MOON] = 0x1F314,
  271. [SKULL] = 0x1F480,
  272. // greek letters
  273. [UALPH] = 0x0391,
  274. [UBETA] = 0x0392,
  275. [UGAMM] = 0x0393,
  276. [UDELT] = 0x0394,
  277. [UEPSI] = 0x0395,
  278. [UZETA] = 0x0396,
  279. [UETA] = 0x0397,
  280. [UTHET] = 0x0398,
  281. [UIOTA] = 0x0399,
  282. [UKAPP] = 0x039A,
  283. [ULAMB] = 0x039B,
  284. [UMU] = 0x039C,
  285. [UNU] = 0x039D,
  286. [UXI] = 0x039E,
  287. [UOMIC] = 0x039F,
  288. [UPI] = 0x03A0,
  289. [URHO] = 0x03A1,
  290. [USIGM] = 0x03A3,
  291. [UTAU] = 0x03A4,
  292. [UUPSI] = 0x03A5,
  293. [UPHI] = 0x03A6,
  294. [UCHI] = 0x03A7,
  295. [UPSI] = 0x03A8,
  296. [UOMEG] = 0x03A9,
  297. [LALPH] = 0x03B1,
  298. [LBETA] = 0x03B2,
  299. [LGAMM] = 0x03B3,
  300. [LDELT] = 0x03B4,
  301. [LEPSI] = 0x03B5,
  302. [LZETA] = 0x03B6,
  303. [LETA] = 0x03B7,
  304. [LTHET] = 0x03B8,
  305. [LIOTA] = 0x03B9,
  306. [LKAPP] = 0x03BA,
  307. [LLAMB] = 0x03BB,
  308. [LMU] = 0x03BC,
  309. [LNU] = 0x03BD,
  310. [LXI] = 0x03BE,
  311. [LOMIC] = 0x03BF,
  312. [LPI] = 0x03C0,
  313. [LRHO] = 0x03C1,
  314. [LSIGM] = 0x03C3,
  315. [LTAU] = 0x03C4,
  316. [LUPSI] = 0x03C5,
  317. [LPHI] = 0x03C6,
  318. [LCHI] = 0x03C7,
  319. [LPSI] = 0x03C8,
  320. [LOMEG] = 0x03C9,
  321. [FSIGM] = 0x03C2,
  322. // other
  323. [LTEQ] = 0x2264, // less than or equal
  324. [GTEQ] = 0x2265, // greater than or equal
  325. [NOTEQ] = 0x2260, // not equal
  326. [PLMIN] = 0xB1, // plus minus
  327. };
  328. // RGBSPS
  329. #ifdef RGBSPS_ENABLE
  330. const uint8_t PROGMEM LED_ALNUM[] = {
  331. LED_Z,
  332. LED_A,
  333. LED_Q,
  334. LED_W,
  335. LED_S,
  336. LED_X,
  337. LED_C,
  338. LED_D,
  339. LED_E,
  340. LED_R,
  341. LED_F,
  342. LED_V,
  343. LED_B,
  344. LED_G,
  345. LED_T,
  346. LED_N,
  347. LED_HH,
  348. LED_Y,
  349. LED_U,
  350. LED_J,
  351. LED_M,
  352. LED_COMM,
  353. LED_K,
  354. LED_I,
  355. LED_O,
  356. LED_L,
  357. LED_DOT,
  358. LED_SLSH,
  359. LED_SCLN,
  360. LED_P,
  361. LED_LSPC,
  362. LED_RSPC
  363. };
  364. const uint8_t PROGMEM LED_HOMING[] = {
  365. LED_A,
  366. LED_S,
  367. LED_D,
  368. LED_F,
  369. LED_J,
  370. LED_K,
  371. LED_L,
  372. LED_SCLN
  373. };
  374. const uint8_t PROGMEM LED_MODS[] = {
  375. LED_TAB,
  376. LED_ESC,
  377. LED_LSFT,
  378. LED_LCTL,
  379. LED_LGUI,
  380. LED_LALT,
  381. LED_RALT,
  382. LED_RGUI,
  383. LED_BKSP,
  384. LED_ENT,
  385. LED_RSFT,
  386. LED_RCTL
  387. };
  388. const uint8_t PROGMEM LED_FN[] = {
  389. LED_PUNC,
  390. LED_NUM,
  391. LED_FUN,
  392. LED_EMOJI
  393. };
  394. const uint8_t PROGMEM LED_INDICATORS[] = {
  395. LED_IND_EMOJI,
  396. LED_IND_NUM,
  397. LED_IND_FUN,
  398. LED_IND_BATTERY,
  399. LED_IND_USB,
  400. LED_IND_BLUETOOTH,
  401. };
  402. const uint8_t PROGMEM LED_TRACKPOINT[] = {
  403. LED_TRACKPOINT1,
  404. LED_TRACKPOINT2,
  405. LED_TRACKPOINT3,
  406. };
  407. void led_turnoff_keys(void) {
  408. for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
  409. rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 0, 0, 0);
  410. }
  411. for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
  412. rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 0, 0);
  413. }
  414. for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
  415. rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 0);
  416. }
  417. }
  418. void led_reset(void) {
  419. switch (glow_mode) {
  420. case GLOW_NONE:
  421. led_turnoff_keys();
  422. break;
  423. case GLOW_MIN:
  424. led_turnoff_keys();
  425. for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
  426. rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 8, 8, 8);
  427. }
  428. rgbsps_set(LED_F, 15, 0, 0);
  429. rgbsps_set(LED_J, 15, 0, 0);
  430. break;
  431. case GLOW_FULL:
  432. for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
  433. rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), 8, 8, 8);
  434. }
  435. for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
  436. rgbsps_set(pgm_read_byte(&LED_MODS[i]), 0, 15, 0);
  437. }
  438. for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
  439. rgbsps_set(pgm_read_byte(&LED_FN[i]), 0, 0, 15);
  440. }
  441. for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
  442. rgbsps_set(pgm_read_byte(&LED_HOMING[i]), 15, 0, 0);
  443. }
  444. rgbsps_set(LED_F, 15, 15, 0);
  445. rgbsps_set(LED_J, 15, 15, 0);
  446. break;
  447. }
  448. }
  449. void led_set_layer_indicator(void) {
  450. static uint8_t oldlayer = 255;
  451. rgbsps_set(LED_IND_FUN, 0, 0, 0);
  452. // rgbsps_set(LED_IND_NUM, 0, 0, 0);
  453. rgbsps_set(LED_IND_EMOJI, 0, 0, 0);
  454. led_reset();
  455. uint8_t layer = biton32(layer_state);
  456. if (oldlayer == layer) {
  457. return;
  458. }
  459. oldlayer = layer;
  460. if (layer <= _DEFAULT_LAYER_MAX) {
  461. rgbsps_send();
  462. return;
  463. }
  464. switch(layer) {
  465. case _FUN:
  466. rgbsps_set(LED_IND_FUN, 15, 0, 0);
  467. break;
  468. // case _NUM:
  469. // rgbsps_set(LED_IND_NUM, 0, 0, 15);
  470. // break;
  471. case _EMOJI:
  472. rgbsps_set(LED_IND_EMOJI, 15, 15, 0);
  473. break;
  474. default:
  475. rgbsps_set(LED_IND_FUN, 3, 3, 3);
  476. // rgbsps_set(LED_IND_NUM, 3, 3, 3);
  477. rgbsps_set(LED_IND_EMOJI, 3, 3, 3);
  478. }
  479. rgbsps_send();
  480. }
  481. void led_set_output_ble(void) {
  482. rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 15);
  483. rgbsps_set(LED_IND_USB, 0, 0, 0);
  484. rgbsps_send();
  485. }
  486. void led_set_output_usb(void) {
  487. rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
  488. rgbsps_set(LED_IND_USB, 15, 15, 15);
  489. rgbsps_send();
  490. }
  491. void led_set_output_none(void) {
  492. rgbsps_set(LED_IND_BLUETOOTH, 0, 0, 0);
  493. rgbsps_set(LED_IND_USB, 0, 0, 0);
  494. rgbsps_send();
  495. }
  496. void led_init(void) {
  497. // turn off all
  498. rgbsps_turnoff();
  499. // set trackpoint color
  500. rgbsps_set(LED_TRACKPOINT1, 15, 0, 0);
  501. rgbsps_set(LED_TRACKPOINT2, 0, 0, 15);
  502. rgbsps_set(LED_TRACKPOINT3, 15, 0, 0);
  503. }
  504. #endif // RGBSPS_ENABLE
  505. // keymaps
  506. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  507. /* Qwerty
  508. * ,-----------------------------------------------------------------------------------.
  509. * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
  510. * |------+------+------+------+------+-------------+------+------+------+------+------|
  511. * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
  512. * |------+------+------+------+------+------|------+------+------+------+------+------|
  513. * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
  514. * |------+------+------+------+------+------+------+------+------+------+------+------|
  515. * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
  516. * `-----------------------------------------------------------------------------------'
  517. */
  518. [_QWERTY] = KEYMAP(
  519. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  520. KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
  521. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  522. KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, KC_RALT, KC_RCTL
  523. ),
  524. /* Dvorak
  525. * ,-----------------------------------------------------------------------------------.
  526. * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
  527. * |------+------+------+------+------+-------------+------+------+------+------+------|
  528. * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
  529. * |------+------+------+------+------+------|------+------+------+------+------+------|
  530. * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
  531. * |------+------+------+------+------+------+------+------+------+------+------+------|
  532. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  533. * `-----------------------------------------------------------------------------------'
  534. */
  535. #ifdef LAYOUT_DVORAK
  536. [_DVORAK] = KEYMAP(
  537. _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
  538. _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
  539. _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
  540. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  541. ),
  542. #endif
  543. /* Colemak
  544. * ,-----------------------------------------------------------------------------------.
  545. * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
  546. * |------+------+------+------+------+-------------+------+------+------+------+------|
  547. * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
  548. * |------+------+------+------+------+------|------+------+------+------+------+------|
  549. * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
  550. * |------+------+------+------+------+------+------+------+------+------+------+------|
  551. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  552. * `-----------------------------------------------------------------------------------'
  553. */
  554. #ifdef LAYOUT_COLEMAK
  555. [_COLEMAK] = KEYMAP(
  556. _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
  557. _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
  558. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  559. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  560. ),
  561. #endif
  562. /* Norman
  563. * ,-----------------------------------------------------------------------------------.
  564. * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
  565. * |------+------+------+------+------+-------------+------+------+------+------+------|
  566. * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
  567. * |------+------+------+------+------+------|------+------+------+------+------+------|
  568. * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
  569. * |------+------+------+------+------+------+------+------+------+------+------+------|
  570. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  571. * `-----------------------------------------------------------------------------------'
  572. */
  573. #ifdef LAYOUT_NORMAN
  574. [_NORMAN] = KEYMAP(
  575. _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
  576. _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
  577. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  578. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  579. ),
  580. #endif
  581. /* Workman
  582. * ,-----------------------------------------------------------------------------------.
  583. * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
  584. * |------+------+------+------+------+-------------+------+------+------+------+------|
  585. * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
  586. * |------+------+------+------+------+------|------+------+------+------+------+------|
  587. * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
  588. * |------+------+------+------+------+------+------+------+------+------+------+------|
  589. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  590. * `-----------------------------------------------------------------------------------'
  591. */
  592. #ifdef LAYOUT_WORKMAN
  593. [_WORKMAN] = KEYMAP(
  594. _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
  595. _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
  596. _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
  597. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  598. ),
  599. #endif
  600. /* Punc
  601. * ,-----------------------------------------------------------------------------------.
  602. * | ~ | ! | @ | # | $ | % | ^ | & | * | ≤ | ≥ | ` |
  603. * |------+------+------+------+------+-------------+------+------+------+------+------|
  604. * | | * | \ | - | = | / | ≠ | ( | ) | < | > | |
  605. * |------+------+------+------+------+------|------+------+------+------+------+------|
  606. * | & | ^ | | | _ | + | ? | ± | [ | ] | { | } | : |
  607. * |------+------+------+------+------+------+------+------+------+------+------+------|
  608. * | | | | | | | | | | | |
  609. * `-----------------------------------------------------------------------------------'
  610. */
  611. [_PUNC] = KEYMAP(
  612. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
  613. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
  614. KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, KC_COLN,
  615. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  616. ),
  617. /* Num
  618. * ,-----------------------------------------------------------------------------------.
  619. * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
  620. * |------+------+------+------+------+-------------+------+------+------+------+------|
  621. * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
  622. * |------+------+------+------+------+------|------+------+------+------+------+------|
  623. * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | : |
  624. * |------+------+------+------+------+------+------+------+------+------+------+------|
  625. * | | | | | | | | 0 | , | . | x | |
  626. * `-----------------------------------------------------------------------------------'
  627. */
  628. [_NUM] = KEYMAP(
  629. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_7, KC_8, KC_9, S(KC_D), _______,
  630. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
  631. 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,
  632. _______, _______, _______, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_X, _______
  633. ),
  634. /* Func
  635. * ,-----------------------------------------------------------------------------------.
  636. * | | F1 | F2 | F3 | F4 | | | PgUp | Up | PgDn | PgUp | Del |
  637. * |------+------+------+------+------+-------------+------+------+------+------+------|
  638. * | | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | Ins |
  639. * |------+------+------+------+------+------|------+------+------+------+------+------|
  640. * | | F9 | F10 | F11 | F12 | | | | Home | End | | |
  641. * |------+------+------+------+------+------+------+------+------+------+------+------|
  642. * | | | | | | | | | | | |
  643. * `-----------------------------------------------------------------------------------'
  644. */
  645. [_FUN] = KEYMAP(
  646. XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, XXXXXXX, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
  647. XXXXXXX, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_INS,
  648. _______, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
  649. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  650. ),
  651. /* Uppercase Greek
  652. * ,-----------------------------------------------------------------------------------.
  653. * | | | | | | | | | | | | |
  654. * |------+------+------+------+------+-------------+------+------+------+------+------|
  655. * | | | | | | | | | | | | |
  656. * |------+------+------+------+------+------+------+------+------+------+------+------|
  657. * | | | | | | | | | | | | |
  658. * |------+------+------+------+------+------+------+------+------+------+------+------|
  659. * | | | | | | | | | | | | |
  660. * `-----------------------------------------------------------------------------------'
  661. */
  662. [_GREEKU] = KEYMAP(
  663. _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
  664. _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
  665. _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  666. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  667. ),
  668. /* Lowercase Greek
  669. * ,-----------------------------------------------------------------------------------.
  670. * | | | | | | | | | | | | |
  671. * |------+------+------+------+------+-------------+------+------+------+------+------|
  672. * | | | | | | | | | | | | |
  673. * |------+------+------+------+------+------+------+------+------+------+------+------|
  674. * | | | | | | | | | | | | |
  675. * |------+------+------+------+------+------+------+------+------+------+------+------|
  676. * | | | | | | | | | | | | |
  677. * `-----------------------------------------------------------------------------------'
  678. */
  679. [_GREEKL] = KEYMAP(
  680. _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
  681. _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
  682. _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  683. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  684. ),
  685. /* Empty
  686. * ,-----------------------------------------------------------------------------------.
  687. * | | | | | | | | | | | | |
  688. * |------+------+------+------+------+-------------+------+------+------+------+------|
  689. * | | | | | | | | | | | | |
  690. * |------+------+------+------+------+------+------+------+------+------+------+------|
  691. * | | | | | | | | | | | | |
  692. * |------+------+------+------+------+------+------+------+------+------+------+------|
  693. * | | | | | | | | | | | | |
  694. * `-----------------------------------------------------------------------------------'
  695. */
  696. [_EMPTY] = KEYMAP(
  697. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  698. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  699. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  700. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  701. ),
  702. /* Emoji
  703. * ,-----------------------------------------------------------------------------------.
  704. * | | | | | | | | | | | | |
  705. * |------+------+------+------+------+-------------+------+------+------+------+------|
  706. * | | | | | | | | | | | | |
  707. * |------+------+------+------+------+------+------+------+------+------+------+------|
  708. * | | | | | | | | | | | | |
  709. * |------+------+------+------+------+------+------+------+------+------+------+------|
  710. * | | | | | | | | | | | | |
  711. * `-----------------------------------------------------------------------------------'
  712. */
  713. [_EMOJI] = KEYMAP(
  714. X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
  715. X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
  716. X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
  717. X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK)
  718. ),
  719. /* GUI
  720. * ,-----------------------------------------------------------------------------------.
  721. * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
  722. * |------+------+------+------+------+-------------+------+------+------+------+------|
  723. * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
  724. * |------+------+------+------+------+------+------+------+------+------+------+------|
  725. * | | | Prev | Play | Next | | | | | | | |
  726. * |------+------+------+------+------+------+------+------+------+------+------+------|
  727. * | | | | | | | | | | | | |
  728. * `-----------------------------------------------------------------------------------'
  729. */
  730. [_GUI] = KEYMAP(
  731. 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,
  732. KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
  733. XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  734. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
  735. ),
  736. /* Sys
  737. * ,-----------------------------------------------------------------------------------.
  738. * | |Qwerty| Win | |Reset | | | USB | | | | |
  739. * |------+------+------+------+------+-------------+------+------+------+------+------|
  740. * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
  741. * |------+------+------+------+------+------+------+------+------+------+------+------|
  742. * | | | |Colmak| | BLE |Norman|MacOS | | | | |
  743. * |------+------+------+------+------+------+------+------+------+------+------+------|
  744. * | | | | | | | | | | | | |
  745. * `-----------------------------------------------------------------------------------'
  746. */
  747. [_SYS] = KEYMAP(
  748. XXXXXXX, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  749. XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
  750. XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  751. _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
  752. ),
  753. };
  754. void persistant_default_layer_set(uint16_t default_layer) {
  755. eeconfig_update_default_layer(default_layer);
  756. default_layer_set(default_layer);
  757. }
  758. #ifdef DOUBLESPACE_LAYER_ENABLE
  759. void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
  760. if (pressed) {
  761. *isactive = true;
  762. if (*otheractive) {
  763. layer_on(_SPACE);
  764. register_code(KC_LALT); // sends alt and enter layer
  765. space_layer_entered = true;
  766. }
  767. } else {
  768. *isactive = false;
  769. if (space_layer_entered) {
  770. unregister_code(KC_LALT); // release alt and exit layer
  771. layer_off(_SPACE);
  772. if (!*otheractive) {
  773. space_layer_entered = false;
  774. }
  775. } else {
  776. if (!*isemitted) {
  777. register_code(KC_SPC);
  778. unregister_code(KC_SPC);
  779. }
  780. *isemitted = false;
  781. }
  782. }
  783. }
  784. #endif
  785. uint32_t layer_state_set_kb(uint32_t state)
  786. {
  787. // turn on punc layer if both fun & num are on
  788. if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
  789. state |= (1UL<<_PUNC);
  790. } else {
  791. state &= ~(1UL<<_PUNC);
  792. }
  793. // turn on emoji layer if empty and greek layer are on
  794. if (
  795. (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
  796. || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
  797. ) {
  798. state |= (1UL<<_EMOJI);
  799. } else {
  800. state &= ~(1UL<<_EMOJI);
  801. }
  802. return state;
  803. }
  804. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  805. static bool lshift = false;
  806. static bool rshift = false;
  807. static uint8_t layer = 0;
  808. lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
  809. rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
  810. layer = biton32(layer_state);
  811. #ifdef DOUBLESPACE_LAYER_ENABLE
  812. // double-space: send space immediately if any other key depressed before space is released
  813. if ((lspace_active ^ rspace_active)
  814. && keycode != LSPACE
  815. && keycode != RSPACE
  816. && record->event.pressed)
  817. {
  818. if (lspace_active) {
  819. if (!lspace_emitted) {
  820. register_code(KC_SPC);
  821. unregister_code(KC_SPC);
  822. }
  823. lspace_emitted = true;
  824. }
  825. if (rspace_active) {
  826. if (!rspace_emitted) {
  827. register_code(KC_SPC);
  828. unregister_code(KC_SPC);
  829. }
  830. rspace_emitted = true;
  831. }
  832. }
  833. if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
  834. if (record->event.pressed) {
  835. unregister_code(KC_LALT);
  836. } else {
  837. register_code(KC_LALT);
  838. }
  839. }
  840. #endif
  841. switch (keycode) {
  842. #ifdef DOUBLESPACE_LAYER_ENABLE
  843. // double-space enter space layer
  844. case LSPACE:
  845. process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
  846. return false;
  847. break;
  848. case RSPACE:
  849. process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
  850. return false;
  851. break;
  852. #endif
  853. // handle greek layer shift
  854. // handle both shift = capslock
  855. case KC_LSFT:
  856. case KC_RSFT:
  857. ;
  858. if (layer == _GREEKU || layer == _GREEKL) {
  859. if (record->event.pressed) {
  860. layer_on(_GREEKU);
  861. layer_off(_GREEKL);
  862. } else {
  863. if (lshift ^ rshift) { // if only one shift was pressed
  864. layer_on(_GREEKL);
  865. layer_off(_GREEKU);
  866. }
  867. }
  868. } else {
  869. if (record->event.pressed) {
  870. if (lshift ^ rshift) { // if only one shift was pressed
  871. register_code(KC_CAPS);
  872. unregister_code(KC_CAPS);
  873. }
  874. }
  875. }
  876. return true;
  877. break;
  878. // press both ctrls to activate SYS layer
  879. case KC_LCTL:
  880. case KC_RCTL:
  881. ;
  882. bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
  883. bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
  884. if (record->event.pressed) {
  885. if (lctrl ^ rctrl) { // if only one ctrl was pressed
  886. layer_on(_SYS);
  887. }
  888. } else {
  889. layer_off(_SYS);
  890. }
  891. return true;
  892. break;
  893. // QWERTZ style comma and dot: semicolon and colon when shifted
  894. case KC_COMM:
  895. if (record->event.pressed) {
  896. if (lshift || rshift) {
  897. if (lshift) unregister_code(KC_LSFT);
  898. if (rshift) unregister_code(KC_RSFT);
  899. register_code(KC_SCLN);
  900. unregister_code(KC_SCLN);
  901. if (lshift) register_code(KC_LSFT);
  902. if (rshift) register_code(KC_RSFT);
  903. } else {
  904. register_code(KC_COMM);
  905. unregister_code(KC_COMM);
  906. }
  907. }
  908. return false;
  909. break;
  910. case KC_DOT:
  911. if (record->event.pressed) {
  912. if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
  913. register_code(KC_SCLN);
  914. unregister_code(KC_SCLN);
  915. } else {
  916. register_code(KC_DOT);
  917. unregister_code(KC_DOT);
  918. }
  919. }
  920. return false;
  921. break;
  922. // layout switchers
  923. case QWERTY:
  924. if (record->event.pressed) {
  925. persistant_default_layer_set(1UL<<_QWERTY);
  926. }
  927. return false;
  928. break;
  929. #ifdef LAYOUT_DVORAK
  930. case DVORAK:
  931. if (record->event.pressed) {
  932. persistant_default_layer_set(1UL<<_DVORAK);
  933. }
  934. return false;
  935. break;
  936. #endif
  937. #ifdef LAYOUT_COLEMAK
  938. case COLEMAK:
  939. if (record->event.pressed) {
  940. persistant_default_layer_set(1UL<<_COLEMAK);
  941. }
  942. return false;
  943. break;
  944. #endif
  945. #ifdef LAYOUT_WORKMAN
  946. case WORKMAN:
  947. if (record->event.pressed) {
  948. persistant_default_layer_set(1UL<<_WORKMAN);
  949. }
  950. return false;
  951. break;
  952. #endif
  953. #ifdef LAYOUT_NORMAN
  954. case NORMAN:
  955. if (record->event.pressed) {
  956. persistant_default_layer_set(1UL<<_NORMAN);
  957. }
  958. return false;
  959. break;
  960. #endif
  961. // layer switcher
  962. //
  963. case GREEK:
  964. if (record->event.pressed) {
  965. if (lshift || rshift) {
  966. layer_on(_GREEKU);
  967. layer_off(_GREEKL);
  968. } else {
  969. layer_on(_GREEKL);
  970. layer_off(_GREEKU);
  971. }
  972. } else {
  973. layer_off(_GREEKU);
  974. layer_off(_GREEKL);
  975. }
  976. return false;
  977. break;
  978. // OS switchers
  979. case LINUX:
  980. set_unicode_input_mode(UC_LNX);
  981. return false;
  982. break;
  983. case WIN:
  984. set_unicode_input_mode(UC_WINC);
  985. return false;
  986. break;
  987. case OSX:
  988. set_unicode_input_mode(UC_OSX);
  989. return false;
  990. break;
  991. // glow mode changer
  992. #ifdef RGBSPS_ENABLE
  993. case GLOW:
  994. if (record->event.pressed) {
  995. glow_mode++;
  996. if (glow_mode > GLOW_FULL) {
  997. glow_mode = GLOW_NONE;
  998. }
  999. led_reset();
  1000. rgbsps_send();
  1001. }
  1002. return false;
  1003. break;
  1004. #endif
  1005. // faux clicky indicator
  1006. #ifdef FAUXCLICKY_ENABLE
  1007. case FC_TOG:
  1008. return true;
  1009. break;
  1010. #endif
  1011. }
  1012. return true;
  1013. }
  1014. void set_output_user(uint8_t output) {
  1015. #ifdef ADAFRUIT_BLE_ENABLE
  1016. switch(output) {
  1017. case OUTPUT_USB:
  1018. led_set_output_usb();
  1019. break;
  1020. case OUTPUT_ADAFRUIT_BLE:
  1021. led_set_output_ble();
  1022. break;
  1023. default:
  1024. led_set_output_none();
  1025. }
  1026. #endif
  1027. }
  1028. void matrix_init_user() {
  1029. _delay_ms(500); // give time for usb to initialize
  1030. set_unicode_input_mode(UC_LNX);
  1031. #ifdef RGBSPS_ENABLE
  1032. led_init();
  1033. #endif
  1034. // auto detect output on init
  1035. #ifdef ADAFRUIT_BLE_ENABLE
  1036. uint8_t output = auto_detect_output();
  1037. if (output == OUTPUT_USB) {
  1038. set_output(OUTPUT_USB);
  1039. } else {
  1040. set_output(OUTPUT_ADAFRUIT_BLE);
  1041. }
  1042. #endif
  1043. }
  1044. void turn_off_capslock() {
  1045. if (capslock) {
  1046. register_code(KC_CAPS);
  1047. unregister_code(KC_CAPS);
  1048. }
  1049. }
  1050. #ifdef RGBSPS_ENABLE
  1051. void matrix_scan_user(void) {
  1052. led_set_layer_indicator();
  1053. }
  1054. void battery_poll(uint8_t level) {
  1055. rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
  1056. rgbsps_send();
  1057. }
  1058. void led_set_user(uint8_t usb_led) {
  1059. bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
  1060. if (new_capslock ^ capslock) { // capslock state is different
  1061. if ((capslock = new_capslock)) {
  1062. rgbsps_set(LED_IND_NUM, 15, 0, 0);
  1063. } else {
  1064. rgbsps_set(LED_IND_NUM, 0, 0, 0);
  1065. }
  1066. rgbsps_send();
  1067. }
  1068. }
  1069. #endif
  1070. #ifdef PS2_MOUSE_ENABLE
  1071. void ps2_mouse_init_user() {
  1072. uint8_t rcv;
  1073. // set TrackPoint sensitivity
  1074. PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
  1075. PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
  1076. PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
  1077. PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
  1078. // set TrackPoint Negative Inertia factor
  1079. PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
  1080. PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
  1081. PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
  1082. PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
  1083. // set TrackPoint speed
  1084. // (transfer function upper plateau speed)
  1085. PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
  1086. PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
  1087. PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
  1088. PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
  1089. // inquire pts status
  1090. rcv = ps2_host_send(0xE2);
  1091. rcv = ps2_host_send(0x2C);
  1092. rcv = ps2_host_recv_response();
  1093. if ((rcv & 1) == 1) {
  1094. // if on, disable pts
  1095. rcv = ps2_host_send(0xE2);
  1096. rcv = ps2_host_send(0x47);
  1097. rcv = ps2_host_send(0x2C);
  1098. rcv = ps2_host_send(0x01);
  1099. }
  1100. }
  1101. #endif