keymap.c 37 KB

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