keymap.c 42 KB

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