keymap.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. #include QMK_KEYBOARD_H
  2. #include "debug.h"
  3. #include "action_layer.h"
  4. #include "version.h"
  5. #include "keymap_french.h"
  6. #define BASE 0 // default Colemak Mod-DH layer
  7. #define SYMB 1 // symbols
  8. #define MDIA 2 // media keys
  9. #define ACC 3 // accented characters
  10. #define QCOPY 0 // Qubes OS VM to VM copy
  11. #define QPASTE 1 // Qubes OS VM to VM paste
  12. #define M_ACIRC 2 // â
  13. #define M_ECIRC 3 // ê
  14. #define M_ICIRC 4 // î
  15. #define M_OCIRC 5 // ô
  16. #define M_UCIRC 6 // û
  17. #define M_YCIRC 7 // ŷ
  18. #define M_AUMLT 8 // ä
  19. #define M_EUMLT 9 // ë
  20. #define M_IUMLT 10 // ï
  21. #define M_OUMLT 11 // ö
  22. #define M_UUMLT 12 // ü
  23. #define M_YUMLT 13 // ÿ
  24. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  25. /* Keymap 0: Base Colemak Mod-DH layer
  26. *
  27. * ,--------------------------------------------------. ,--------------------------------------------------.
  28. * | Esc | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | |
  29. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  30. * | | Q | W | F | P | B | TO(0)| |TO(2) | J | L | U | Y | ; | |
  31. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  32. * | Tab | A | R | S | T | G |------| |------| M | N | E | I | O | Bcksp |
  33. * |--------+------+------+------+------+------| TO(1)| |OSL(3)|------+------+------+------+------+--------|
  34. * | LShift | Z | X | C | D | V | | | | K | H | , | . | : | Rshift |
  35. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  36. * | Ins | Caps | Left | Right| MO(2)| | MO(2)| Down | Up | PgDn | PgUp |
  37. * `----------------------------------' `----------------------------------'
  38. * ,-------------. ,-------------.
  39. * |QCopy | Ralt | | Ralt |QPaste|
  40. * ,------|------|------| |------+------+------.
  41. * | | | Home | | End | | |
  42. * | Space| Ctrl |------| |------| Ctrl |Enter |
  43. * | | | LAlt | | LAlt | | |
  44. * `--------------------' `--------------------'
  45. */
  46. // If it accepts an argument (i.e, is a function), it doesn't need KC_.
  47. // Otherwise, it needs KC_*
  48. [BASE] = LAYOUT_ergodox( // layer 0 : default
  49. // left hand
  50. KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS,
  51. KC_TRNS, FR_Q, FR_W, KC_F, KC_P, KC_B, TO(BASE),
  52. KC_TAB, FR_A, KC_R, KC_S, KC_T, KC_G,
  53. KC_LSFT, FR_Z, KC_X, KC_C, KC_D, KC_V, TO(SYMB),
  54. KC_INS, KC_CAPS, KC_LEFT,KC_RIGHT, MO(SYMB),
  55. M(QCOPY), KC_RALT,
  56. KC_HOME,
  57. KC_SPC,KC_LCTRL, KC_LALT,
  58. // right hand
  59. KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
  60. TO(MDIA), KC_J, KC_L, KC_U, KC_Y, FR_SCLN, KC_TRNS,
  61. FR_M, KC_N, KC_E, KC_I, KC_O, KC_BSPC,
  62. OSL(ACC), KC_K, KC_H, FR_COMM, FR_DOT, FR_COLN, KC_RSFT,
  63. MO(SYMB), KC_DOWN, KC_UP, KC_PGDN, KC_PGUP,
  64. KC_RALT, M(QPASTE),
  65. KC_END,
  66. KC_LALT,KC_RCTL, KC_ENT
  67. ),
  68. /* Keymap 1: Symbol Layer
  69. * // TODO missing: ¤
  70. * ,--------------------------------------------------. ,--------------------------------------------------.
  71. * |Version | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F11 |
  72. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  73. * | | § | < | { | \ | ~ | | | | % | @ | } | > | µ | F12 |
  74. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  75. * | | ' | = | - | ( | + |------| |------| * | ) | _ | / | " | |
  76. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  77. * | | ` | ? | # | [ | | | | | | & | ] | $ | ! | ^ | |
  78. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  79. * | € | £ | $ | | | | | | | ß | |
  80. * `----------------------------------' `----------------------------------'
  81. * ,-------------. ,-------------.
  82. * | | | | | |
  83. * ,------|------|------| |------+------+------.
  84. * | | | | | | | |
  85. * | | |------| |------| | |
  86. * | | | | | | | |
  87. * `--------------------' `--------------------'
  88. */
  89. // SYMBOLS
  90. [SYMB] = LAYOUT_ergodox(
  91. // left hand
  92. M(0), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
  93. KC_TRNS,FR_SECT,FR_LESS, FR_LCBR,FR_BSLS,FR_TILD,KC_TRNS,
  94. KC_TRNS,FR_APOS,FR_EQL, FR_MINS,FR_LPRN,FR_PLUS,
  95. KC_TRNS,FR_GRV,FR_QUES,FR_HASH,FR_LBRC,FR_PIPE,KC_TRNS,
  96. FR_EURO,FR_PND,FR_DLR,KC_TRNS,KC_TRNS,
  97. KC_TRNS,KC_TRNS,
  98. KC_TRNS,
  99. KC_TRNS,KC_TRNS,KC_TRNS,
  100. // right hand
  101. KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
  102. KC_TRNS, FR_PERC, FR_AT, FR_RCBR, FR_GRTR, FR_MU, KC_F12,
  103. FR_ASTR, FR_RPRN, FR_UNDS, FR_SLSH, FR_QUOT, KC_TRNS,
  104. KC_TRNS, FR_AMP, FR_RBRC, FR_DLR, FR_EXLM, FR_CIRC, KC_TRNS,
  105. KC_TRNS, KC_TRNS, KC_TRNS, ALGR(KC_S), KC_TRNS,
  106. KC_TRNS, KC_TRNS,
  107. KC_TRNS,
  108. KC_TRNS, KC_TRNS, KC_TRNS
  109. ),
  110. /* Keymap 2: Media and mouse keys
  111. *
  112. * ,--------------------------------------------------. ,--------------------------------------------------.
  113. * | | | | | | | | | | | | | | | |
  114. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  115. * | | | | MsUp | | | | | | | | | | | |
  116. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  117. * | | |MsLeft|MsDown|MsRght| |------| |------| | Lclk | Rclk | | | Play |
  118. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  119. * | | | | | | | | | | | | Prev | Next | | |
  120. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  121. * | | | | Lclk | Rclk | |VolUp |VolDn | Mute | | |
  122. * `----------------------------------' `----------------------------------'
  123. * ,-------------. ,-------------.
  124. * | | | | | |
  125. * ,------|------|------| |------+------+------.
  126. * | | | | | | |Brwser|
  127. * | | |------| |------| |Back |
  128. * | | | | | | | |
  129. * `--------------------' `--------------------'
  130. */
  131. // MEDIA AND MOUSE
  132. [MDIA] = LAYOUT_ergodox(
  133. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  134. KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
  135. KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
  136. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  137. KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
  138. KC_TRNS, KC_TRNS,
  139. KC_TRNS,
  140. KC_TRNS, KC_TRNS, KC_TRNS,
  141. // right hand
  142. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  143. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  144. KC_TRNS, KC_BTN1, KC_BTN2, KC_TRNS, KC_TRNS, KC_MPLY,
  145. KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
  146. KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
  147. KC_TRNS, KC_TRNS,
  148. KC_TRNS,
  149. KC_TRNS, KC_TRNS, KC_WBAK
  150. ),
  151. /* Keymap 3: accented characters
  152. *
  153. * ,--------------------------------------------------. ,--------------------------------------------------.
  154. * | | | | | | | | | | | | | | | |
  155. * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
  156. * | | | à | â | ä | | | | | | | î | ï | | |
  157. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  158. * | | é | è | ê | ë | |------| |------| | | ô | ö | | |
  159. * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
  160. * | | | ù | û | ü | | | | | | | ŷ | ÿ | | |
  161. * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
  162. * | | | | | | | | | | | |
  163. * `----------------------------------' `----------------------------------'
  164. * ,-------------. ,-------------.
  165. * | | | | | |
  166. * ,------|------|------| |------+------+------.
  167. * | | | | | | | |
  168. * | | |------| |------| | |
  169. * | | | | | | | |
  170. * `--------------------' `--------------------'
  171. */
  172. // ACCENTED CHARACTERS
  173. [ACC] = LAYOUT_ergodox(
  174. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  175. KC_TRNS, KC_TRNS, FR_AGRV, M(M_ACIRC), M(M_AUMLT), KC_TRNS, KC_TRNS,
  176. KC_TRNS, FR_EACU, FR_EGRV, M(M_ECIRC), M(M_EUMLT), KC_TRNS,
  177. KC_TRNS, KC_TRNS, FR_UGRV, M(M_UCIRC), M(M_UUMLT), KC_TRNS, KC_TRNS,
  178. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  179. KC_TRNS, KC_TRNS,
  180. KC_TRNS,
  181. KC_TRNS, KC_TRNS, KC_TRNS,
  182. // right hand
  183. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  184. KC_TRNS, KC_TRNS, KC_TRNS, M(M_ICIRC), M(M_IUMLT), KC_TRNS, KC_TRNS,
  185. KC_TRNS, KC_TRNS, M(M_OCIRC), M(M_OUMLT), KC_TRNS, KC_TRNS,
  186. KC_TRNS, KC_TRNS, KC_TRNS, M(M_YCIRC), M(M_YUMLT), KC_TRNS, KC_TRNS,
  187. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  188. KC_TRNS, KC_TRNS,
  189. KC_TRNS,
  190. KC_TRNS, KC_TRNS, KC_TRNS
  191. ),
  192. };
  193. const uint16_t PROGMEM fn_actions[] = {
  194. [1] = ACTION_LAYER_TAP_TOGGLE(SYMB) // FN1 - Momentary Layer 1 (Symbols)
  195. };
  196. const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
  197. {
  198. // MACRODOWN only works in this function
  199. switch(id) {
  200. case QCOPY:
  201. if (record->event.pressed) {
  202. return MACRO(I(255),
  203. D(LCTRL),
  204. T(C),
  205. D(LSFT),
  206. T(C),
  207. U(LCTRL),
  208. U(LSFT),
  209. END);
  210. }
  211. break;
  212. case QPASTE:
  213. if (record->event.pressed) {
  214. return MACRO(I(255),
  215. D(LCTRL),
  216. D(LSFT),
  217. T(V),
  218. U(LCTRL),
  219. T(INS),
  220. U(LSFT),
  221. END);
  222. }
  223. break;
  224. case M_ACIRC:
  225. if (record->event.pressed) {
  226. return MACRO(T(LBRC), // FR_CIRC
  227. T(Q), // FR_A
  228. END);
  229. }
  230. break;
  231. case M_ECIRC:
  232. if (record->event.pressed) {
  233. return MACRO(T(LBRC), // FR_CIRC
  234. T(E),
  235. END);
  236. }
  237. break;
  238. case M_UCIRC:
  239. if (record->event.pressed) {
  240. return MACRO(T(LBRC), // FR_CIRC
  241. T(U),
  242. END);
  243. }
  244. break;
  245. case M_ICIRC:
  246. if (record->event.pressed) {
  247. return MACRO(T(LBRC), // FR_CIRC
  248. T(I),
  249. END);
  250. }
  251. break;
  252. case M_OCIRC:
  253. if (record->event.pressed) {
  254. return MACRO(T(LBRC), // FR_CIRC
  255. T(O),
  256. END);
  257. }
  258. break;
  259. case M_YCIRC:
  260. if (record->event.pressed) {
  261. return MACRO(T(LBRC), // FR_CIRC
  262. T(Y),
  263. END);
  264. }
  265. break;
  266. case M_AUMLT:
  267. if (record->event.pressed) {
  268. return MACRO(D(LSFT),
  269. T(LBRC),
  270. U(LSFT),
  271. T(Q),
  272. END);
  273. }
  274. break;
  275. case M_EUMLT:
  276. if (record->event.pressed) {
  277. return MACRO(D(LSFT),
  278. T(LBRC),
  279. U(LSFT),
  280. T(E),
  281. END);
  282. }
  283. break;
  284. case M_UUMLT:
  285. if (record->event.pressed) {
  286. return MACRO(D(LSFT),
  287. T(LBRC),
  288. U(LSFT),
  289. T(U),
  290. END);
  291. }
  292. break;
  293. case M_IUMLT:
  294. if (record->event.pressed) {
  295. return MACRO(D(LSFT),
  296. T(LBRC),
  297. U(LSFT),
  298. T(I),
  299. END);
  300. }
  301. break;
  302. case M_OUMLT:
  303. if (record->event.pressed) {
  304. return MACRO(D(LSFT),
  305. T(LBRC),
  306. U(LSFT),
  307. T(O),
  308. END);
  309. }
  310. break;
  311. case M_YUMLT:
  312. if (record->event.pressed) {
  313. return MACRO(D(LSFT),
  314. T(LBRC),
  315. U(LSFT),
  316. T(Y),
  317. END);
  318. }
  319. break;
  320. }
  321. return MACRO_NONE;
  322. };
  323. // Runs just one time when the keyboard initializes.
  324. void matrix_init_user(void) {
  325. };
  326. // Runs constantly in the background, in a loop.
  327. void matrix_scan_user(void) {
  328. uint8_t layer = biton32(layer_state);
  329. ergodox_board_led_off();
  330. ergodox_right_led_1_off();
  331. ergodox_right_led_2_off();
  332. ergodox_right_led_3_off();
  333. switch (layer) {
  334. case SYMB:
  335. ergodox_right_led_1_on();
  336. break;
  337. case MDIA:
  338. ergodox_right_led_2_on();
  339. break;
  340. case ACC:
  341. ergodox_right_led_3_on();
  342. break;
  343. default:
  344. // none
  345. break;
  346. }
  347. };