keymap.c 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  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. #ifdef __AVR__
  54. #include "outputselect.h"
  55. #endif
  56. #include "led.h"
  57. #define COUNT(x) (sizeof (x) / sizeof (*(x)))
  58. #define KC_WWWB KC_WWW_BACK
  59. #define KC_WWWF KC_WWW_FORWARD
  60. // hybrid right-alt & scroll lock (mapped to Compose in OS)
  61. #define C_RALT MT(MOD_RALT, KC_SLCK)
  62. // dual use right-shift & del key
  63. // #define C_RSFT MT(MOD_RSFT, KC_DEL)
  64. bool capslock = false;
  65. #ifdef DOUBLESPACE_LAYER_ENABLE
  66. bool lspace_active = false;
  67. bool rspace_active = false;
  68. bool lspace_emitted = false;
  69. bool rspace_emitted = false;
  70. bool space_layer_entered = false;
  71. #endif
  72. // glow
  73. enum glow_modes {
  74. GLOW_NONE,
  75. GLOW_MIN,
  76. GLOW_FULL
  77. };
  78. uint8_t glow_mode = GLOW_MIN;
  79. void turn_off_capslock(void);
  80. extern keymap_config_t keymap_config;
  81. // layers, ordering is important!
  82. enum layers {
  83. _QWERTY,
  84. _DVORAK,
  85. _COLEMAK,
  86. _WORKMAN,
  87. _NORMAN,
  88. _DEFAULT_LAYER_MAX = _NORMAN,
  89. _GREEKU,
  90. _GREEKL,
  91. _NUM,
  92. _FUN,
  93. _PUNC,
  94. _EMPTY,
  95. _EMOJI,
  96. _GUI,
  97. _SYS
  98. };
  99. // double-space layer
  100. #define _SPACE _GUI
  101. enum planck_keycodes {
  102. // layouts
  103. QWERTY = SAFE_RANGE,
  104. DVORAK,
  105. COLEMAK,
  106. WORKMAN,
  107. NORMAN,
  108. // layer switchers
  109. EMOJI,
  110. GUI,
  111. GREEK,
  112. // os switchers
  113. LINUX,
  114. WIN,
  115. OSX,
  116. // others
  117. LSPACE,
  118. RSPACE,
  119. GLOW,
  120. // stub
  121. #ifndef FAUXCLICKY_ENABLE
  122. FC_TOG,
  123. #endif
  124. #ifndef MODULE_ADAFRUIT_BLE
  125. OUT_BT,
  126. #endif
  127. RGBDEMO,
  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_EMPTY,
  404. LED_NUM,
  405. LED_FUN,
  406. LED_GREEK
  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]), COLOR_BLACK);
  434. }
  435. for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
  436. rgbsps_set(pgm_read_byte(&LED_MODS[i]), COLOR_BLACK);
  437. }
  438. for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
  439. rgbsps_set(pgm_read_byte(&LED_FN[i]), COLOR_BLACK);
  440. }
  441. }
  442. #ifdef RGBSPS_DEMO_ENABLE
  443. void led_demo(void) {
  444. rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
  445. rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
  446. rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
  447. rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
  448. rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
  449. rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
  450. rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
  451. rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
  452. rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
  453. rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
  454. rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
  455. rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
  456. rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
  457. rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
  458. rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
  459. rgbsps_send();
  460. }
  461. #endif
  462. void led_reset(void) {
  463. switch (glow_mode) {
  464. case GLOW_NONE:
  465. led_turnoff_keys();
  466. break;
  467. case GLOW_MIN:
  468. led_turnoff_keys();
  469. for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
  470. rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW1_HOME);
  471. }
  472. rgbsps_set(LED_F, THEME_COLOR_GLOW1_HOMING);
  473. rgbsps_set(LED_J, THEME_COLOR_GLOW1_HOMING);
  474. break;
  475. case GLOW_FULL:
  476. for(uint8_t i = 0; i < COUNT(LED_ALNUM); i++) {
  477. rgbsps_set(pgm_read_byte(&LED_ALNUM[i]), THEME_COLOR_GLOW2_ALPHA);
  478. }
  479. for(uint8_t i = 0; i < COUNT(LED_MODS); i++) {
  480. rgbsps_set(pgm_read_byte(&LED_MODS[i]), THEME_COLOR_GLOW2_MODS);
  481. }
  482. for(uint8_t i = 0; i < COUNT(LED_FN); i++) {
  483. rgbsps_set(pgm_read_byte(&LED_FN[i]), THEME_COLOR_GLOW2_FN);
  484. }
  485. for(uint8_t i = 0; i < COUNT(LED_HOMING); i++) {
  486. rgbsps_set(pgm_read_byte(&LED_HOMING[i]), THEME_COLOR_GLOW2_HOME);
  487. }
  488. rgbsps_set(LED_F, THEME_COLOR_GLOW2_HOMING);
  489. rgbsps_set(LED_J, THEME_COLOR_GLOW2_HOMING);
  490. break;
  491. }
  492. }
  493. void led_set_default_layer_indicator(void) {
  494. uint8_t default_layer = biton32(default_layer_state);
  495. if (default_layer == _QWERTY) {
  496. rgbsps_set(LED_IND_QWERTY, THEME_COLOR_QWERTY);
  497. rgbsps_set(LED_IND_ALT, COLOR_BLANK);
  498. } else {
  499. rgbsps_set(LED_IND_QWERTY, COLOR_BLANK);
  500. rgbsps_set(LED_IND_ALT, THEME_COLOR_ALT);
  501. }
  502. rgbsps_send();
  503. return;
  504. }
  505. void led_set_layer_indicator(void) {
  506. static uint8_t oldlayer = 255;
  507. led_reset();
  508. rgbsps_set(LED_IND_GUI, COLOR_BLANK);
  509. rgbsps_set(LED_IND_FUN, COLOR_BLANK);
  510. rgbsps_set(LED_IND_NUM, COLOR_BLANK);
  511. rgbsps_set(LED_IND_PUNC, COLOR_BLANK);
  512. rgbsps_set(LED_IND_GREEK, COLOR_BLANK);
  513. rgbsps_set(LED_IND_EMOJI, COLOR_BLANK);
  514. uint8_t layer = biton32(layer_state);
  515. if (oldlayer == layer) {
  516. return;
  517. }
  518. oldlayer = layer;
  519. if (layer <= _DEFAULT_LAYER_MAX) {
  520. rgbsps_send();
  521. return;
  522. }
  523. switch(layer) {
  524. case _GUI:
  525. rgbsps_set(LED_IND_GUI, THEME_COLOR_GUI);
  526. break;
  527. case _FUN:
  528. rgbsps_set(LED_IND_FUN, THEME_COLOR_FUN);
  529. break;
  530. case _NUM:
  531. rgbsps_set(LED_IND_NUM, THEME_COLOR_NUM);
  532. break;
  533. case _PUNC:
  534. rgbsps_set(LED_IND_PUNC, THEME_COLOR_PUNC);
  535. break;
  536. case _GREEKL:
  537. case _GREEKU:
  538. rgbsps_set(LED_IND_GREEK, THEME_COLOR_GREEK);
  539. break;
  540. case _EMOJI:
  541. rgbsps_set(LED_IND_EMOJI, THEME_COLOR_EMOJI);
  542. break;
  543. default:
  544. rgbsps_set(LED_IND_GUI, THEME_COLOR_OTHERLAYER);
  545. rgbsps_set(LED_IND_FUN, THEME_COLOR_OTHERLAYER);
  546. rgbsps_set(LED_IND_NUM, THEME_COLOR_OTHERLAYER);
  547. rgbsps_set(LED_IND_PUNC, THEME_COLOR_OTHERLAYER);
  548. rgbsps_set(LED_IND_GREEK, THEME_COLOR_OTHERLAYER);
  549. rgbsps_set(LED_IND_EMOJI, THEME_COLOR_OTHERLAYER);
  550. }
  551. rgbsps_send();
  552. }
  553. void led_set_unicode_input_mode(void) {
  554. rgbsps_set(LED_IND_LINUX, COLOR_BLANK);
  555. rgbsps_set(LED_IND_APPLE, COLOR_BLANK);
  556. rgbsps_set(LED_IND_WINDOWS, COLOR_BLANK);
  557. switch (get_unicode_input_mode()) {
  558. case UC_LNX:
  559. rgbsps_set(LED_IND_LINUX, THEME_COLOR_LINUX);
  560. break;
  561. case UC_OSX:
  562. rgbsps_set(LED_IND_APPLE, THEME_COLOR_APPLE);
  563. break;
  564. case UC_WIN:
  565. case UC_WINC:
  566. rgbsps_set(LED_IND_WINDOWS, THEME_COLOR_WINDOWS);
  567. break;
  568. }
  569. rgbsps_send();
  570. }
  571. void led_set_output_ble(void) {
  572. rgbsps_set(LED_IND_BLUETOOTH, THEME_COLOR_BLUETOOTH);
  573. rgbsps_set(LED_IND_USB, COLOR_BLANK);
  574. rgbsps_send();
  575. }
  576. void led_set_output_usb(void) {
  577. rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
  578. rgbsps_set(LED_IND_USB, THEME_COLOR_USB);
  579. rgbsps_send();
  580. }
  581. void led_set_output_none(void) {
  582. rgbsps_set(LED_IND_BLUETOOTH, COLOR_BLANK);
  583. rgbsps_set(LED_IND_USB, COLOR_BLANK);
  584. rgbsps_send();
  585. }
  586. void led_init(void) {
  587. // turn off all
  588. rgbsps_turnoff();
  589. // set trackpoint color
  590. rgbsps_set(LED_TRACKPOINT1, THEME_COLOR_TP1);
  591. rgbsps_set(LED_TRACKPOINT2, THEME_COLOR_TP2);
  592. rgbsps_set(LED_TRACKPOINT3, THEME_COLOR_TP3);
  593. // unicode input mode
  594. led_set_unicode_input_mode();
  595. // layer indicator
  596. led_set_layer_indicator();
  597. led_set_default_layer_indicator();
  598. // clicky
  599. #ifdef FAUXCLICKY_ENABLE
  600. if (fauxclicky_enabled) {
  601. rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
  602. } else {
  603. rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
  604. }
  605. #endif
  606. rgbsps_send();
  607. }
  608. #endif // RGBSPS_ENABLE
  609. // keymaps
  610. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  611. /* Qwerty
  612. * ,-----------------------------------------------------------------------------------.
  613. * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
  614. * |------+------+------+------+------+-------------+------+------+------+------+------|
  615. * | Esc | A | S | D | F | G | H | J | K | L | ' |Enter |
  616. * |------+------+------+------+------+------|------+------+------+------+------+------|
  617. * | Shift| Z | X | C | V | B | N | M | , | . | / |Shift |
  618. * |------+------+------+------+------+------+------+------+------+------+------+------|
  619. * | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
  620. * `-----------------------------------------------------------------------------------'
  621. */
  622. [_QWERTY] = LAYOUT(
  623. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
  624. KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT ,
  625. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
  626. KC_LCTL, KC_LALT, KC_LGUI, EMPTY, NUM, LSPACE, RSPACE, FUN, GREEK, KC_RGUI, C_RALT, KC_RCTL,
  627. _______, _______, _______
  628. ),
  629. /* Dvorak
  630. * ,-----------------------------------------------------------------------------------.
  631. * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
  632. * |------+------+------+------+------+-------------+------+------+------+------+------|
  633. * | Esc | A | O | E | U | I | D | H | T | N | S |Enter |
  634. * |------+------+------+------+------+------|------+------+------+------+------+------|
  635. * | Shift| / | Q | J | K | X | B | M | W | V | Z |Shift |
  636. * |------+------+------+------+------+------+------+------+------+------+------+------|
  637. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  638. * `-----------------------------------------------------------------------------------'
  639. */
  640. #ifdef LAYOUT_DVORAK
  641. [_DVORAK] = LAYOUT(
  642. _______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
  643. _______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
  644. _______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
  645. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  646. _______, _______, _______
  647. ),
  648. #endif
  649. /* Colemak
  650. * ,-----------------------------------------------------------------------------------.
  651. * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
  652. * |------+------+------+------+------+-------------+------+------+------+------+------|
  653. * | Esc | A | R | S | T | D | H | N | E | I | O |Enter |
  654. * |------+------+------+------+------+------|------+------+------+------+------+------|
  655. * | Shift| Z | X | C | V | B | K | M | , | . | / |Shift |
  656. * |------+------+------+------+------+------+------+------+------+------+------+------|
  657. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  658. * `-----------------------------------------------------------------------------------'
  659. */
  660. #ifdef LAYOUT_COLEMAK
  661. [_COLEMAK] = LAYOUT(
  662. _______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
  663. _______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
  664. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  665. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  666. _______, _______, _______
  667. ),
  668. #endif
  669. /* Norman
  670. * ,-----------------------------------------------------------------------------------.
  671. * | Tab | Q | W | D | F | K | J | U | R | L | ; | Bksp |
  672. * |------+------+------+------+------+-------------+------+------+------+------+------|
  673. * | Esc | A | S | E | T | G | Y | N | I | O | H |Enter |
  674. * |------+------+------+------+------+------|------+------+------+------+------+------|
  675. * | Shift| Z | X | C | V | B | P | M | , | . | / |Shift |
  676. * |------+------+------+------+------+------+------+------+------+------+------+------|
  677. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  678. * `-----------------------------------------------------------------------------------'
  679. */
  680. #ifdef LAYOUT_NORMAN
  681. [_NORMAN] = LAYOUT(
  682. _______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
  683. _______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
  684. _______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
  685. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  686. _______, _______, _______
  687. ),
  688. #endif
  689. /* Workman
  690. * ,-----------------------------------------------------------------------------------.
  691. * | Tab | Q | D | R | W | B | J | F | U | P | ; | Bksp |
  692. * |------+------+------+------+------+-------------+------+------+------+------+------|
  693. * | Esc | A | S | H | T | G | Y | N | E | O | I |Enter |
  694. * |------+------+------+------+------+------|------+------+------+------+------+------|
  695. * | Shift| Z | X | M | C | V | K | K | , | . | / |Shift |
  696. * |------+------+------+------+------+------+------+------+------+------+------+------|
  697. * | Ctrl | Alt | GUI | Punc | Num | Space | Func |Greek | GUI |AltGr | Ctrl |
  698. * `-----------------------------------------------------------------------------------'
  699. */
  700. #ifdef LAYOUT_WORKMAN
  701. [_WORKMAN] = LAYOUT(
  702. _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
  703. _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
  704. _______, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
  705. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  706. _______, _______, _______
  707. ),
  708. #endif
  709. /* Punc
  710. * ,-----------------------------------------------------------------------------------.
  711. * | ~ | ! | @ | # | $ | % | ^ | & | * | โ‰ค | โ‰ฅ | ` |
  712. * |------+------+------+------+------+-------------+------+------+------+------+------|
  713. * | | * | \ | - | = | / | โ‰  | ( | ) | < | > | |
  714. * |------+------+------+------+------+------|------+------+------+------+------+------|
  715. * | & | ^ | | | _ | + | ? | ยฑ | [ | ] | { | } | |
  716. * |------+------+------+------+------+------+------+------+------+------+------+------|
  717. * | | | | | | | | | | : | |
  718. * `-----------------------------------------------------------------------------------'
  719. */
  720. [_PUNC] = LAYOUT(
  721. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
  722. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
  723. KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
  724. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
  725. _______, _______, _______
  726. ),
  727. /* Num
  728. * ,-----------------------------------------------------------------------------------.
  729. * | ~ | ! | @ | # | $ | % | A | 7 | 8 | 9 | D | |
  730. * |------+------+------+------+------+-------------+------+------+------+------+------|
  731. * | ` | * | \ | - | = | / | B | 4 | 5 | 6 | E | |
  732. * |------+------+------+------+------+------|------+------+------+------+------+------|
  733. * | & | ^ | | | _ | + | ? | C | 1 | 2 | 3 | F | |
  734. * |------+------+------+------+------+------+------+------+------+------+------+------|
  735. * | | | x | | | | | 0 | , | . | : | |
  736. * `-----------------------------------------------------------------------------------'
  737. */
  738. [_NUM] = LAYOUT(
  739. KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
  740. KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
  741. KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
  742. _______, _______, KC_X, _______, _______, _______, _______, FUN0 , KC_COMM, KC_DOT, KC_COLN, _______,
  743. _______, _______, _______
  744. ),
  745. /* Func
  746. * ,-----------------------------------------------------------------------------------.
  747. * | | F1 | F2 | F3 | F4 | Ins | | PgUp | Up | PgDn | PgUp | |
  748. * |------+------+------+------+------+-------------+------+------+------+------+------|
  749. * | Caps | F5 | F6 | F7 | F8 |PrtSc | | Left | Down | Right| PgDn | |
  750. * |------+------+------+------+------+------|------+------+------+------+------+------|
  751. * | | F9 | F10 | F11 | F12 |Pause | | | Home | End | | |
  752. * |------+------+------+------+------+------+------+------+------+------+------+------|
  753. * | | | | | | | | | | | |
  754. * `-----------------------------------------------------------------------------------'
  755. */
  756. [_FUN] = LAYOUT(
  757. XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
  758. KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
  759. _______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
  760. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  761. _______, _______, _______
  762. ),
  763. /* Uppercase Greek
  764. * ,-----------------------------------------------------------------------------------.
  765. * | | | | | | | | | | | | |
  766. * |------+------+------+------+------+-------------+------+------+------+------+------|
  767. * | | | | | | | | | | | | |
  768. * |------+------+------+------+------+------+------+------+------+------+------+------|
  769. * | | | | | | | | | | | | |
  770. * |------+------+------+------+------+------+------+------+------+------+------+------|
  771. * | | | | | | | | | | | | |
  772. * `-----------------------------------------------------------------------------------'
  773. */
  774. [_GREEKU] = LAYOUT(
  775. _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
  776. _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
  777. _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  778. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  779. _______, _______, _______
  780. ),
  781. /* Lowercase Greek
  782. * ,-----------------------------------------------------------------------------------.
  783. * | | | | | | | | | | | | |
  784. * |------+------+------+------+------+-------------+------+------+------+------+------|
  785. * | | | | | | | | | | | | |
  786. * |------+------+------+------+------+------+------+------+------+------+------+------|
  787. * | | | | | | | | | | | | |
  788. * |------+------+------+------+------+------+------+------+------+------+------+------|
  789. * | | | | | | | | | | | | |
  790. * `-----------------------------------------------------------------------------------'
  791. */
  792. [_GREEKL] = LAYOUT(
  793. _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
  794. _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
  795. _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
  796. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  797. _______, _______, _______
  798. ),
  799. /* Empty
  800. * ,-----------------------------------------------------------------------------------.
  801. * | | | | | | | | | | | | |
  802. * |------+------+------+------+------+-------------+------+------+------+------+------|
  803. * | | | | | | | | | | | | |
  804. * |------+------+------+------+------+------+------+------+------+------+------+------|
  805. * | | | | | | | | | | | | |
  806. * |------+------+------+------+------+------+------+------+------+------+------+------|
  807. * | | | | | | | | | | | | |
  808. * `-----------------------------------------------------------------------------------'
  809. */
  810. [_EMPTY] = LAYOUT(
  811. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  812. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  813. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  814. _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  815. _______, _______, _______
  816. ),
  817. /* Emoji
  818. * ,-----------------------------------------------------------------------------------.
  819. * | ๐Ÿ’• | ๐Ÿ˜ข | ๐Ÿ˜ฉ | ๐Ÿ˜ | ๐Ÿ˜ | ๐Ÿ˜‚ | โ™ป | ๐Ÿ˜’ | ๐ŸŽถ | ๐Ÿ‘Œ | ๐Ÿ˜” | ๐Ÿ˜Œ |
  820. * |------+------+------+------+------+-------------+------+------+------+------+------|
  821. * | ๐Ÿ‘ | ๐Ÿ™ | ๐Ÿ˜ | ๐Ÿ˜… | ๐Ÿ˜ณ | ๐Ÿ˜Š | โค | ๐Ÿ‘‹ | ๐Ÿ˜˜ | ๐Ÿ™Œ | ๐Ÿ˜Ž | ๐Ÿ™ˆ |
  822. * |------+------+------+------+------+------+------+------+------+------+------+------|
  823. * | ๐Ÿ‘Ž | ๐Ÿ˜ด | ๐Ÿ‘ | ๐Ÿ˜ญ | โœŒ | ๐Ÿ’” | โ˜€ | ๐Ÿ˜Š | ๐Ÿ˜‰ | ๐ŸŒ” | ๐Ÿ˜• | ๐Ÿ™‰ |
  824. * |------+------+------+------+------+------+------+------+------+------+------+------|
  825. * | ๐Ÿ’ฉ | ๐Ÿ‘€ | ๐Ÿ’ฏ | | ๐Ÿ’€ | ๐Ÿ˜ˆ | ๐Ÿ˜‡ | ๐Ÿ˜ฑ | | ๐Ÿ˜‹ | ๐Ÿ˜ž | ๐Ÿ™Š |
  826. * `-----------------------------------------------------------------------------------'
  827. */
  828. [_EMOJI] = LAYOUT(
  829. X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
  830. X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
  831. X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
  832. X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
  833. _______, _______, _______
  834. ),
  835. /* GUI
  836. * ,-----------------------------------------------------------------------------------.
  837. * | | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | |
  838. * |------+------+------+------+------+-------------+------+------+------+------+------|
  839. * | Esc | | Btab | Esc | Tab | | | Prev | | Next | | |
  840. * |------+------+------+------+------+------+------+------+------+------+------+------|
  841. * | | | Prev | Play | Next | | | | | | | |
  842. * |------+------+------+------+------+------+------+------+------+------+------+------|
  843. * | | | | | | | | | | | | |
  844. * `-----------------------------------------------------------------------------------'
  845. */
  846. [_GUI] = LAYOUT(
  847. 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,
  848. KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
  849. XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  850. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  851. _______, _______, _______
  852. ),
  853. /* Sys
  854. * ,-----------------------------------------------------------------------------------.
  855. * | |Qwerty| Win | |Reset | | | USB | | | | |
  856. * |------+------+------+------+------+-------------+------+------+------+------+------|
  857. * | |Audio | |Dvorak| | Glow | | |WorkMn|Linux | | |
  858. * |------+------+------+------+------+------+------+------+------+------+------+------|
  859. * | | | |Colmak| | BLE |Norman|MacOS | | | | |
  860. * |------+------+------+------+------+------+------+------+------+------+------+------|
  861. * | | | | | | | | | | | | |
  862. * `-----------------------------------------------------------------------------------'
  863. */
  864. [_SYS] = LAYOUT(
  865. DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
  866. XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
  867. XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  868. _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
  869. _______, _______, _______
  870. ),
  871. };
  872. void persistent_default_layer_set(uint16_t default_layer) {
  873. eeconfig_update_default_layer(default_layer);
  874. default_layer_set(default_layer);
  875. #ifdef RGBSPS_ENABLE
  876. led_set_default_layer_indicator();
  877. #endif
  878. }
  879. #ifdef DOUBLESPACE_LAYER_ENABLE
  880. void process_doublespace(bool pressed, bool *isactive, bool *otheractive, bool *isemitted) {
  881. if (pressed) {
  882. *isactive = true;
  883. if (*otheractive) {
  884. layer_on(_SPACE);
  885. register_code(KC_LALT); // sends alt and enter layer
  886. space_layer_entered = true;
  887. }
  888. } else {
  889. *isactive = false;
  890. if (space_layer_entered) {
  891. unregister_code(KC_LALT); // release alt and exit layer
  892. layer_off(_SPACE);
  893. if (!*otheractive) {
  894. space_layer_entered = false;
  895. }
  896. } else {
  897. if (!*isemitted) {
  898. register_code(KC_SPC);
  899. unregister_code(KC_SPC);
  900. }
  901. *isemitted = false;
  902. }
  903. }
  904. }
  905. #endif
  906. uint32_t layer_state_set_kb(uint32_t state)
  907. {
  908. // turn on punc layer if both fun & num are on
  909. if ((state & ((1UL<<_NUM) | (1UL<<_FUN))) == ((1UL<<_NUM) | (1UL<<_FUN))) {
  910. state |= (1UL<<_PUNC);
  911. } else {
  912. state &= ~(1UL<<_PUNC);
  913. }
  914. // turn on emoji layer if empty and greek layer are on
  915. if (
  916. (state & ((1UL<<_EMPTY) | (1UL<<_GREEKU))) == ((1UL<<_EMPTY) | (1UL<<_GREEKU))
  917. || (state & ((1UL<<_EMPTY) | (1UL<<_GREEKL))) == ((1UL<<_EMPTY) | (1UL<<_GREEKL))
  918. ) {
  919. state |= (1UL<<_EMOJI);
  920. } else {
  921. state &= ~(1UL<<_EMOJI);
  922. }
  923. return state;
  924. }
  925. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  926. static bool lshift = false;
  927. static bool rshift = false;
  928. static uint8_t layer = 0;
  929. lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
  930. rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
  931. layer = biton32(layer_state);
  932. #ifdef DOUBLESPACE_LAYER_ENABLE
  933. // double-space: send space immediately if any other key depressed before space is released
  934. if ((lspace_active ^ rspace_active)
  935. && keycode != LSPACE
  936. && keycode != RSPACE
  937. && record->event.pressed)
  938. {
  939. if (lspace_active) {
  940. if (!lspace_emitted) {
  941. register_code(KC_SPC);
  942. unregister_code(KC_SPC);
  943. }
  944. lspace_emitted = true;
  945. }
  946. if (rspace_active) {
  947. if (!rspace_emitted) {
  948. register_code(KC_SPC);
  949. unregister_code(KC_SPC);
  950. }
  951. rspace_emitted = true;
  952. }
  953. }
  954. if (layer == _SPACE && keycode != S(KC_TAB) && keycode != KC_TAB && keycode != KC_ESC && keycode != XXXXXXX) {
  955. if (record->event.pressed) {
  956. unregister_code(KC_LALT);
  957. } else {
  958. register_code(KC_LALT);
  959. }
  960. }
  961. #endif
  962. switch (keycode) {
  963. #ifdef DOUBLESPACE_LAYER_ENABLE
  964. // double-space enter space layer
  965. case LSPACE:
  966. process_doublespace(record->event.pressed, &lspace_active, &rspace_active, &lspace_emitted);
  967. return false;
  968. break;
  969. case RSPACE:
  970. process_doublespace(record->event.pressed, &rspace_active, &lspace_active, &rspace_emitted);
  971. return false;
  972. break;
  973. #endif
  974. // handle greek layer shift
  975. case KC_LSFT:
  976. case KC_RSFT:
  977. ;
  978. if (layer == _GREEKU || layer == _GREEKL) {
  979. if (record->event.pressed) {
  980. layer_on(_GREEKU);
  981. layer_off(_GREEKL);
  982. } else {
  983. if (lshift ^ rshift) { // if only one shift was pressed
  984. layer_on(_GREEKL);
  985. layer_off(_GREEKU);
  986. }
  987. }
  988. }
  989. return true;
  990. break;
  991. // press both ctrls to activate SYS layer
  992. case KC_LCTL:
  993. case KC_RCTL:
  994. ;
  995. bool lctrl = keyboard_report->mods & MOD_BIT(KC_LCTL);
  996. bool rctrl = keyboard_report->mods & MOD_BIT(KC_RCTL);
  997. if (record->event.pressed) {
  998. if (lctrl ^ rctrl) { // if only one ctrl was pressed
  999. layer_on(_SYS);
  1000. }
  1001. } else {
  1002. layer_off(_SYS);
  1003. }
  1004. return true;
  1005. break;
  1006. // QWERTZ style comma and dot: semicolon and colon when shifted
  1007. case KC_COMM:
  1008. if (record->event.pressed) {
  1009. if (lshift || rshift) {
  1010. if (lshift) unregister_code(KC_LSFT);
  1011. if (rshift) unregister_code(KC_RSFT);
  1012. register_code(KC_SCLN);
  1013. unregister_code(KC_SCLN);
  1014. if (lshift) register_code(KC_LSFT);
  1015. if (rshift) register_code(KC_RSFT);
  1016. } else {
  1017. register_code(KC_COMM);
  1018. unregister_code(KC_COMM);
  1019. }
  1020. }
  1021. return false;
  1022. break;
  1023. case KC_DOT:
  1024. if (record->event.pressed) {
  1025. if ((keyboard_report->mods & MOD_BIT(KC_LSFT)) || (keyboard_report->mods & MOD_BIT(KC_RSFT))) {
  1026. register_code(KC_SCLN);
  1027. unregister_code(KC_SCLN);
  1028. } else {
  1029. register_code(KC_DOT);
  1030. unregister_code(KC_DOT);
  1031. }
  1032. }
  1033. return false;
  1034. break;
  1035. // layout switchers
  1036. case QWERTY:
  1037. if (record->event.pressed) {
  1038. persistent_default_layer_set(1UL<<_QWERTY);
  1039. }
  1040. return false;
  1041. break;
  1042. #ifdef LAYOUT_DVORAK
  1043. case DVORAK:
  1044. if (record->event.pressed) {
  1045. persistent_default_layer_set(1UL<<_DVORAK);
  1046. }
  1047. return false;
  1048. break;
  1049. #endif
  1050. #ifdef LAYOUT_COLEMAK
  1051. case COLEMAK:
  1052. if (record->event.pressed) {
  1053. persistent_default_layer_set(1UL<<_COLEMAK);
  1054. }
  1055. return false;
  1056. break;
  1057. #endif
  1058. #ifdef LAYOUT_WORKMAN
  1059. case WORKMAN:
  1060. if (record->event.pressed) {
  1061. persistent_default_layer_set(1UL<<_WORKMAN);
  1062. }
  1063. return false;
  1064. break;
  1065. #endif
  1066. #ifdef LAYOUT_NORMAN
  1067. case NORMAN:
  1068. if (record->event.pressed) {
  1069. persistent_default_layer_set(1UL<<_NORMAN);
  1070. }
  1071. return false;
  1072. break;
  1073. #endif
  1074. // only process Fnumber on key release, and only when layer switcher is still pressed.
  1075. // this is to avoid accidental presses on potentially destructive keys
  1076. case KC_F1 ... KC_F12:
  1077. case KC_PAUS:
  1078. case KC_PSCR:
  1079. case KC_INS:
  1080. if (!record->event.pressed && layer == _FUN) { // key released and still in FUN layer
  1081. register_code(keycode);
  1082. unregister_code(keycode);
  1083. }
  1084. return false;
  1085. break;
  1086. // layer switcher
  1087. //
  1088. case GREEK:
  1089. if (record->event.pressed) {
  1090. if (lshift || rshift) {
  1091. layer_on(_GREEKU);
  1092. layer_off(_GREEKL);
  1093. } else {
  1094. layer_on(_GREEKL);
  1095. layer_off(_GREEKU);
  1096. }
  1097. } else {
  1098. layer_off(_GREEKU);
  1099. layer_off(_GREEKL);
  1100. }
  1101. return false;
  1102. break;
  1103. // OS switchers
  1104. case LINUX:
  1105. set_unicode_input_mode(UC_LNX);
  1106. #ifdef RGBSPS_ENABLE
  1107. led_set_unicode_input_mode();
  1108. #endif
  1109. return false;
  1110. break;
  1111. case WIN:
  1112. set_unicode_input_mode(UC_WINC);
  1113. #ifdef RGBSPS_ENABLE
  1114. led_set_unicode_input_mode();
  1115. #endif
  1116. return false;
  1117. break;
  1118. case OSX:
  1119. set_unicode_input_mode(UC_OSX);
  1120. #ifdef RGBSPS_ENABLE
  1121. led_set_unicode_input_mode();
  1122. #endif
  1123. return false;
  1124. break;
  1125. // glow mode changer
  1126. #ifdef RGBSPS_ENABLE
  1127. case GLOW:
  1128. if (record->event.pressed) {
  1129. glow_mode++;
  1130. if (glow_mode > GLOW_FULL) {
  1131. glow_mode = GLOW_NONE;
  1132. }
  1133. led_reset();
  1134. rgbsps_send();
  1135. }
  1136. return false;
  1137. break;
  1138. #endif
  1139. // faux clicky indicator
  1140. #ifdef FAUXCLICKY_ENABLE
  1141. case FC_TOG:
  1142. #ifdef RGBSPS_ENABLE
  1143. if (fauxclicky_enabled) {
  1144. rgbsps_set(LED_IND_AUDIO, THEME_COLOR_AUDIO);
  1145. } else {
  1146. rgbsps_set(LED_IND_AUDIO, COLOR_BLANK);
  1147. }
  1148. rgbsps_send();
  1149. #endif
  1150. return true;
  1151. break;
  1152. #endif
  1153. #ifdef RGBSPS_DEMO_ENABLE
  1154. case RGBDEMO:
  1155. led_demo();
  1156. return false;
  1157. break;
  1158. #endif
  1159. }
  1160. return true;
  1161. }
  1162. void set_output_user(uint8_t output) {
  1163. #ifdef MODULE_ADAFRUIT_BLE
  1164. switch(output) {
  1165. case OUTPUT_USB:
  1166. led_set_output_usb();
  1167. break;
  1168. case OUTPUT_BLUETOOTH:
  1169. led_set_output_ble();
  1170. break;
  1171. default:
  1172. led_set_output_none();
  1173. }
  1174. #endif
  1175. }
  1176. void matrix_init_user() {
  1177. wait_ms(500); // give time for usb to initialize
  1178. set_unicode_input_mode(UC_LNX);
  1179. #ifdef RGBSPS_ENABLE
  1180. led_init();
  1181. #endif
  1182. // auto detect output on init
  1183. #ifdef MODULE_ADAFRUIT_BLE
  1184. uint8_t output = auto_detect_output();
  1185. if (output == OUTPUT_USB) {
  1186. set_output(OUTPUT_USB);
  1187. } else {
  1188. set_output(OUTPUT_BLUETOOTH);
  1189. }
  1190. #endif
  1191. }
  1192. void turn_off_capslock() {
  1193. if (capslock) {
  1194. register_code(KC_CAPS);
  1195. unregister_code(KC_CAPS);
  1196. }
  1197. }
  1198. #ifdef RGBSPS_ENABLE
  1199. void matrix_scan_user(void) {
  1200. led_set_layer_indicator();
  1201. }
  1202. void battery_poll(uint8_t level) {
  1203. rgbsps_sethsv(LED_IND_BATTERY, level * 120/255, 255, 15);
  1204. rgbsps_send();
  1205. }
  1206. void led_set_user(uint8_t usb_led) {
  1207. bool new_capslock = usb_led & (1<<USB_LED_CAPS_LOCK);
  1208. if (new_capslock ^ capslock) { // capslock state is different
  1209. if ((capslock = new_capslock)) {
  1210. rgbsps_set(LED_IND_CAPSLOCK, THEME_COLOR_CAPSLOCK);
  1211. } else {
  1212. rgbsps_set(LED_IND_CAPSLOCK, COLOR_BLANK);
  1213. }
  1214. rgbsps_send();
  1215. }
  1216. }
  1217. #endif
  1218. #ifdef PS2_MOUSE_ENABLE
  1219. void ps2_mouse_init_user() {
  1220. uint8_t rcv;
  1221. // set TrackPoint sensitivity
  1222. PS2_MOUSE_SEND(0xE2, "tpsens: 0xE2");
  1223. PS2_MOUSE_SEND(0x81, "tpsens: 0x81");
  1224. PS2_MOUSE_SEND(0x4A, "tpsens: 0x4A");
  1225. PS2_MOUSE_SEND(0x49, "tpsens: 0x59");
  1226. // set TrackPoint Negative Inertia factor
  1227. PS2_MOUSE_SEND(0xE2, "tpnegin: 0xE2");
  1228. PS2_MOUSE_SEND(0x81, "tpnegin: 0x81");
  1229. PS2_MOUSE_SEND(0x4D, "tpnegin: 0x4D");
  1230. PS2_MOUSE_SEND(0x06, "tpnegin: 0x06");
  1231. // set TrackPoint speed
  1232. // (transfer function upper plateau speed)
  1233. PS2_MOUSE_SEND(0xE2, "tpsp: 0xE2");
  1234. PS2_MOUSE_SEND(0x81, "tpsp: 0x81");
  1235. PS2_MOUSE_SEND(0x60, "tpsp: 0x60");
  1236. PS2_MOUSE_SEND(0x61, "tpsp: 0x61");
  1237. // inquire pts status
  1238. rcv = ps2_host_send(0xE2);
  1239. rcv = ps2_host_send(0x2C);
  1240. rcv = ps2_host_recv_response();
  1241. if ((rcv & 1) == 1) {
  1242. // if on, disable pts
  1243. rcv = ps2_host_send(0xE2);
  1244. rcv = ps2_host_send(0x47);
  1245. rcv = ps2_host_send(0x2C);
  1246. rcv = ps2_host_send(0x01);
  1247. }
  1248. }
  1249. #endif