keymap.c 37 KB

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