logo

qmk_firmware

custom branch of QMK firmware git clone https://anongit.hacktivis.me/git/qmk_firmware.git

keymap.c (33759B)


  1. #include QMK_KEYBOARD_H
  2. enum {
  3. LAYER_NORM_BASE,
  4. LAYER_NORM_EXTENSION,
  5. LAYER_RACE_BASE,
  6. LAYER_RACE_EXTENSION,
  7. LAYER_LEGACY_BASE,
  8. LAYER_LEGACY_EXTENSION,
  9. LAYER_CONTROL,
  10. LAYER_WINDOW,
  11. LAYER_DESKTOP,
  12. NUMBER_OF_LAYERS,
  13. };
  14. bool temporary[NUMBER_OF_LAYERS] = {
  15. [LAYER_NORM_BASE] = false,
  16. [LAYER_NORM_EXTENSION] = true,
  17. [LAYER_RACE_BASE] = false,
  18. [LAYER_RACE_EXTENSION] = true,
  19. [LAYER_LEGACY_BASE] = false,
  20. [LAYER_LEGACY_EXTENSION] = true,
  21. [LAYER_CONTROL] = false,
  22. [LAYER_WINDOW] = true,
  23. [LAYER_DESKTOP] = false,
  24. };
  25. #define KEY_FORWARD_LAYER(a) SAFE_RANGE + a
  26. enum{
  27. DANCE_PGDN_BOTTOM,
  28. DANCE_PGUP_TOP,
  29. };
  30. tap_dance_action_t tap_dance_actions[] = {
  31. [DANCE_PGDN_BOTTOM] = ACTION_TAP_DANCE_DOUBLE(KC_PGDN, LGUI(KC_DOWN)),
  32. [DANCE_PGUP_TOP] = ACTION_TAP_DANCE_DOUBLE(KC_PGUP, LGUI(KC_UP)),
  33. };
  34. #define KEY_DANCE(a) TD(a)
  35. enum custom_keycodes {
  36. KEY_BACK_LAYER = SAFE_RANGE + NUMBER_OF_LAYERS,
  37. KEY_INSERT_LINE_START,
  38. KEY_INSERT_HERE,
  39. KEY_INSERT_LINE_END,
  40. KEY_CREATE_PREVIOUS_LINE,
  41. KEY_CREATE_NEXT_LINE,
  42. KEY_CUT_WORD,
  43. KEY_CUT_LINE,
  44. KEY_CUT_SELECTION,
  45. };
  46. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  47. [LAYER_NORM_BASE] = LAYOUT_default_splitspace(
  48. KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KEY_DANCE(DANCE_PGDN_BOTTOM), KEY_DANCE(DANCE_PGUP_TOP), KC_NO, KEY_CUT_LINE, KEY_FORWARD_LAYER(LAYER_RACE_BASE),
  49. KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LCBR, KC_RCBR, KC_BSLS, KEY_FORWARD_LAYER(LAYER_LEGACY_BASE),
  50. KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KEY_FORWARD_LAYER(LAYER_DESKTOP),
  51. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, LCTL(KC_LEFT),
  52. KC_LCTL, KC_LGUI, KC_LALT, KEY_FORWARD_LAYER(LAYER_NORM_EXTENSION), KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
  53. [LAYER_NORM_EXTENSION] = LAYOUT_default_splitspace(
  54. LGUI(LSFT(KC_4)), KC_NO, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, LCTL(KC_C), KEY_FORWARD_LAYER(LAYER_RACE_BASE),
  55. KEY_FORWARD_LAYER(LAYER_WINDOW), LGUI(KC_SPC), LCTL(KC_SPC), KC_ESC, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KEY_CREATE_PREVIOUS_LINE, KEY_FORWARD_LAYER(LAYER_LEGACY_BASE),
  56. KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_DQUO, KEY_CREATE_NEXT_LINE, KEY_FORWARD_LAYER(LAYER_DESKTOP),
  57. KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, LCTL(KC_LEFT),
  58. KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, QK_BOOT, LCTL(KC_RIGHT)),
  59. [LAYER_RACE_BASE] = LAYOUT_default_splitspace(
  60. KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER,
  61. KC_NO, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LCBR, KC_RCBR, KC_BSLS, KC_NO,
  62. KC_CAPS, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_NO,
  63. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, KC_NO,
  64. KC_NO, KC_NO, KC_NO, KEY_FORWARD_LAYER(LAYER_RACE_EXTENSION), KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  65. [LAYER_RACE_EXTENSION] = LAYOUT_default_splitspace(
  66. KC_NO, KC_1, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KEY_CUT_LINE, KEY_BACK_LAYER,
  67. KC_NO, KC_Q, KC_W, KC_F, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KC_BSLS, KC_NO,
  68. KEY_CUT_LINE, KC_A, KC_R, KC_BSPC, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_DQUO, KC_ENT, KC_NO,
  69. KC_LSFT, KC_Z, KC_X, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, KC_NO,
  70. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  71. [LAYER_LEGACY_BASE] = LAYOUT_default_splitspace(
  72. KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KEY_DANCE(DANCE_PGDN_BOTTOM), KEY_DANCE(DANCE_PGUP_TOP), KC_NO, KEY_CUT_LINE, KC_NO,
  73. KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, KC_BSLS, KEY_BACK_LAYER,
  74. KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KEY_FORWARD_LAYER(LAYER_DESKTOP),
  75. KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO, LCTL(KC_LEFT),
  76. KC_LCTL, KC_LGUI, KC_LALT, KEY_FORWARD_LAYER(LAYER_LEGACY_EXTENSION), KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
  77. [LAYER_LEGACY_EXTENSION] = LAYOUT_default_splitspace(
  78. LGUI(LSFT(KC_4)), KC_NO, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, LCTL(KC_C), KC_NO,
  79. KEY_FORWARD_LAYER(LAYER_WINDOW), LGUI(KC_SPC), LCTL(KC_SPC), KC_ESC, KC_TILD, KC_EXLM, KC_PEQL, KC_PLUS, KC_MINUS, KC_PIPE, KC_COLN, KC_LCBR, KC_RCBR, KEY_CREATE_PREVIOUS_LINE, KEY_BACK_LAYER,
  80. KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_DQUO, KEY_CREATE_NEXT_LINE, KEY_FORWARD_LAYER(LAYER_DESKTOP),
  81. KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, KC_LPRN, KC_RPRN, KC_UNDS, KC_LBRC, KC_RBRC, KC_LT, KC_GT, KC_QUES, KC_RSFT, KC_NO, LCTL(KC_LEFT),
  82. KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KEY_FORWARD_LAYER(LAYER_CONTROL), KC_SPC, KC_RALT, KC_RGUI, KC_NO, KC_NO, LCTL(KC_RIGHT)),
  83. [LAYER_CONTROL] = LAYOUT_default_splitspace(
  84. KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  85. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_INSERT_LINE_START, KEY_INSERT_HERE, KEY_INSERT_LINE_END, KC_NO, KC_NO, KC_NO, KEY_CREATE_PREVIOUS_LINE, KC_NO,
  86. KEY_CUT_WORD, LALT(KC_LEFT), LALT(KC_RIGHT), KC_BSPC, LGUI(KC_LEFT), LCTL(KC_E), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, LGUI(KC_V), KC_NO, KEY_CREATE_NEXT_LINE, KC_NO,
  87. KC_LSFT, LGUI(KC_Z), KEY_CUT_SELECTION, LGUI(KC_C), LGUI(KC_V), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT, KC_NO, KC_NO,
  88. KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  89. [LAYER_WINDOW] = LAYOUT_default_splitspace(
  90. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  91. KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  92. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO,
  93. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  94. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  95. [LAYER_DESKTOP] = LAYOUT_default_splitspace(
  96. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  97. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  98. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LCTL(KC_LEFT), KC_NO, KC_NO, LCTL(KC_RIGHT), KC_NO, KC_NO, KEY_BACK_LAYER, KEY_BACK_LAYER,
  99. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
  100. KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KEY_BACK_LAYER, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
  101. };
  102. int layers[16];
  103. struct {
  104. bool back;
  105. } common_layer_data;
  106. struct {
  107. int operator, multiplier;
  108. } layer_control_data;
  109. struct {
  110. int start_time;
  111. } layer_window_data;
  112. bool handle_layer_key(uint16_t key, keyrecord_t* record) {
  113. switch (layers[layers[0] + 1]) {
  114. case LAYER_CONTROL:
  115. switch (key) {
  116. case KC_0:
  117. if (record->event.pressed) {
  118. layer_control_data.multiplier = layer_control_data.multiplier * 10;
  119. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  120. }
  121. return false;
  122. case KC_1:
  123. if (record->event.pressed) {
  124. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 1;
  125. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  126. }
  127. return false;
  128. case KC_2:
  129. if (record->event.pressed) {
  130. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 2;
  131. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  132. }
  133. return false;
  134. case KC_3:
  135. if (record->event.pressed) {
  136. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 3;
  137. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  138. }
  139. return false;
  140. case KC_4:
  141. if (record->event.pressed) {
  142. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 4;
  143. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  144. }
  145. return false;
  146. case KC_5:
  147. if (record->event.pressed) {
  148. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 5;
  149. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  150. }
  151. return false;
  152. case KC_6:
  153. if (record->event.pressed) {
  154. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 6;
  155. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  156. }
  157. return false;
  158. case KC_7:
  159. if (record->event.pressed) {
  160. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 7;
  161. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  162. }
  163. return false;
  164. case KC_8:
  165. if (record->event.pressed) {
  166. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 8;
  167. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  168. }
  169. return false;
  170. case KC_9:
  171. if (record->event.pressed) {
  172. layer_control_data.multiplier = layer_control_data.multiplier * 10 + 9;
  173. if (layer_control_data.multiplier < 0) layer_control_data.multiplier = 0;
  174. }
  175. return false;
  176. case KEY_INSERT_LINE_START:
  177. if (record->event.pressed) common_layer_data.back = true;
  178. return true;
  179. case KEY_INSERT_HERE:
  180. if (record->event.pressed) common_layer_data.back = true;
  181. return true;
  182. case KEY_INSERT_LINE_END:
  183. if (record->event.pressed) common_layer_data.back = true;
  184. return true;
  185. case KEY_CREATE_PREVIOUS_LINE:
  186. if (record->event.pressed) common_layer_data.back = true;
  187. return true;
  188. case KEY_CUT_WORD:
  189. if (record->event.pressed) {
  190. if (layer_control_data.operator== - 1) {
  191. register_code(KC_LALT);
  192. tap_code(KC_LEFT);
  193. tap_code(KC_RIGHT);
  194. unregister_code(KC_LALT);
  195. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
  196. tap_code16(LGUI(KC_X));
  197. }
  198. layer_control_data.multiplier = 0;
  199. layer_control_data.operator = - 1;
  200. }
  201. return false;
  202. case LALT(KC_LEFT):
  203. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  204. if (record->event.pressed) {
  205. if (layer_control_data.operator== - 1)
  206. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LALT(KC_LEFT));
  207. else if (layer_control_data.operator== KC_BSPC) {
  208. register_code(KC_LALT);
  209. tap_code(KC_LEFT);
  210. tap_code(KC_RIGHT);
  211. unregister_code(KC_LALT);
  212. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
  213. tap_code16(LGUI(KC_X));
  214. } else if (layer_control_data.operator== LGUI(KC_C)) {
  215. register_code(KC_LALT);
  216. tap_code(KC_LEFT);
  217. tap_code(KC_RIGHT);
  218. unregister_code(KC_LALT);
  219. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_LEFT)));
  220. tap_code16(LGUI(KC_C));
  221. tap_code(KC_RIGHT);
  222. }
  223. layer_control_data.multiplier = 0;
  224. layer_control_data.operator = - 1;
  225. }
  226. return false;
  227. case LALT(KC_RIGHT):
  228. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  229. if (record->event.pressed) {
  230. if (layer_control_data.operator== - 1)
  231. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LALT(KC_RIGHT));
  232. else if (layer_control_data.operator== KC_BSPC) {
  233. register_code(KC_LALT);
  234. tap_code(KC_RIGHT);
  235. tap_code(KC_LEFT);
  236. unregister_code(KC_LALT);
  237. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_RIGHT)));
  238. tap_code16(LGUI(KC_X));
  239. } else if (layer_control_data.operator== LGUI(KC_C)) {
  240. register_code(KC_LALT);
  241. tap_code(KC_RIGHT);
  242. tap_code(KC_LEFT);
  243. unregister_code(KC_LALT);
  244. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(LALT(KC_RIGHT)));
  245. tap_code16(LGUI(KC_C));
  246. tap_code(KC_LEFT);
  247. }
  248. layer_control_data.multiplier = 0;
  249. layer_control_data.operator = - 1;
  250. }
  251. return false;
  252. case LGUI(KC_LEFT):
  253. if (record->event.pressed) {
  254. if (layer_control_data.operator== - 1)
  255. tap_code16(LGUI(KC_LEFT));
  256. else if (layer_control_data.operator== KC_BSPC) {
  257. tap_code16(LSFT(LGUI(KC_LEFT)));
  258. tap_code16(LGUI(KC_X));
  259. } else if (layer_control_data.operator== LGUI(KC_C)) {
  260. tap_code16(LSFT(LGUI(KC_LEFT)));
  261. tap_code16(LGUI(KC_C));
  262. tap_code(KC_RIGHT);
  263. }
  264. layer_control_data.multiplier = 0;
  265. layer_control_data.operator = - 1;
  266. }
  267. return false;
  268. case LCTL(KC_E):
  269. if (record->event.pressed) {
  270. if (layer_control_data.operator== - 1)
  271. tap_code16(LCTL(KC_E));
  272. else if (layer_control_data.operator== KC_BSPC) {
  273. tap_code16(LSFT(LCTL(KC_E)));
  274. tap_code16(LGUI(KC_X));
  275. } else if (layer_control_data.operator== LGUI(KC_C)) {
  276. tap_code16(LSFT(LCTL(KC_E)));
  277. tap_code16(LGUI(KC_C));
  278. tap_code(KC_LEFT);
  279. }
  280. layer_control_data.multiplier = 0;
  281. layer_control_data.operator = - 1;
  282. }
  283. return false;
  284. case KC_BSPC:
  285. if (record->event.pressed) {
  286. if (get_mods() & MOD_MASK_SHIFT) {
  287. unregister_code(KC_LSFT);
  288. tap_code16(LGUI(KC_X));
  289. register_code(KC_LSFT);
  290. layer_control_data.multiplier = 0;
  291. layer_control_data.operator = - 1;
  292. } else if (layer_control_data.operator== - 1)
  293. layer_control_data.operator= KC_BSPC;
  294. else {
  295. if (layer_control_data.operator== KC_BSPC) {
  296. tap_code16(LCTL(KC_A));
  297. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
  298. tap_code16(LGUI(KC_X));
  299. }
  300. layer_control_data.multiplier = 0;
  301. layer_control_data.operator = - 1;
  302. }
  303. }
  304. return false;
  305. case KC_LEFT:
  306. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  307. if (record->event.pressed) {
  308. if (layer_control_data.operator== - 1)
  309. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_LEFT);
  310. else if (layer_control_data.operator== KC_BSPC) {
  311. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_LEFT));
  312. tap_code16(LGUI(KC_X));
  313. } else if (layer_control_data.operator== LGUI(KC_C)) {
  314. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_LEFT));
  315. tap_code16(LGUI(KC_C));
  316. tap_code(KC_RIGHT);
  317. }
  318. layer_control_data.multiplier = 0;
  319. layer_control_data.operator = - 1;
  320. }
  321. return false;
  322. case KC_DOWN:
  323. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  324. if (record->event.pressed) {
  325. if (layer_control_data.operator== - 1)
  326. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_DOWN);
  327. else if (layer_control_data.operator== KC_BSPC) {
  328. tap_code16(LCTL(KC_A));
  329. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
  330. tap_code16(LGUI(KC_X));
  331. } else if (layer_control_data.operator== LGUI(KC_C)) {
  332. tap_code16(LCTL(KC_A));
  333. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
  334. tap_code16(LGUI(KC_C));
  335. tap_code(KC_LEFT);
  336. }
  337. layer_control_data.multiplier = 0;
  338. layer_control_data.operator = - 1;
  339. }
  340. return false;
  341. case KC_UP:
  342. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  343. if (record->event.pressed) {
  344. if (layer_control_data.operator== - 1)
  345. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_UP);
  346. else if (layer_control_data.operator== KC_BSPC) {
  347. tap_code16(LCTL(KC_E));
  348. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_UP));
  349. tap_code16(LSFT(LCTL(KC_E)));
  350. tap_code16(LGUI(KC_X));
  351. } else if (layer_control_data.operator== LGUI(KC_C)) {
  352. tap_code16(LCTL(KC_E));
  353. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_UP));
  354. tap_code16(LSFT(LCTL(KC_E)));
  355. tap_code16(LGUI(KC_C));
  356. tap_code(KC_RIGHT);
  357. }
  358. layer_control_data.multiplier = 0;
  359. layer_control_data.operator = - 1;
  360. }
  361. return false;
  362. case KC_RIGHT:
  363. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  364. if (record->event.pressed) {
  365. if (layer_control_data.operator== - 1)
  366. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code(KC_RIGHT);
  367. else if (layer_control_data.operator== KC_BSPC) {
  368. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_RIGHT));
  369. tap_code16(LGUI(KC_X));
  370. } else if (layer_control_data.operator== LGUI(KC_C)) {
  371. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_RIGHT));
  372. tap_code16(LGUI(KC_C));
  373. tap_code(KC_LEFT);
  374. }
  375. layer_control_data.multiplier = 0;
  376. layer_control_data.operator = - 1;
  377. }
  378. return false;
  379. case KEY_CREATE_NEXT_LINE:
  380. if (record->event.pressed) common_layer_data.back = true;
  381. return true;
  382. case LGUI(KC_Z):
  383. if (layer_control_data.operator== - 1 && layer_control_data.multiplier == 0) return true;
  384. if (record->event.pressed) {
  385. if (layer_control_data.operator== - 1)
  386. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_Z));
  387. layer_control_data.multiplier = 0;
  388. layer_control_data.operator = - 1;
  389. }
  390. return false;
  391. case LGUI(KC_C):
  392. if (record->event.pressed) {
  393. if (get_mods() & MOD_MASK_SHIFT) {
  394. unregister_code(KC_LSFT);
  395. tap_code16(LGUI(KC_C));
  396. register_code(KC_LSFT);
  397. layer_control_data.multiplier = 0;
  398. layer_control_data.operator = - 1;
  399. } else if (layer_control_data.operator== - 1)
  400. layer_control_data.operator= LGUI(KC_C);
  401. else {
  402. if (layer_control_data.operator== LGUI(KC_C)) {
  403. tap_code16(LCTL(KC_A));
  404. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LSFT(KC_DOWN));
  405. tap_code16(LGUI(KC_C));
  406. tap_code(KC_LEFT);
  407. }
  408. layer_control_data.multiplier = 0;
  409. layer_control_data.operator = - 1;
  410. }
  411. }
  412. return false;
  413. case LGUI(KC_V):
  414. if (record->event.pressed) {
  415. if (get_mods() & MOD_MASK_SHIFT) {
  416. unregister_code(KC_LSFT);
  417. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_V));
  418. register_code(KC_LSFT);
  419. layer_control_data.multiplier = 0;
  420. layer_control_data.operator = - 1;
  421. } else {
  422. for (int i = 0; i < (layer_control_data.multiplier ? layer_control_data.multiplier : 1); ++i) tap_code16(LGUI(KC_V));
  423. layer_control_data.multiplier = 0;
  424. layer_control_data.operator = - 1;
  425. }
  426. }
  427. return false;
  428. }
  429. layer_control_data.multiplier = 0;
  430. layer_control_data.operator = - 1;
  431. return true;
  432. case LAYER_WINDOW:
  433. switch (key) {
  434. case SAFE_RANGE + LAYER_WINDOW:
  435. if (!record->event.pressed) {
  436. if (timer_elapsed(layer_window_data.start_time) < 200)
  437. temporary[LAYER_WINDOW] = true;
  438. else
  439. temporary[LAYER_WINDOW] = false;
  440. }
  441. return true;
  442. case KEY_BACK_LAYER:
  443. if (record->event.pressed) tap_code(KC_ENTER);
  444. return true;
  445. }
  446. return true;
  447. case LAYER_DESKTOP:
  448. switch (key) {
  449. case KEY_BACK_LAYER:
  450. if (record->event.pressed) tap_code16(LCTL(KC_UP));
  451. return true;
  452. }
  453. return true;
  454. }
  455. return true;
  456. }
  457. void handle_layer_start(void) {
  458. rgblight_disable_noeeprom();
  459. switch (layers[layers[0] + 1]) {
  460. case LAYER_RACE_BASE:
  461. case LAYER_RACE_EXTENSION:
  462. rgblight_enable_noeeprom();
  463. rgblight_sethsv_noeeprom(HSV_GREEN);
  464. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  465. return;
  466. case LAYER_LEGACY_BASE:
  467. case LAYER_LEGACY_EXTENSION:
  468. rgblight_enable_noeeprom();
  469. rgblight_sethsv_noeeprom(HSV_RED);
  470. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  471. return;
  472. case LAYER_CONTROL:
  473. layer_control_data.operator = - 1;
  474. layer_control_data.multiplier = 0;
  475. rgblight_enable_noeeprom();
  476. rgblight_sethsv_noeeprom(HSV_BLUE);
  477. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  478. return;
  479. case LAYER_WINDOW:
  480. register_code(KC_LGUI);
  481. tap_code(KC_TAB);
  482. layer_window_data.start_time = timer_read();
  483. return;
  484. case LAYER_DESKTOP:
  485. tap_code16(LCTL(KC_UP));
  486. return;
  487. }
  488. }
  489. void handle_layer_return(void) {
  490. rgblight_disable_noeeprom();
  491. switch (layers[layers[0] + 1]) {
  492. case LAYER_RACE_BASE:
  493. case LAYER_RACE_EXTENSION:
  494. rgblight_enable_noeeprom();
  495. rgblight_sethsv_noeeprom(HSV_GREEN);
  496. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  497. return;
  498. case LAYER_LEGACY_BASE:
  499. case LAYER_LEGACY_EXTENSION:
  500. rgblight_enable_noeeprom();
  501. rgblight_sethsv_noeeprom(HSV_RED);
  502. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  503. return;
  504. case LAYER_CONTROL:
  505. layer_control_data.operator = - 1;
  506. layer_control_data.multiplier = 0;
  507. rgblight_enable_noeeprom();
  508. rgblight_sethsv_noeeprom(HSV_BLUE);
  509. rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
  510. return;
  511. }
  512. }
  513. void handle_layer_end(void) {
  514. switch (layers[layers[0] + 1]) {
  515. case LAYER_WINDOW:
  516. unregister_code(KC_LGUI);
  517. return;
  518. }
  519. }
  520. void update_layer(void) {
  521. layer_clear();
  522. common_layer_data.back = false;
  523. layer_on(layers[layers[0] + 1]);
  524. }
  525. bool handle_call_key(uint16_t key, keyrecord_t* record) {
  526. switch (key) {
  527. case KEY_BACK_LAYER:
  528. if (record->event.pressed) {
  529. if (layers[0]) {
  530. handle_layer_end();
  531. --layers[0];
  532. update_layer();
  533. handle_layer_return();
  534. }
  535. }
  536. return false;
  537. }
  538. if (key >= SAFE_RANGE && key < SAFE_RANGE + NUMBER_OF_LAYERS) {
  539. int new_layer = key - SAFE_RANGE;
  540. if (record->event.pressed) {
  541. if (layers[layers[0] + 1] != new_layer) {
  542. if (temporary[layers[layers[0] + 1]]) {
  543. handle_layer_end();
  544. layers[layers[0] + 1] = new_layer;
  545. } else
  546. layers[++layers[0] + 1] = new_layer;
  547. update_layer();
  548. handle_layer_start();
  549. }
  550. } else {
  551. if (layers[layers[0] + 1] == new_layer && temporary[layers[layers[0] + 1]]) {
  552. handle_layer_end();
  553. --layers[0];
  554. update_layer();
  555. handle_layer_return();
  556. }
  557. }
  558. return false;
  559. }
  560. if (common_layer_data.back) {
  561. if (layers[0]) {
  562. handle_layer_end();
  563. --layers[0];
  564. update_layer();
  565. handle_layer_return();
  566. }
  567. }
  568. return true;
  569. }
  570. bool handle_common_key(uint16_t key, keyrecord_t* record) {
  571. switch (key) {
  572. case KEY_INSERT_LINE_START:
  573. if (record->event.pressed) tap_code16(LGUI(KC_LEFT));
  574. return false;
  575. case KEY_INSERT_HERE:
  576. return false;
  577. case KEY_INSERT_LINE_END:
  578. if (record->event.pressed) tap_code16(LGUI(KC_RIGHT));
  579. return false;
  580. case KEY_CREATE_PREVIOUS_LINE:
  581. if (record->event.pressed) {
  582. tap_code16(LGUI(KC_LEFT));
  583. tap_code(KC_ENTER);
  584. tap_code(KC_UP);
  585. }
  586. return false;
  587. case KEY_CREATE_NEXT_LINE:
  588. if (record->event.pressed) {
  589. tap_code16(LGUI(KC_RIGHT));
  590. tap_code(KC_ENTER);
  591. }
  592. return false;
  593. case KEY_CUT_WORD:
  594. if (record->event.pressed) {
  595. register_code(KC_LALT);
  596. tap_code(KC_LEFT);
  597. tap_code(KC_RIGHT);
  598. unregister_code(KC_LALT);
  599. tap_code16(LSFT(LALT(KC_LEFT)));
  600. tap_code16(LGUI(KC_X));
  601. }
  602. return false;
  603. case KEY_CUT_LINE:
  604. if (record->event.pressed) {
  605. tap_code16(LGUI(KC_RIGHT));
  606. tap_code16(LSFT(LGUI(KC_LEFT)));
  607. tap_code16(LGUI(KC_X));
  608. }
  609. return false;
  610. case KEY_CUT_SELECTION:
  611. if (record->event.pressed) {
  612. if (get_mods() & MOD_MASK_SHIFT) {
  613. unregister_code(KC_LSFT);
  614. tap_code16(LGUI(KC_X));
  615. register_code(KC_LSFT);
  616. } else
  617. tap_code16(LGUI(KC_X));
  618. }
  619. return false;
  620. }
  621. return true;
  622. }
  623. bool process_record_user(uint16_t key, keyrecord_t* record) {
  624. if (!handle_layer_key(key, record)) return false;
  625. if (!handle_call_key(key, record)) return false;
  626. return handle_common_key(key, record);
  627. }
  628. void keyboard_post_init_user(void) {
  629. rgblight_disable_noeeprom();
  630. rgb_matrix_disable();
  631. common_layer_data.back = false;
  632. }