keymap.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  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. #pragma message "You may need to add LAYOUT_planck_grid to your keymap layers - see default for an example"
  4. #include "planck.h"
  5. #include "action_layer.h"
  6. #ifdef AUDIO_ENABLE
  7. #include "audio.h"
  8. #endif
  9. #include "eeconfig.h"
  10. #include "keymap_colemak.h"
  11. extern keymap_config_t keymap_config;
  12. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  13. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  14. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  15. // entirely and just use numbers.
  16. enum planck_layers {
  17. _QWERTY,
  18. _COLEMAK,
  19. _QWOC,
  20. _LOWER,
  21. _RAISE,
  22. _PLOVER,
  23. _SUPERDUPER,
  24. _MOUSE,
  25. _ADJUST
  26. };
  27. enum planck_keycodes {
  28. QWERTY = SAFE_RANGE,
  29. COLEMAK,
  30. QWOC,
  31. PLOVER,
  32. SUPERDUPER,
  33. MOUSE,
  34. LOWER,
  35. RAISE,
  36. BACKLIT,
  37. EXT_PLV,
  38. SDTOGG, // Toggle SuperDuper
  39. };
  40. enum functions {
  41. M_GUI_UNDS, // Simulate GUI_T(KC_UNDS)
  42. M_SFT_PO, // SFT_T(KC_LPRN)
  43. };
  44. // Timer for custom mod tap
  45. static uint16_t m_gui_unds_timer;
  46. static uint16_t m_sft_po_timer;
  47. // Fillers to make layering more clear
  48. #define _______ KC_TRNS
  49. #define XXXXXXX KC_NO
  50. // Narze : Custom Macros
  51. #define HPR_ESC ALL_T(KC_ESC)
  52. #define SFT_ENT SFT_T(KC_ENT)
  53. #define SFT_PO F(M_SFT_PO)
  54. #define GUI_MINS GUI_T(KC_MINS)
  55. #define GUI_UNDS F(M_GUI_UNDS)
  56. // Combo : SuperDuper layer from S+D (R+S in Colemak)
  57. #define SUPERDUPER_COMBO_COUNT 3
  58. #define EECONFIG_SUPERDUPER_INDEX (uint8_t *) 19
  59. enum process_combo_event {
  60. CB_SUPERDUPER,
  61. };
  62. const uint16_t PROGMEM superduper_combos[SUPERDUPER_COMBO_COUNT][3] = {
  63. [_QWERTY] = {KC_S, KC_D, COMBO_END},
  64. [_COLEMAK] = {KC_R, KC_S, COMBO_END},
  65. [_QWOC] = {CM_S, CM_D, COMBO_END},
  66. };
  67. combo_t key_combos[COMBO_COUNT] = {
  68. [CB_SUPERDUPER] = COMBO_ACTION(superduper_combos[_QWERTY]),
  69. };
  70. volatile bool superduper_enabled = true;
  71. const uint16_t empty_combo[] = {COMBO_END};
  72. void set_superduper_key_combos(void);
  73. void clear_superduper_key_combos(void);
  74. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  75. /* Qwerty
  76. * ,-----------------------------------------------------------------------------------.
  77. * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
  78. * |------+------+------+------+------+-------------+------+------+------+------+------|
  79. * | Hp/Ec| A | S | D | F | G | H | J | K | L | ; | ' |
  80. * |------+------+------+------+------+------|------+------+------+------+------+------|
  81. * | Sft/(| Z/Mo | X | C | V | B | N | M | , | . | SD-/ |Sft/Ent|
  82. * |------+------+------+------+------+------+------+------+------+------+------+------|
  83. * | Rse/[| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]|
  84. * `-----------------------------------------------------------------------------------'
  85. */
  86. [_QWERTY] = {
  87. {KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
  88. {HPR_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
  89. {SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT},
  90. {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)}
  91. },
  92. /* Colemak
  93. * ,-----------------------------------------------------------------------------------.
  94. * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
  95. * |------+------+------+------+------+-------------+------+------+------+------+------|
  96. * | Hp/Ec| A | R | S | T | D | H | N | E | I | O | ' |
  97. * |------+------+------+------+------+------|------+------+------+------+------+------|
  98. * | Sft/(| Z/Mo | X | C | V | B | K | M | , | . | SD-/ |Sft/Ent|
  99. * |------+------+------+------+------+------+------+------+------+------+------+------|
  100. * | Brite| Ctrl | Alt | GUI/_|Lower | Space |Raise | GUI/-| Alt | Ctrl | Low/]|
  101. * `-----------------------------------------------------------------------------------'
  102. */
  103. [_COLEMAK] = {
  104. {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC},
  105. {HPR_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT},
  106. {SFT_PO, LT(_MOUSE, KC_Z), KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, LT(_SUPERDUPER, KC_SLSH), SFT_ENT},
  107. {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)}
  108. },
  109. /* Qwerty on software Colemak : Useful for gaming with qwerty keymaps! */
  110. [_QWOC] = {
  111. {KC_TAB, CM_Q, CM_W, CM_E, CM_R, CM_T, CM_Y, CM_U, CM_I, CM_O, CM_P, KC_BSPC},
  112. {HPR_ESC, CM_A, CM_S, CM_D, CM_F, CM_G, CM_H, CM_J, CM_K, CM_L, CM_SCLN, KC_QUOT},
  113. {SFT_PO, LT(_MOUSE, CM_Z), CM_X, CM_C, CM_V, CM_B, CM_N, CM_M, CM_COMM, CM_DOT, LT(_SUPERDUPER, CM_SLSH), SFT_ENT},
  114. {LT(_RAISE, KC_LBRC), KC_LCTL, KC_LALT, GUI_UNDS, LOWER, KC_SPC, KC_SPC, RAISE, GUI_MINS, KC_RALT, KC_RCTL, LT(_LOWER, KC_RBRC)}
  115. },
  116. /* Lower
  117. * ,-----------------------------------------------------------------------------------.
  118. * | ` | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
  119. * |------+------+------+------+------+-------------+------+------+------+------+------|
  120. * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
  121. * |------+------+------+------+------+------|------+------+------+------+------+------|
  122. * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Sft/Ent|
  123. * |------+------+------+------+------+------+------+------+------+------+------+------|
  124. * | | | | | | | | Next | Vol- | Vol+ | Play |
  125. * `-----------------------------------------------------------------------------------'
  126. */
  127. [_LOWER] = {
  128. {KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
  129. {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
  130. {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
  131. {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
  132. },
  133. /* Raise
  134. * ,-----------------------------------------------------------------------------------.
  135. * | ~ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
  136. * |------+------+------+------+------+-------------+------+------+------+------+------|
  137. * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
  138. * |------+------+------+------+------+------|------+------+------+------+------+------|
  139. * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Sft/Ent|
  140. * |------+------+------+------+------+------+------+------+------+------+------+------|
  141. * | | | | | | | | Next | Vol- | Vol+ | Play |
  142. * `-----------------------------------------------------------------------------------'
  143. */
  144. [_RAISE] = {
  145. {KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
  146. {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS},
  147. {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______},
  148. {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
  149. },
  150. /* Plover layer (http://opensteno.org)
  151. * ,-----------------------------------------------------------------------------------.
  152. * | # | # | # | # | # | # | # | # | # | # | # | # |
  153. * |------+------+------+------+------+-------------+------+------+------+------+------|
  154. * | | S | T | P | H | * | * | F | P | L | T | D |
  155. * |------+------+------+------+------+------|------+------+------+------+------+------|
  156. * |TogOut| S | K | W | R | * | * | R | B | G | S | Z |
  157. * |------+------+------+------+------+------+------+------+------+------+------+------|
  158. * | Exit | | | A | O | | E | U | | | |
  159. * `-----------------------------------------------------------------------------------'
  160. */
  161. [_PLOVER] = {
  162. {KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1 },
  163. {XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC},
  164. {XXXXXXX, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT},
  165. {EXT_PLV, XXXXXXX, XXXXXXX, KC_C, KC_V, XXXXXXX, XXXXXXX, KC_N, KC_M, XXXXXXX, XXXXXXX, XXXXXXX}
  166. },
  167. /* SuperDuper : https://gist.github.com/narze/861e2167784842d38771
  168. * /-----------------------------------------------------------------------------------\
  169. * | | | | | | | | | T← | T→ | | |
  170. * |------+------+------+------+------+-------------+------+------+------+------+------|
  171. * | | Alt | [SuperDuper]| Bksp | Gui | ← | ↓ | ↑ | → | Del | |
  172. * |------+------+------+------+------+------|------+------+------+------+------+------|
  173. * | | | | | | | | | | | | |
  174. * |------+------+------+------+------+-------------+------+------+------+------+------|
  175. * | | | | | | Shift | | | | | |
  176. * \-----------------------------------------------------------------------------------/
  177. */
  178. [_SUPERDUPER] = {
  179. {_______, _______, _______, _______, _______, _______, _______, _______, S(LGUI(KC_LBRC)), S(LGUI(KC_RBRC)), _______, _______},
  180. {_______, KC_LALT, _______, _______, KC_BSPC, KC_LGUI, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_DEL, _______},
  181. {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
  182. {_______, _______, _______, _______, _______, KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______}
  183. },
  184. /* Mouse
  185. * /-----------------------------------------------------------------------------------\
  186. * | | | S↑ | M↑ | S↓ | | | | S↑ | S↓ | | |
  187. * |------+------+------+------+------+-------------+------+------+------+------+------|
  188. * | | | M← | M↓ | M→ | | M← | M↓ | M↑ | M→ | | |
  189. * |------+------+------+------+------+------|------+------+------+------+------+------|
  190. * | |[Mouse| | | | M3 | M3 | | | | | |
  191. * |------+------+------+------+------+-------------+------+------+------+------+------|
  192. * | | | | | M2 | LeftClick | M2 | | | | |
  193. * \-----------------------------------------------------------------------------------/
  194. */
  195. [_MOUSE] = {
  196. {_______, _______, KC_WH_U, KC_MS_U, KC_WH_D, _______, _______, _______, KC_WH_U, KC_WH_D, _______, _______},
  197. {_______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______},
  198. {_______, _______, _______, _______, _______, KC_BTN3, KC_BTN3, _______, _______, _______, _______, _______},
  199. {_______, _______, _______, _______, KC_BTN2, KC_BTN1, KC_BTN1, KC_BTN2, _______, _______, _______, _______}
  200. },
  201. /* Adjust (Lower + Raise)
  202. * ,-----------------------------------------------------------------------------------.
  203. * | | Reset| | | | | | | | | | Del |
  204. * |------+------+------+------+------+-------------+------+------+------+------+------|
  205. * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|QwOnCo|Plover| |
  206. * |------+------+------+------+------+------|------+------+------+------+------+------|
  207. * | |Voice-|Voice+|Mus on|Musoff|MIDIon|MIDIof|SDtogg| | | | |
  208. * |------+------+------+------+------+------+------+------+------+------+------+------|
  209. * | | | | | | | | | | | |
  210. * `-----------------------------------------------------------------------------------'
  211. */
  212. [_ADJUST] = {
  213. {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
  214. {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, QWOC, PLOVER, _______},
  215. {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, SDTOGG, _______, _______, _______, _______},
  216. {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
  217. }
  218. };
  219. #ifdef AUDIO_ENABLE
  220. float tone_startup[][2] = SONG(STARTUP_SOUND);
  221. float tone_qwerty[][2] = SONG(QWERTY_SOUND);
  222. float tone_qwoc[][2] = SONG(DVORAK_SOUND);
  223. float tone_colemak[][2] = SONG(COLEMAK_SOUND);
  224. float tone_plover[][2] = SONG(PLOVER_SOUND);
  225. float tone_plover_gb[][2] = SONG(PLOVER_GOODBYE_SOUND);
  226. float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
  227. float tone_coin[][2] = SONG(COIN_SOUND);
  228. float tone_sonic_ring[][2] = SONG(SONIC_RING);
  229. float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
  230. float tone_superduper[][2] = SONG(SUPER_DUPER_SOUND);
  231. #endif
  232. void persistant_default_layer_set(uint16_t default_layer) {
  233. eeconfig_update_default_layer(default_layer);
  234. default_layer_set(default_layer);
  235. }
  236. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  237. switch (keycode) {
  238. case QWERTY:
  239. if (record->event.pressed) {
  240. #ifdef AUDIO_ENABLE
  241. PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
  242. #endif
  243. persistant_default_layer_set(1UL<<_QWERTY);
  244. key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWERTY];
  245. eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWERTY);
  246. }
  247. return false;
  248. break;
  249. case COLEMAK:
  250. if (record->event.pressed) {
  251. #ifdef AUDIO_ENABLE
  252. PLAY_NOTE_ARRAY(tone_colemak, false, 0);
  253. #endif
  254. persistant_default_layer_set(1UL<<_COLEMAK);
  255. key_combos[CB_SUPERDUPER].keys = superduper_combos[_COLEMAK];
  256. eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _COLEMAK);
  257. }
  258. return false;
  259. break;
  260. case QWOC:
  261. if (record->event.pressed) {
  262. #ifdef AUDIO_ENABLE
  263. PLAY_NOTE_ARRAY(tone_qwoc, false, 0);
  264. #endif
  265. persistant_default_layer_set(1UL<<_QWOC);
  266. key_combos[CB_SUPERDUPER].keys = superduper_combos[_QWOC];
  267. eeprom_update_byte(EECONFIG_SUPERDUPER_INDEX, _QWOC);
  268. }
  269. return false;
  270. break;
  271. case LOWER:
  272. if (record->event.pressed) {
  273. layer_on(_LOWER);
  274. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  275. } else {
  276. layer_off(_LOWER);
  277. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  278. }
  279. return false;
  280. break;
  281. case RAISE:
  282. if (record->event.pressed) {
  283. layer_on(_RAISE);
  284. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  285. } else {
  286. layer_off(_RAISE);
  287. update_tri_layer(_LOWER, _RAISE, _ADJUST);
  288. }
  289. return false;
  290. break;
  291. case BACKLIT:
  292. if (record->event.pressed) {
  293. register_code(KC_RSFT);
  294. #ifdef BACKLIGHT_ENABLE
  295. backlight_step();
  296. #endif
  297. } else {
  298. unregister_code(KC_RSFT);
  299. }
  300. return false;
  301. break;
  302. case PLOVER:
  303. if (record->event.pressed) {
  304. #ifdef AUDIO_ENABLE
  305. stop_all_notes();
  306. PLAY_NOTE_ARRAY(tone_plover, false, 0);
  307. #endif
  308. layer_off(_RAISE);
  309. layer_off(_LOWER);
  310. layer_off(_ADJUST);
  311. layer_on(_PLOVER);
  312. if (!eeconfig_is_enabled()) {
  313. eeconfig_init();
  314. }
  315. keymap_config.raw = eeconfig_read_keymap();
  316. keymap_config.nkro = 1;
  317. eeconfig_update_keymap(keymap_config.raw);
  318. }
  319. return false;
  320. break;
  321. case EXT_PLV:
  322. if (record->event.pressed) {
  323. #ifdef AUDIO_ENABLE
  324. PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
  325. #endif
  326. layer_off(_PLOVER);
  327. }
  328. return false;
  329. break;
  330. case SDTOGG:
  331. if (record->event.pressed) {
  332. superduper_enabled = !superduper_enabled;
  333. if (superduper_enabled) {
  334. set_superduper_key_combos();
  335. #ifdef AUDIO_ENABLE
  336. PLAY_NOTE_ARRAY(tone_sonic_ring, false, 0);
  337. #endif
  338. } else {
  339. clear_superduper_key_combos();
  340. #ifdef AUDIO_ENABLE
  341. PLAY_NOTE_ARRAY(tone_coin, false, 0);
  342. #endif
  343. }
  344. }
  345. return false;
  346. break;
  347. }
  348. return true;
  349. }
  350. void matrix_init_user(void) {
  351. #ifdef AUDIO_ENABLE
  352. startup_user();
  353. #endif
  354. }
  355. void matrix_setup(void) {
  356. set_superduper_key_combos();
  357. }
  358. void set_superduper_key_combos(void) {
  359. uint8_t layer = eeprom_read_byte(EECONFIG_SUPERDUPER_INDEX);
  360. switch (layer) {
  361. case _QWERTY:
  362. case _COLEMAK:
  363. case _QWOC:
  364. key_combos[CB_SUPERDUPER].keys = superduper_combos[layer];
  365. break;
  366. }
  367. }
  368. void clear_superduper_key_combos(void) {
  369. key_combos[CB_SUPERDUPER].keys = empty_combo;
  370. }
  371. void matrix_scan_user(void) {
  372. }
  373. #ifdef AUDIO_ENABLE
  374. void startup_user()
  375. {
  376. _delay_ms(20); // gets rid of tick
  377. PLAY_NOTE_ARRAY(tone_startup, false, 0);
  378. }
  379. void shutdown_user()
  380. {
  381. PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
  382. _delay_ms(150);
  383. stop_all_notes();
  384. }
  385. void music_on_user(void)
  386. {
  387. music_scale_user();
  388. }
  389. void music_scale_user(void)
  390. {
  391. PLAY_NOTE_ARRAY(music_scale, false, 0);
  392. }
  393. #endif
  394. // Combos
  395. void process_combo_event(uint8_t combo_index, bool pressed) {
  396. if (pressed) {
  397. switch(combo_index) {
  398. case CB_SUPERDUPER:
  399. layer_on(_SUPERDUPER);
  400. #ifdef AUDIO_ENABLE
  401. PLAY_NOTE_ARRAY(tone_superduper, false, 0);
  402. #endif
  403. break;
  404. }
  405. } else {
  406. layer_off(_SUPERDUPER);
  407. unregister_mods(MOD_BIT(KC_LGUI) | MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT)); // Sometimes mods are held, unregister them
  408. }
  409. }
  410. // Macros
  411. const uint16_t PROGMEM fn_actions[] = {
  412. [M_GUI_UNDS] = ACTION_MACRO_TAP(M_GUI_UNDS),
  413. [M_SFT_PO] = ACTION_MACRO_TAP(M_SFT_PO),
  414. };
  415. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  416. {
  417. bool tap_not_interrupted = record->tap.count > 0 && !record->tap.interrupted;
  418. switch(id) {
  419. // Hold for LGUI, tap for Underscore
  420. case M_GUI_UNDS:
  421. if (record->event.pressed) {
  422. m_gui_unds_timer = timer_read();
  423. if (!tap_not_interrupted) {
  424. register_mods(MOD_BIT(KC_LGUI));
  425. }
  426. } else {
  427. if (tap_not_interrupted && timer_elapsed(m_gui_unds_timer) < TAPPING_TERM) {
  428. #ifdef AUDIO_ENABLE
  429. PLAY_NOTE_ARRAY(tone_superduper, false, 0);
  430. #endif
  431. add_weak_mods(MOD_BIT(KC_LSFT));
  432. send_keyboard_report();
  433. register_code(KC_MINS);
  434. unregister_code(KC_MINS);
  435. del_weak_mods(MOD_BIT(KC_LSFT));
  436. send_keyboard_report();
  437. record->tap.count = 0; // ad hoc: cancel tap
  438. } else {
  439. unregister_mods(MOD_BIT(KC_LGUI));
  440. }
  441. }
  442. break;
  443. // Hold for LSHIFT, tap for Parens open
  444. case M_SFT_PO:
  445. if (record->event.pressed) {
  446. m_sft_po_timer = timer_read();
  447. if (!tap_not_interrupted) {
  448. register_mods(MOD_BIT(KC_LSFT));
  449. }
  450. } else {
  451. if (tap_not_interrupted && timer_elapsed(m_sft_po_timer) < TAPPING_TERM) {
  452. #ifdef AUDIO_ENABLE
  453. PLAY_NOTE_ARRAY(tone_superduper, false, 0);
  454. #endif
  455. record->tap.count = 0;
  456. return MACRO(D(RSFT), T(9), U(RSFT), END);
  457. } else {
  458. unregister_mods(MOD_BIT(KC_LSFT));
  459. }
  460. }
  461. break;
  462. }
  463. return MACRO_NONE;
  464. };