keymap.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. // this is the style you want to emulate.
  2. // This is the canonical layout file for the Quantum project. If you want to add another keyboard,
  3. #include "chimera_ortho.h"
  4. #include "action_layer.h"
  5. #include "version.h"
  6. #include "process_keycode/process_tap_dance.h"
  7. #include "gordon.h"
  8. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  9. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  10. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  11. // entirely and just use numbers.
  12. #define CALTDEL LCTL(LALT(KC_DEL))
  13. #define TSKMGR LCTL(LSFT(KC_ESC))
  14. #define KC_SNAPLEFT LGUI(KC_LEFT)
  15. #define KC_SNAPRIGHT LGUI(KC_RIGHT)
  16. #define KC_SNAPUP LGUI(KC_UP)
  17. #define KC_SNAPDOWN LGUI(KC_DOWN)
  18. #define KC_PREVTAB LCTL(LSFT(KC_TAB))
  19. #define KC_NEXTTAB LCTL(KC_TAB)
  20. #define KC_WORKRIGHT LCTL(LGUI(KC_RIGHT))
  21. #define KC_WORKLEFT LCTL(LGUI(KC_LEFT))
  22. #define KC_NMPD TG(_NUMPAD)
  23. #define KC_SYMB TG(_SYMBOLS)
  24. #define KC_SCTL MT(MOD_LCTL, KC_LBRC)
  25. #define KC_SCTR MT(MOD_LCTL, KC_RBRC)
  26. #define KC_SPLT MT(MOD_LALT, KC_MINS)
  27. #define KC_SPRT MT(MOD_LALT, KC_1)
  28. #define KC_GBRC MT(MOD_RGUI, KC_8)
  29. #define KC_GQOT MT(MOD_LGUI, KC_QUOT)
  30. #define KC_CSHW MT(MOD_LCTL|MOD_LSFT,KC_W)
  31. #define KC_CDEL LCTL(KC_DEL)
  32. #define KC_AUDUP KC_AUDIO_VOL_UP
  33. #define KC_AUDOWN KC_AUDIO_VOL_DOWN
  34. #define KC_MEHS MEH_T(KC_S)
  35. #define KC_MEHL MEH_T(KC_L)
  36. #define KC_GWIN GUI_T(KC_G)
  37. #define KC_FCTL CTL_T(KC_F)
  38. #define KC_JCTL CTL_T(KC_J)
  39. #define KC_ZCTL CTL_T(KC_Z)
  40. #define KC_ALTV ALT_T(KC_V)
  41. #define KC_ALTN ALT_T(KC_N)
  42. #define KC_MEHX ALL_T(KC_X)
  43. #define KC_RESET RESET
  44. //LTs
  45. #define KC_MESC LT(_MACROS, KC_ESC)
  46. #define KC_DNUM LT(_NUMPAD, KC_D)
  47. #define KC_SPFN LT(_NAV,KC_EQL)
  48. #define KC_EMAUS LT(_MOUSE,KC_E)
  49. #define KC_ENAV LT(_NAV,KC_E)
  50. #define KC_INAV LT(_TEXTNAV,KC_I)
  51. #define KC_BSPSYM LT(_SYMBOLS,KC_BSPACE)
  52. #define KC_ENTSYM LT(_SYMBOLS,KC_ENTER)
  53. #define KC_CLNMAUS LT(_MOUSE,KC_SCOLON)
  54. #define KC_FUNC TT(_FUNCTION)
  55. //TAP DANCE
  56. #define KC_F6F7 TD(F6F7)
  57. #define KC_ALF4 TD(ALTF4)
  58. #define KC_TTT TD(TTT)
  59. #define KC_ENHM TD(HOME_END)
  60. #define KC_CLPS TD(CALC_PRINTSCREEN)
  61. #define KC_INCL M(0)
  62. #define KC_PULL M(1)
  63. #define KC_PUSH M(2)
  64. #define KC_SCAP M(3)
  65. #define KC_SCOF M(4)
  66. #define KC_CAD LALT(LCTL(KC_DEL))
  67. #define LONGPRESS_DELAY 150
  68. //#define LAYER_TOGGLE_DELAY 300
  69. // Fillers to make layering more clear
  70. #define _______ KC_TRNS
  71. #define XXXXXXX KC_NO
  72. #define KC_ KC_TRNS
  73. /* TODO:
  74. *
  75. * DONE: RESET and CAD into macro layer.
  76. * DONE: WINUP AND WINDOWN in NAV layer
  77. * DONE: Get rid of caps layer. not sure what it is even for.
  78. * DONE: LMEH
  79. * DONE: plus, divide, multiply on left hand for num layer
  80. * DONE: F1 - F12 on a layer toggle (not a temp toggle but a one shot or something)
  81. * DONE: Volume, page up and down for mouse layer.
  82. * DONE: Add full user files - without using anything.
  83. * DONE: Insert, ctrl delete
  84. * DONE: Home and End
  85. * DONE: Printscreen
  86. * Easier way to open new terminal (instead of alt + F2)
  87. * Intellij/text navigation layer (ctrl delete could be here).
  88. * Macro for "System.exit(0)" probably macro layer and "c"
  89. * Some sort of tap dance for comma, H, right pinky, and possibly other corners.
  90. * Something more with the right hand. not sure what.
  91. * Mouse: Left scroll, right scroll
  92. * Passwords and any other macros.
  93. * LED for control
  94. * All modifiers reset
  95. * Russain layer
  96. * Hebrew layer
  97. * Get rid of stupid git pull and push macros.
  98. *
  99. */
  100. //Tap dance enums
  101. enum {
  102. F12ETAPS = 0,
  103. CALCCOMP,
  104. ALTF4,
  105. F6F7,
  106. TTT,
  107. HOME_END,
  108. CALC_PRINTSCREEN
  109. };
  110. static xtap ttt_state = {
  111. .is_press_action = true,
  112. .state = 0
  113. };
  114. //Already exists in gordon.c, shouldn't need this anymore
  115. /*// To activate SINGLE_HOLD, you will need to hold for 200ms first.
  116. // This tap dance favors keys that are used frequently in typing like 'f'
  117. int cur_dance (qk_tap_dance_state_t *state) {
  118. if (state->count == 1) {
  119. if (state->interrupted) {
  120. return SINGLE_TAP;
  121. }
  122. else {
  123. if (!state->pressed) return SINGLE_TAP;
  124. else return SINGLE_HOLD;
  125. }
  126. }
  127. //If count = 2, and it has been interrupted - assume that user is trying to type the letter associated
  128. //with single tap.
  129. else if (state->count == 2) {
  130. if (state->interrupted) return DOUBLE_SINGLE_TAP;
  131. else if (state->pressed) return DOUBLE_HOLD;
  132. else return DOUBLE_TAP;
  133. }
  134. else if ((state->count == 3) && ((state->interrupted) || (!state->pressed))) return TRIPLE_TAP;
  135. else if (state->count == 3) return TRIPLE_HOLD;
  136. else return 8; //magic number. At some point this method will expand to work for more presses
  137. }*/
  138. /* "Super tap toggle"
  139. * Basically, TT but for two or more layers for a single key.
  140. * This particular dance:
  141. * Single tap/hold - TT for Function layer
  142. * Double tap/hold - TT for Numpad layer
  143. * Triple tap/hold - TT for Mouse layer
  144. *
  145. */
  146. void TTT_finished (qk_tap_dance_state_t *state, void *user_data) {
  147. ttt_state.state = cur_dance(state);
  148. switch (ttt_state.state) {
  149. case SINGLE_TAP: layer_invert(_FUNCTION); break;
  150. case SINGLE_HOLD: layer_on(_FUNCTION); break;
  151. case DOUBLE_TAP: layer_invert(_NUMPAD); break;
  152. case DOUBLE_HOLD: layer_on(_NUMPAD); break;
  153. case DOUBLE_SINGLE_TAP: layer_invert(_NUMPAD); break;
  154. case TRIPLE_TAP: layer_invert(_MOUSE); break;
  155. case TRIPLE_HOLD: layer_on(_MOUSE); break;
  156. }
  157. }
  158. void TTT_reset (qk_tap_dance_state_t *state, void *user_data) {
  159. switch (ttt_state.state) {
  160. case SINGLE_TAP: break;
  161. case SINGLE_HOLD: layer_off(_FUNCTION); break;
  162. case DOUBLE_TAP: break;
  163. case DOUBLE_HOLD: layer_off(_NUMPAD); break;
  164. case DOUBLE_SINGLE_TAP: break;
  165. case TRIPLE_TAP: break;
  166. case TRIPLE_HOLD: layer_off(_MOUSE); break;
  167. }
  168. ttt_state.state = 0;
  169. }
  170. qk_tap_dance_action_t tap_dance_actions[] = {
  171. // simple tap dance
  172. [F12ETAPS] = ACTION_TAP_DANCE_DOUBLE(KC_F12,LSFT(LCTL(KC_F10))),
  173. [CALCCOMP] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_MY_COMPUTER),
  174. [CALC_PRINTSCREEN] = ACTION_TAP_DANCE_DOUBLE(KC_CALCULATOR, KC_PSCR),
  175. [ALTF4] = ACTION_TAP_DANCE_DOUBLE(KC_F4,LALT(KC_F4)),
  176. [F6F7] = ACTION_TAP_DANCE_DOUBLE(LSFT(KC_F6), LALT(KC_F7)),
  177. [HOME_END] = ACTION_TAP_DANCE_DOUBLE(KC_END, KC_HOME),
  178. [TTT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL,TTT_finished, TTT_reset),
  179. };
  180. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  181. [_QWERTY] = KEYMAP(
  182. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  183. MESC, Q ,CSHW,ENAV, R , T ,SPC , CLPS, Y , U ,INAV, O , P ,TTT,
  184. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  185. TAB , A , MEHS,DNUM,FCTL,GWIN,GRAVE, TILD, H ,JCTL, K ,MEHL,CLNMAUS,ENHM,
  186. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  187. MINUS,ZCTL,MEHX, C ,ALTV, B ,DELETE, INS ,ALTN, M ,COMM,DOT ,SLSH,UNDS,
  188. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  189. LSHIFT,BSPSYM, SPC ,ENTSYM
  190. // \------------------+----+----+---/ \---+----+----+-------------------/
  191. ),
  192. [_NUMPAD] = KEYMAP(
  193. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  194. , , , ,ASTR, , , , , 7 , 8 , 9 ,ASTR,/**/,
  195. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  196. ,MINS,PLUS,/**/,EQUAL, , , , , 4 , 5 , 6 ,PLUS, ,
  197. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  198. , , , ,SLSH, , , , , 1 , 2 , 3 ,SLSH, ,
  199. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  200. , , , 0
  201. // \------------------+----+----+---/ \---+----+----+-------------------/
  202. ),
  203. [_SYMBOLS] = KEYMAP(
  204. //,----+----+-----+----+----+----+----. ,----+----+----+----+----+----+----.
  205. ,EXLM, AT ,LCBR,RCBR,HASH, , ,CIRC,AMPR,ASTR,LPRN,RPRN,/**/,
  206. //|----+----+-----+----+----+----+----| |----+----+----+----+----+----+----|
  207. ,EXLM,EXLM,LPRN,RPRN , , , , ,DQUO,EQUAL,QUOTE,RCBR, ,
  208. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  209. ,DOLLAR, PERC,LBRACKET,RBRACKET, , , ,PIPE,BSLASH,PLUS, , , ,
  210. //|----+----+-----+----+----+----+----| |----+----+----+----+----+----+----|
  211. UNDS,/**/, ,/**/
  212. // \-------------------+----+----+---/ \---+----+----+-------------------/
  213. ),
  214. [_FUNCTION] = KEYMAP(
  215. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  216. F6F7 ,F1 ,F2 ,F3 ,ALF4,F5 ,F6 , F7 ,F8 ,F9 ,F10 ,F11 ,F12 ,/**/,
  217. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  218. , , , , , , , , , , , , , ,
  219. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  220. , , , , , , , , , , , , , ,
  221. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  222. , , ,
  223. // \------------------+----+----+---/ \---+----+----+-------------------/
  224. ),
  225. [_NAV] = KEYMAP(
  226. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  227. , ,SNAPLEFT,/**/,SNAPRIGHT,, , , , , UP , , , ,
  228. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  229. ,SNAPUP,PREVTAB, ,NEXTTAB,SNAPDOWN,, , ,LEFT,DOWN,RGHT, , ,
  230. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  231. , ,WORKLEFT, ,WORKRIGHT,, , , ,PGUP,PGDN, , , ,
  232. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  233. CDEL ,DEL, ,
  234. // \------------------+----+----+---/ \---+----+----+-------------------/
  235. ),
  236. [_TEXTNAV] = KEYMAP(
  237. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  238. , , , , , , , , , ,/**/, , , ,
  239. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  240. , , , , , , , , , , , , , ,
  241. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  242. , , , , , , , , , , , , , ,
  243. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  244. , , ,
  245. // \------------------+----+----+---/ \---+----+----+-------------------/
  246. ),
  247. [_MOUSE] = KEYMAP(
  248. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  249. , , ,MS_UP, , , , , , , UP , , , ,/**/
  250. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  251. , ,MS_LEFT,MS_DOWN,MS_RIGHT, , , , ,LEFT,DOWN,RGHT,/**/, ,
  252. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  253. , , , , , , , , , , , , , ,
  254. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  255. ,MS_BTN1 ,MS_BTN2 ,
  256. // \------------------+----+----+---/ \---+----+----+-------------------/
  257. ),
  258. [_MACROS] = KEYMAP(
  259. //,----+----+----+----+----+----+----. ,----+----+----+----+----+----+----.
  260. /**/,RESET,SECRET_2,SECRET_3, , , ,SYSTEM_SLEEP, , ,INCL, , , ,
  261. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  262. CAD ,SECRET_1, , , , , , , , , , , , ,
  263. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  264. SCAP, , , , , , , , , , , , ,SCAP,
  265. //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----|
  266. , , ,
  267. // \------------------+----+----+---/ \---+----+----+-------------------/
  268. )
  269. };
  270. const uint16_t PROGMEM fn_actions[] = {
  271. };
  272. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  273. {
  274. switch(id) {
  275. /* include some kind of library or header */
  276. case 0:
  277. if (record->event.pressed) {
  278. SEND_STRING("#include <>");
  279. return MACRO( T(LEFT), END);
  280. }
  281. break;
  282. case 1:
  283. if (record->event.pressed) {
  284. SEND_STRING("git pull");
  285. return MACRO( T(ENT), END );
  286. }
  287. break;
  288. case 2:
  289. if (record->event.pressed){
  290. SEND_STRING("git push");
  291. return MACRO( T(ENT), END );
  292. }
  293. break;
  294. case 3:
  295. if (record->event.pressed){
  296. // layer_on(_CAPS);
  297. // register_code(KC_CAPSLOCK);
  298. // unregister_code(KC_CAPSLOCK);
  299. }
  300. break;
  301. case 4:
  302. if (record->event.pressed){
  303. // layer_off(_CAPS);
  304. // register_code(KC_CAPSLOCK);
  305. // unregister_code(KC_CAPSLOCK);
  306. }
  307. break;
  308. }
  309. return MACRO_NONE;
  310. };
  311. void matrix_scan_user(void) {
  312. uint8_t layer = biton32(layer_state);
  313. switch (layer) {
  314. case _QWERTY:
  315. set_led_green;
  316. break;
  317. case _MOUSE:
  318. set_led_yellow;
  319. break;
  320. case _NUMPAD:
  321. set_led_blue;
  322. break;
  323. case _SYMBOLS:
  324. set_led_red;
  325. break;
  326. case _NAV:
  327. set_led_magenta;
  328. break;
  329. case _MACROS:
  330. set_led_green;
  331. _delay_ms(45);
  332. set_led_red;
  333. _delay_ms(45);
  334. break;
  335. case _FUNCTION:
  336. set_led_green;
  337. _delay_ms(45);
  338. set_led_blue;
  339. _delay_ms(45);
  340. break;
  341. default:
  342. set_led_green;
  343. break;
  344. }
  345. };