keymap.c 32 KB

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