my layout for the ergodox infinity with qmk
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
16 KiB

  1. // German keymap derived from "german", but more closely resembling the German layout of the Kinesis Ergo Elan.
  2. //
  3. // chschmitz, 2016-01-27
  4. #include QMK_KEYBOARD_H
  5. #include "debug.h"
  6. #include "action_layer.h"
  7. #include "keymap_german.h"
  8. #include "lcd_backlight.h"
  9. // Layer names
  10. #define XBASE 0 // default layer
  11. #define SYMB 1 // symbol layer
  12. #define MOUS 2 // mouse and numbers
  13. #define MDIA 3 // media keys
  14. #define _STEP 25 // increase / decrease stepsize
  15. /*
  16. #define COUNT(x) (sizeof (x) / sizeof (*(x)))
  17. const uint16_t PROGMEM auto_tap_keys[] = {
  18. DE_LESS,
  19. DE_MORE,
  20. };
  21. */
  22. //Tap Dance Declarations
  23. enum {
  24. TD_L_SHLCK = 0,
  25. TD_R_SHLCK,
  26. TD_ESCCLS,
  27. TD_ALTTAB
  28. };
  29. enum custom_layers {
  30. _BASE,
  31. _LOWER,
  32. _RAISE,
  33. _NUMS
  34. };
  35. enum custom_keycodes {
  36. CK_CUT = SAFE_RANGE,
  37. CK_COPY,
  38. CK_PASTE,
  39. DIS_COL,
  40. DIS_IDEC,
  41. DIS_IINC,
  42. DIS_SDEC,
  43. DIS_SINC,
  44. DIS_TOG,
  45. BASE,
  46. LOWER,
  47. RAISE,
  48. NUMS
  49. };
  50. uint8_t _hue = 0;
  51. uint8_t _saturation = 0;
  52. uint8_t _intensity = 0;
  53. uint8_t _enable = 0;
  54. static bool alttab_sequence_start = true;
  55. void td_alttab_sequence (qk_tap_dance_state_t *state, void *user_data) {
  56. if (state->count <= 2) {
  57. if (alttab_sequence_start) {
  58. register_code(KC_LALT);
  59. alttab_sequence_start = false;
  60. }
  61. SEND_STRING(SS_TAP(X_TAB));
  62. }
  63. else {
  64. unregister_code(KC_LALT);
  65. alttab_sequence_start = true;
  66. reset_tap_dance (state);
  67. }
  68. }
  69. void td_escape_close (qk_tap_dance_state_t *state, void *user_data) {
  70. if (state->count <= 2) {
  71. register_code(KC_ESC);
  72. unregister_code(KC_ESC);
  73. }
  74. else {
  75. SEND_STRING(SS_DOWN(X_LALT)SS_TAP(X_F4)SS_UP(X_LALT));
  76. }
  77. }
  78. //Tap Dance Definitions
  79. qk_tap_dance_action_t tap_dance_actions[] = {
  80. //Tap once for Esc, twice for Caps Lock
  81. [TD_L_SHLCK] = ACTION_TAP_DANCE_DOUBLE(KC_LSFT, KC_CAPS),
  82. [TD_R_SHLCK] = ACTION_TAP_DANCE_DOUBLE(KC_RSFT, KC_CAPS),
  83. [TD_ESCCLS] = ACTION_TAP_DANCE_FN(td_escape_close),
  84. [TD_ALTTAB] = ACTION_TAP_DANCE_FN(td_alttab_sequence)
  85. // Other declarations would go here, separated by commas, if you have them
  86. };
  87. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  88. /* Keymap 0: Basic layer
  89. *
  90. * X'es mark the spots where this is different from the "german" layout which it is based on.
  91. *
  92. * ,--------------------------------------------------. ,--------------------------------------------------.
  93. * |X Esc X| 1 | 2 | 3 | 4 | 5 |X ` X| |XPRSCX| 6 | 7 | 8 | 9 | 0 | ß |
  94. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  95. * |X Tab X| Q | W | E | R | T |X L1 X| |X L1 X| Z | U | I | O | P | Ü |
  96. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  97. * | Caps | A | S | D | F | G |------| |------| H | J | K | L | Ö | Ä/L2 |
  98. * |--------+------+------+------+------+------|X L2 X| |X L2 X|------+------+------+------+------+--------|
  99. * | LShift | Y | X | C | V | B | | | | N | M | , | . |X - X| RShift |
  100. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  101. * |XLGuiX|X ^ X|X < X|XLEFTX|XRIGHT| |XDownX|X Up X|X # X|X + X|XRGuiX|
  102. * `----------------------------------' `----------------------------------'
  103. * ,-------------. ,-------------.
  104. * |XCTRLX|XALTX | | Alt |Ctrl/Esc|
  105. * ,------+------+------| |------+--------+------.
  106. * |XXX |XXX | Home | | PgUp |XXX |XXX |
  107. * | Bkspc|Del |------| |------| Enter | Space|
  108. * | | | End | | PgDn | | |
  109. * `--------------------' `----------------------'
  110. */
  111. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  112. // Otherwise, it needs KC_*
  113. [_BASE] = LAYOUT_ergodox( // layer 0 : default
  114. // left hand
  115. TD(TD_ESCCLS),KC_1, KC_2, KC_3, KC_4, KC_5, CK_CUT,
  116. TD(TD_ALTTAB),KC_Q, KC_W, KC_E, KC_R, KC_T, CK_COPY,
  117. KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G,
  118. KC_LALT, DE_Y, KC_X, KC_C, KC_V, KC_B, CK_PASTE,
  119. KC_LGUI, KC_DEL, KC_PGDN, KC_PGUP, LOWER,
  120. KC_LEFT, KC_RGHT,
  121. KC_HOME,
  122. KC_SPC,TD(TD_L_SHLCK),KC_TAB,
  123. // right hand
  124. KC_PSCR, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DOT,
  125. KC_PGUP, DE_Z, KC_U, KC_I, KC_O, KC_P, DE_SS,
  126. KC_H, KC_J, KC_K, KC_L, DE_OE, RCTL_T(DE_UE),
  127. KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, DE_MINS, RALT_T(DE_AE),
  128. RAISE, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT,
  129. KC_DOWN, KC_UP,
  130. KC_END,
  131. KC_ENT, TD(TD_R_SHLCK), KC_BSPC
  132. ),
  133. // [BASE] = LAYOUT_ergodox( // layer 0 : default
  134. // // left hand
  135. // KC_CIRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY,
  136. // KC_DELT, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
  137. // KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G,
  138. // KC_LSFT, DE_Y, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
  139. // LT(SYMB,DE_LESS),CTL_T(DE_HASH), DE_ACUT, DE_MINS, DE_PLUS,
  140. // ALT_T(KC_APP), KC_LGUI,
  141. // KC_HOME,
  142. // KC_SPC,KC_BSPC,KC_END,
  143. // // right hand
  144. // KC_MNXT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
  145. // TG(2), DE_Z, KC_U, KC_I, KC_O, KC_P, DE_UE,
  146. // KC_H, KC_J, KC_K, KC_L, DE_OE, LT(MDIA,DE_AE),
  147. // MEH_T(KC_NO),KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(DE_MINS), KC_RSFT,
  148. // KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_FN1,
  149. // KC_LALT,CTL_T(KC_ESC),
  150. // KC_PGUP,
  151. // KC_PGDN,KC_TAB, KC_ENT
  152. // ),
  153. /* Keymap 1: Symbol Layer
  154. *
  155. * ,--------------------------------------------------. ,--------------------------------------------------.
  156. * | | | | | | | | | | | | | | | |
  157. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  158. * | | @ | | [ | ] | # | | | | * | \ | / | ` | ´ | |
  159. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  160. * | | & | | | ( | ) | $ |------| |------| + | ! | ? | " | ' | |
  161. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  162. * | | ~ | ^ | { | } | % | | | | = | < | > | § | ° | |
  163. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  164. * | | | | | | | | | | | |
  165. * `----------------------------------' `----------------------------------'
  166. * ,-------------. ,-------------.
  167. * | | | | | |
  168. * ,------|------|------| |------+------+------.
  169. * | | | | | | | |
  170. * | | |------| |------| | |
  171. * | | | | | | | |
  172. * `--------------------' `--------------------'
  173. */
  174. // SYMBOLS
  175. [_LOWER] = LAYOUT_ergodox(
  176. // left hand
  177. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  178. KC_TRNS, DE_AT, DE_EURO, DE_LBRC, DE_RBRC, DE_HASH, KC_TRNS,
  179. KC_TRNS, DE_AMPR, DE_PIPE, DE_LPRN, DE_RPRN, DE_DLR,
  180. KC_TRNS, DE_TILD, DE_CIRC, DE_LCBR, DE_RCBR, DE_PERC, KC_TRNS,
  181. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  182. KC_TRNS,KC_TRNS,
  183. KC_TRNS,
  184. KC_TRNS,KC_TRNS,KC_TRNS,
  185. // right hand
  186. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  187. KC_TRNS, DE_ASTR, DE_BSLS, DE_SLSH, DE_GRV, DE_ACUT, KC_TRNS,
  188. DE_PLUS, DE_EXLM, DE_QST, DE_DQOT, DE_QUOT, KC_TRNS,
  189. KC_TRNS, DE_EQL, DE_LESS, DE_MORE, DE_PARA, DE_RING, KC_TRNS,
  190. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  191. KC_TRNS, KC_TRNS,
  192. KC_TRNS,
  193. KC_TRNS, KC_TRNS, KC_TRNS
  194. ),
  195. /* Keymap 2: Media and mouse keys
  196. *
  197. * ,--------------------------------------------------. ,--------------------------------------------------.
  198. * | | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
  199. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  200. * | | | Lclk | MsUp | Rclk | | | | | |VolDwn| Mute |VolUp | | |
  201. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  202. * | | Btn4 |MsLeft|MsDown|MsRght| Btn5 |------| |------| | Prev | Stop | Play | Next | |
  203. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  204. * | |WhRght|WhDown| WhUp |WhLeft|WhClk | | | |BwSrch|BwBack|BwHome|BwRefr|BwFwd | |
  205. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  206. * | | |MsAcl0|MsAcl1|MsAcl2| | | | | | |
  207. * `----------------------------------' `----------------------------------'
  208. * ,-------------. ,-------------.
  209. * | | | | | |
  210. * ,------|------|------| |------+------+------.
  211. * | | | | | |Brwser|Brwser|
  212. * | Lclk | Rclk |------| |------|Back |Forwd |
  213. * | | | | | | | |
  214. * `--------------------' `--------------------'
  215. */
  216. // MOUSE AND NUMBERS
  217. [_RAISE] = LAYOUT_ergodox(
  218. KC_TRNS, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F11,
  219. KC_TRNS, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO , KC_TRNS,
  220. KC_TRNS, KC_BTN4, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN5,
  221. KC_TRNS, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_BTN3, KC_TRNS,
  222. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  223. KC_TRNS, KC_TRNS,
  224. KC_TRNS,
  225. KC_BTN1, KC_BTN2, KC_TRNS,
  226. // right hand
  227. KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NLCK,
  228. KC_TRNS, KC_PCMM, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PAST,
  229. KC_PDOT, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PSLS,
  230. KC_TRNS, KC_P0, KC_P1, KC_P2, KC_P3, KC_PENT, KC_PEQL,
  231. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  232. KC_TRNS, KC_TRNS,
  233. KC_TRNS,
  234. KC_TRNS, KC_TRNS, KC_TRNS
  235. ),
  236. // MEDIA AND KEYBOARD
  237. [_NUMS] = LAYOUT_ergodox(
  238. // left hand
  239. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
  240. KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET,
  241. KC_TRNS,KC_1, KC_2, KC_3, KC_4, KC_5,
  242. KC_TRNS,DIS_SDEC, DIS_SINC, KC_NO, KC_NO, KC_NO, DEBUG,
  243. KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  244. KC_NO, KC_NO,
  245. KC_NO,
  246. KC_NO, KC_NO, KC_NO,
  247. // right hand
  248. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,
  249. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
  250. KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
  251. KC_TRNS, KC_WSCH, KC_WBAK, KC_WHOM, KC_WREF, KC_WFWD, KC_NO,
  252. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  253. KC_TRNS, KC_TRNS,
  254. KC_TRNS,
  255. KC_TRNS, KC_WBAK, KC_WFWD
  256. ),
  257. };
  258. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  259. switch(keycode) {
  260. case LOWER:
  261. if (record->event.pressed) {
  262. layer_on(_LOWER);
  263. update_tri_layer(_LOWER, _RAISE, _NUMS);
  264. } else {
  265. layer_off(_LOWER);
  266. update_tri_layer(_LOWER, _RAISE, _NUMS);
  267. }
  268. return false;
  269. break;
  270. case RAISE:
  271. if (record->event.pressed) {
  272. layer_on(_RAISE);
  273. update_tri_layer(_LOWER, _RAISE, _NUMS);
  274. } else {
  275. layer_off(_RAISE);
  276. update_tri_layer(_LOWER, _RAISE, _NUMS);
  277. }
  278. return false;
  279. break;
  280. case CK_CUT:
  281. if (record->event.pressed) {
  282. SEND_STRING(SS_LCTRL("x"));
  283. }
  284. return false; break;
  285. case CK_COPY:
  286. if (record->event.pressed) {
  287. SEND_STRING(SS_LCTRL("c"));
  288. }
  289. return false; break;
  290. case CK_PASTE:
  291. if (record->event.pressed) {
  292. SEND_STRING(SS_LCTRL("v"));
  293. }
  294. return false; break;
  295. case DIS_TOG:
  296. _enable = !_enable;
  297. return false; break;
  298. case DIS_COL:
  299. _hue = _hue - _STEP;
  300. return false; break;
  301. case DIS_IDEC:
  302. _intensity = _intensity - _STEP < 0 ? 0 : _intensity - _STEP;
  303. return false; break;
  304. case DIS_IINC:
  305. _intensity = _intensity + _STEP > 255 ? 255 : _intensity + _STEP;
  306. return false; break;
  307. case DIS_SDEC:
  308. _saturation = _saturation - _STEP < 0 ? 0 : _saturation - _STEP;
  309. return false; break;
  310. case DIS_SINC:
  311. _saturation = _saturation + _STEP > 255 ? 255 : _saturation + _STEP;
  312. return false; break;
  313. }
  314. return true;
  315. };
  316. // Runs just one time when the keyboard initializes.
  317. void matrix_init_user(void) {
  318. };
  319. // Runs constantly in the background, in a loop.
  320. void matrix_scan_user(void) {
  321. uint8_t layer = biton32(layer_state);
  322. switch (layer) {
  323. case SYMB:
  324. //ergodox_right_led_1_on();
  325. break;
  326. case MOUS:
  327. //ergodox_right_led_2_on();
  328. break;
  329. case MDIA:
  330. //ergodox_right_led_3_on();
  331. break;
  332. default:
  333. if(_enable) {
  334. //lcd_backlight_color(_hue, _saturation, _intensity);
  335. //ergodox_right_led_2_set(200);
  336. }
  337. break;
  338. }
  339. };