logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

keymap.c (42761B)


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