2
0

keymap.c 42 KB

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