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.

1367 lines
42 KiB

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