keymap.c 42 KB

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