You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1363 lines
42 KiB

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