keymap.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /* Copyright 2021 @daliusd
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. #include "flow.h"
  18. // Each layer gets a name for readability, which is then used in the keymap matrix below.
  19. // The underscores don't mean anything - you can have a layer called STUFF or any other name.
  20. // Layer names don't all need to be of the same length, obviously, and you can also skip them
  21. // entirely and just use numbers.
  22. enum layers {
  23. _QWERTY,
  24. _SYM,
  25. _NAV,
  26. _MISC,
  27. _TMUX,
  28. _MOUSE,
  29. _FUNC,
  30. _LT_MAC,
  31. _LT_LINUX,
  32. };
  33. enum custom_keycodes {
  34. TM_NEXT = SAFE_RANGE,
  35. TM_PREV,
  36. TM_LEFT,
  37. TM_RIGHT,
  38. TM_NEW,
  39. TM_SLCT,
  40. TM_SRCH,
  41. TM_URL,
  42. OS_MISC,
  43. OS_TMUX,
  44. OS_FUNC,
  45. LT_OSLNX,
  46. };
  47. // Shortcut to make keymap more readable
  48. #define L_NAV MO(_NAV)
  49. #define L_SYM MO(_SYM)
  50. #define L_MOUSE MO(_MOUSE)
  51. #define K_PRINT (QK_LCTL | QK_LSFT | QK_LGUI | KC_4)
  52. #define K_VIDEO (QK_LSFT | QK_LGUI | KC_5)
  53. // flow_config should correspond to following format:
  54. // * layer keycode
  55. // * modifier keycode
  56. const uint16_t flow_config[FLOW_COUNT][2] = {
  57. {L_NAV, KC_LALT},
  58. {L_NAV, KC_LGUI},
  59. {L_NAV, KC_LCTL},
  60. {L_SYM, KC_RCTL},
  61. {L_SYM, KC_RGUI},
  62. {L_SYM, KC_RALT},
  63. };
  64. const uint16_t flow_layers_config[FLOW_LAYERS_COUNT][2] = {
  65. {OS_MISC, _MISC},
  66. {OS_TMUX, _TMUX},
  67. {OS_FUNC, _FUNC},
  68. };
  69. // Unicode characters
  70. enum unicode_names {
  71. SNEK,
  72. EURO,
  73. LT_S_A,
  74. LT_L_A,
  75. LT_S_C,
  76. LT_L_C,
  77. LT_S_E1,
  78. LT_L_E1,
  79. LT_S_E2,
  80. LT_L_E2,
  81. LT_S_I,
  82. LT_L_I,
  83. LT_S_S,
  84. LT_L_S,
  85. LT_S_U1,
  86. LT_L_U1,
  87. LT_S_U2,
  88. LT_L_U2,
  89. LT_S_Z,
  90. LT_L_Z,
  91. LT_OB,
  92. LT_CB,
  93. };
  94. const uint32_t unicode_map[] PROGMEM = {
  95. [SNEK] = 0x1F40D, // 🐍
  96. [EURO] = 0x20ac, // €
  97. [LT_S_A] = 0x105, // ą
  98. [LT_L_A] = 0x104, // Ą
  99. [LT_S_C] = 0x10d, // č
  100. [LT_L_C] = 0x10c, // Č
  101. [LT_S_E1] = 0x119, // ę
  102. [LT_L_E1] = 0x118, // Ę
  103. [LT_S_E2] = 0x117, // ė
  104. [LT_L_E2] = 0x116, // Ė
  105. [LT_S_I] = 0x12f, // į
  106. [LT_L_I] = 0x12e, // Į
  107. [LT_S_S] = 0x161, // š
  108. [LT_L_S] = 0x160, // Š
  109. [LT_S_U1] = 0x173, // ų
  110. [LT_L_U1] = 0x172, // Ų
  111. [LT_S_U2] = 0x16b, // ū
  112. [LT_L_U2] = 0x16a, // Ū
  113. [LT_S_Z] = 0x17e, // ž
  114. [LT_L_Z] = 0x17d, // Ž
  115. [LT_OB] = 0x201e, // „
  116. [LT_CB] = 0x201c, // “
  117. };
  118. #define K_SNEK X(SNEK)
  119. #define K_EURO X(EURO)
  120. #define K_LT_A XP(LT_S_A, LT_L_A)
  121. #define K_LT_AU X(LT_L_A)
  122. #define K_LT_C XP(LT_S_C, LT_L_C)
  123. #define K_LT_CU X(LT_L_C)
  124. #define K_LT_E1 XP(LT_S_E1, LT_L_E1)
  125. #define K_LT_E1U X(LT_L_E1)
  126. #define K_LT_E2 XP(LT_S_E2, LT_L_E2)
  127. #define K_LT_E2U X(LT_L_E2)
  128. #define K_LT_I XP(LT_S_I, LT_L_I)
  129. #define K_LT_IU X(LT_L_I)
  130. #define K_LT_S XP(LT_S_S, LT_L_S)
  131. #define K_LT_SU X(LT_L_S)
  132. #define K_LT_U1 XP(LT_S_U1, LT_L_U1)
  133. #define K_LT_U1U X(LT_L_U1)
  134. #define K_LT_U2 XP(LT_S_U2, LT_L_U2)
  135. #define K_LT_U2U X(LT_L_U2)
  136. #define K_LT_Z XP(LT_S_Z, LT_L_Z)
  137. #define K_LT_ZU X(LT_L_Z)
  138. #define K_LT_OB X(LT_OB)
  139. #define K_LT_CB X(LT_CB)
  140. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  141. [_QWERTY] = LAYOUT(
  142. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  143. KC_Q ,KC_W ,KC_E ,KC_R ,KC_T, KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,
  144. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  145. KC_A ,KC_S ,KC_D ,KC_F ,KC_G , KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,
  146. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  147. KC_Z ,KC_X ,KC_C ,KC_V ,KC_B , KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH,
  148. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  149. L_NAV , KC_SPC , KC_LSFT , L_SYM
  150. // └────────┘ └────────┘ └────────┘ └────────┘
  151. ),
  152. [_SYM] = LAYOUT(
  153. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  154. KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC , KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_LPRN ,KC_RPRN ,
  155. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  156. XXXXXXX ,KC_GRV ,KC_LBRC ,KC_RBRC ,KC_PLUS , KC_MINS ,KC_PIPE ,KC_RCTL ,KC_RGUI ,KC_RALT ,
  157. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  158. KC_DEL ,KC_BSPC ,KC_LCBR ,KC_RCBR ,KC_EQL , KC_UNDS ,KC_QUOT ,KC_DQT ,OS_MISC ,KC_BSLS ,
  159. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  160. _______ , _______ , _______ , XXXXXXX
  161. // └────────┘ └────────┘ └────────┘ └────────┘
  162. ),
  163. [_NAV] = LAYOUT(
  164. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  165. KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,
  166. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  167. KC_LALT ,KC_LGUI ,KC_LCTL ,KC_TAB ,KC_ENT , KC_LEFT ,KC_DOWN ,KC_UP ,KC_RIGHT,KC_PGUP ,
  168. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  169. KC_LSFT ,KC_BSPC ,KC_ESC ,KC_TILDE,OS_TMUX , OS_FUNC ,L_MOUSE ,KC_COMM ,KC_DOT ,KC_PGDN ,
  170. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  171. XXXXXXX , _______ , _______ , _______
  172. // └────────┘ └────────┘ └────────┘ └────────┘
  173. ),
  174. [_MISC] = LAYOUT(
  175. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  176. QK_BOOT ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_BRID ,KC_BRIU ,KC_PSCR ,XXXXXXX ,K_PRINT ,
  177. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  178. XXXXXXX ,XXXXXXX ,DB_TOGG ,LT_OSLNX,XXXXXXX , KC_MPRV ,KC_MPLY ,KC_MNXT ,XXXXXXX ,K_VIDEO ,
  179. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  180. XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_VOLD ,KC_VOLU ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  181. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  182. XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
  183. // └────────┘ └────────┘ └────────┘ └────────┘
  184. ),
  185. [_TMUX] = LAYOUT(
  186. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  187. XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,TM_URL ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  188. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  189. XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , TM_LEFT ,TM_NEXT ,TM_PREV ,TM_RIGHT,XXXXXXX ,
  190. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  191. XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , TM_NEW ,TM_SLCT ,XXXXXXX ,XXXXXXX ,TM_SRCH ,
  192. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  193. XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
  194. // └────────┘ └────────┘ └────────┘ └────────┘
  195. ),
  196. [_MOUSE] = LAYOUT(
  197. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  198. XXXXXXX ,XXXXXXX ,KC_MS_U ,KC_BTN3 ,KC_WH_U , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  199. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  200. XXXXXXX ,KC_MS_L ,KC_MS_D ,KC_MS_R ,KC_WH_D , XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
  201. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  202. XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  203. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  204. KC_BTN1 , KC_BTN2 , _______ , XXXXXXX
  205. // └────────┘ └────────┘ └────────┘ └────────┘
  206. ),
  207. [_FUNC] = LAYOUT(
  208. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  209. KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  210. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  211. KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 , XXXXXXX ,XXXXXXX ,KC_RCTL ,KC_RGUI ,KC_RALT ,
  212. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  213. KC_F11 ,KC_F12 ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  214. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  215. XXXXXXX , XXXXXXX , XXXXXXX , XXXXXXX
  216. // └────────┘ └────────┘ └────────┘ └────────┘
  217. ),
  218. [_LT_MAC] = LAYOUT(
  219. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  220. KC_EXLM ,KC_AT ,KC_HASH ,KC_DLR ,KC_PERC , KC_CIRC ,KC_AMPR ,KC_ASTR ,KC_PLUS ,XXXXXXX ,
  221. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  222. KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 , KC_6 ,KC_7 ,KC_8 ,KC_EQL ,XXXXXXX ,
  223. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  224. XXXXXXX ,KC_BSPC ,XXXXXXX ,XXXXXXX ,XXXXXXX , XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  225. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  226. XXXXXXX , XXXXXXX , _______ , XXXXXXX
  227. // └────────┘ └────────┘ └────────┘ └────────┘
  228. ),
  229. [_LT_LINUX] = LAYOUT(
  230. //┌────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┐
  231. K_LT_AU ,K_LT_CU ,K_LT_E1U,K_LT_E2U,K_LT_IU , K_LT_SU ,K_LT_U1U,K_LT_U2U,K_LT_ZU ,XXXXXXX ,
  232. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  233. K_LT_A ,K_LT_C ,K_LT_E1 ,K_LT_E2 ,K_LT_I , K_LT_S ,K_LT_U1 ,K_LT_U2 ,K_LT_Z ,XXXXXXX ,
  234. //├────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┤
  235. XXXXXXX ,KC_BSPC ,XXXXXXX ,K_SNEK ,K_LT_OB , K_LT_CB ,K_EURO ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
  236. //└────────┴────────┴────────┴────┬───┴────┬───┼────────┐ ┌────────┼───┬────┴───┬────┴────────┴────────┴────────┘
  237. XXXXXXX , XXXXXXX , _______ , XXXXXXX
  238. // └────────┘ └────────┘ └────────┘ └────────┘
  239. ),
  240. };
  241. #define TMUX_PREFIX SS_DOWN(X_LCTL) "b" SS_UP(X_LCTL)
  242. bool lt_os_is_linux = false;
  243. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  244. if (!update_flow(keycode, record->event.pressed, record->event.key)) return false;
  245. switch (keycode) {
  246. case TM_LEFT:
  247. if (!record->event.pressed) return true;
  248. SEND_STRING(TMUX_PREFIX "<");
  249. return false;
  250. case TM_RIGHT:
  251. if (!record->event.pressed) return true;
  252. SEND_STRING(TMUX_PREFIX ">");
  253. return false;
  254. case TM_NEXT:
  255. if (!record->event.pressed) return true;
  256. SEND_STRING(TMUX_PREFIX "n");
  257. return false;
  258. case TM_PREV:
  259. if (!record->event.pressed) return true;
  260. SEND_STRING(TMUX_PREFIX "p");
  261. return false;
  262. case TM_NEW:
  263. if (!record->event.pressed) return true;
  264. SEND_STRING(TMUX_PREFIX "c");
  265. return false;
  266. case TM_SLCT:
  267. if (!record->event.pressed) return true;
  268. SEND_STRING(TMUX_PREFIX "[");
  269. return false;
  270. case TM_SRCH:
  271. if (!record->event.pressed) return true;
  272. SEND_STRING(TMUX_PREFIX "\t");
  273. return false;
  274. case TM_URL:
  275. if (!record->event.pressed) return true;
  276. SEND_STRING(TMUX_PREFIX SS_LCTL("u"));
  277. return false;
  278. case LT_OSLNX:
  279. if (!record->event.pressed) return true;
  280. lt_os_is_linux = !lt_os_is_linux;
  281. return false;
  282. }
  283. return true;
  284. }
  285. void matrix_scan_user(void) {
  286. flow_matrix_scan();
  287. }
  288. bool lang_layer_on = false;
  289. layer_state_t layer_state_set_user(layer_state_t state) {
  290. state = update_tri_layer_state(state, _SYM, _NAV, lt_os_is_linux ? _LT_LINUX : _LT_MAC);
  291. uint8_t hl = get_highest_layer(state);
  292. if (hl == _LT_MAC) {
  293. if (!lang_layer_on) {
  294. tap_code16(LCTL(KC_SPC));
  295. lang_layer_on = true;
  296. }
  297. } else {
  298. if (lang_layer_on) {
  299. tap_code16(LCTL(KC_SPC));
  300. lang_layer_on = false;
  301. }
  302. }
  303. return state;
  304. }