keymap.c 40 KB

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