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.

415 lines
20 KiB

  1. /*
  2. Copyright 2019 @foostan
  3. Copyright 2020 Drashna Jaelre <@drashna>
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 2 of the License, or
  7. (at your option) any later version.
  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. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #include QMK_KEYBOARD_H
  16. #include "version.h"
  17. #include "keymap_spanish.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. _NAVIGATE,
  25. _SYMBOLS,
  26. _NUMPAD,
  27. _ADJUST
  28. };
  29. // Custom keycodes for layer keys
  30. // Dual function escape with left command
  31. #define KC_LGESC LGUI_T(KC_ESC)
  32. enum custom_keycodes {
  33. QWERTY = SAFE_RANGE,
  34. // LOWER,
  35. // RAISE,
  36. // ADJUST,
  37. RGBRST
  38. // KC_RACL // right alt / colon
  39. };
  40. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  41. /*
  42. //,-----------------------------------------------------. ,-----------------------------------------------------.
  43. LT(3,KC_TAB), Q, W, E, R, T, Y, U, I, O, P, BSPC,
  44. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  45. LCTL_T(KC_ESC), A, S, D, F, G, H, J, K, L, Ñ, ´ ,
  46. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  47. LSFT_T(<), Z, X, C, V, B, N, M, ,/; , ./: , -/_ , RSFT_T('),
  48. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  49. WIN/CMD, MO(1), KC_SPC, KC_SPC, MO(2), RALT(SUPR)
  50. //`--------------------------' `--------------------------'
  51. */
  52. [_QWERTY] = LAYOUT_split_3x6_3(
  53. //,-----------------------------------------------------. ,-----------------------------------------------------.
  54. LT(_NUMPAD,KC_TAB), ES_Q, ES_W, ES_E, ES_R, ES_T, ES_Y, ES_U, ES_I, ES_O, ES_P, KC_BSPC,
  55. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  56. LCTL_T(KC_ESC), ES_A, ES_S, ES_D, ES_F, ES_G, ES_H, ES_J, ES_K, ES_L, ES_NTIL, ES_ACUT,
  57. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  58. LSFT_T(ES_LABK), ES_Z, ES_X, ES_C, ES_V, ES_B, ES_N, ES_M, ES_COMM, ES_DOT, ES_MINS, RSFT_T(ES_QUOT),
  59. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  60. KC_LGUI, LT(_NAVIGATE,KC_CAPS), KC_SPC, KC_SPC, LT(_SYMBOLS,KC_ENT), RALT_T(KC_DEL)
  61. //`--------------------------' `--------------------------'
  62. ),
  63. /*
  64. //,-----------------------------------------------------. ,-----------------------------------------------------.
  65. KC_TAB, z , v , c , KC_LCTL, , , , , , , ,
  66. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  67. KC_ESC, x , KC_LSFT, KC_LALT, KC_LGUI, , , , , , , ,
  68. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  69. KC_BRMU, KC_BRMD, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  70. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  71. WIN/CMD, , KC_SPC, KC_SPC, MO(2), KC_DEL
  72. //`--------------------------' `--------------------------'
  73. */
  74. [_NAVIGATE] = LAYOUT_split_3x6_3(
  75. //,-----------------------------------------------------. ,-----------------------------------------------------.
  76. KC_TAB, ES_X, ES_V, ES_C, KC_LCTL, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, KC_BSPC,
  77. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  78. KC_ESC, ES_Z, KC_LSFT, KC_LALT, KC_LGUI, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, XXXXXXX,
  79. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  80. KC_BRMU, KC_BRMD, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
  81. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  82. KC_LGUI, _______, KC_SPC, KC_SPC, MO(_ADJUST), KC_DEL
  83. //`--------------------------' `--------------------------'
  84. ),
  85. /*
  86. //,-----------------------------------------------------. ,-----------------------------------------------------.
  87. , ¡ , ! , ( , ) , , , = , * , ` , ^ , KC_BSPC,
  88. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  89. , < , > , { , } , , " , / , + , @ , # , º ,
  90. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  91. , ¿ , ? , [ , ] , , , $ , & , | , % , \ ,
  92. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  93. WIN/CMD, , KC_SPC, KC_SPC, , KC_RALT
  94. //`--------------------------' `--------------------------'
  95. */
  96. [_SYMBOLS] = LAYOUT_split_3x6_3(
  97. //,-----------------------------------------------------. ,-----------------------------------------------------.
  98. XXXXXXX, ES_IEXL, ES_EXLM, ES_LPRN, ES_RPRN, XXXXXXX, XXXXXXX, ES_EQL, ES_ASTR, ES_GRV, ES_CIRC, KC_BSPC,
  99. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  100. XXXXXXX, ES_LABK, ES_RABK, ES_LCBR, ES_RCBR, XXXXXXX, ES_DQUO, ES_SLSH, ES_PLUS, ES_AT, ES_HASH, ES_MORD,
  101. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  102. XXXXXXX, ES_IQUE, ES_QUES, ES_LBRC, ES_RBRC, XXXXXXX, XXXXXXX, ES_DLR, ES_AMPR, ES_PIPE, ES_PERC, ES_BSLS,
  103. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  104. KC_LGUI, MO(_ADJUST), KC_SPC, KC_SPC, _______, KC_RALT
  105. //`--------------------------' `--------------------------'
  106. ),
  107. /*
  108. //,-----------------------------------------------------. ,-----------------------------------------------------.
  109. , , , , , , + , 7 , 8 , 9 , - , ,
  110. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  111. , , , , , , * , 4 , 5 , 6 , / , ,
  112. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  113. , , , , , , . , 1 , 2 , 3 , 0 , ,
  114. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  115. WIN/CMD, , KC_SPC, KC_SPC, MO(2), KC_RALT
  116. //`--------------------------' `--------------------------'
  117. */
  118. [_NUMPAD] = LAYOUT_split_3x6_3(
  119. //,-----------------------------------------------------. ,-----------------------------------------------------.
  120. KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ES_MINS, ES_7, ES_8, ES_9, ES_SLSH, KC_BSPC,
  121. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  122. KC_ESC, XXXXXXX, KC_LSFT, KC_LALT, KC_LGUI, XXXXXXX, ES_PLUS, ES_4, ES_5, ES_6, ES_ASTR, ES_COMM,
  123. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  124. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ES_DOT, ES_1, ES_2, ES_3, ES_0, XXXXXXX,
  125. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  126. KC_LGUI, _______, KC_SPC, KC_SPC, _______, KC_RALT
  127. //`--------------------------' `--------------------------'
  128. ),
  129. [_ADJUST] = LAYOUT_split_3x6_3(
  130. //,-----------------------------------------------------. ,-----------------------------------------------------.
  131. RESET, RGBRST,RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  132. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  133. RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  134. //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
  135. RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  136. //|--------+--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------|
  137. KC_LGUI, _______, KC_SPC, KC_SPC, _______, KC_RALT
  138. //`--------------------------' `--------------------------'
  139. )
  140. };
  141. #ifdef OLED_ENABLE
  142. oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
  143. void render_space(void) {
  144. oled_write_P(PSTR(" "), false);
  145. }
  146. void render_mod_status_gui_alt(uint8_t modifiers) {
  147. static const char PROGMEM gui_off_1[] = {0x85, 0x86, 0};
  148. static const char PROGMEM gui_off_2[] = {0xa5, 0xa6, 0};
  149. static const char PROGMEM gui_on_1[] = {0x8d, 0x8e, 0};
  150. static const char PROGMEM gui_on_2[] = {0xad, 0xae, 0};
  151. static const char PROGMEM alt_off_1[] = {0x87, 0x88, 0};
  152. static const char PROGMEM alt_off_2[] = {0xa7, 0xa8, 0};
  153. static const char PROGMEM alt_on_1[] = {0x8f, 0x90, 0};
  154. static const char PROGMEM alt_on_2[] = {0xaf, 0xb0, 0};
  155. // fillers between the modifier icons bleed into the icon frames
  156. static const char PROGMEM off_off_1[] = {0xc5, 0};
  157. static const char PROGMEM off_off_2[] = {0xc6, 0};
  158. static const char PROGMEM on_off_1[] = {0xc7, 0};
  159. static const char PROGMEM on_off_2[] = {0xc8, 0};
  160. static const char PROGMEM off_on_1[] = {0xc9, 0};
  161. static const char PROGMEM off_on_2[] = {0xca, 0};
  162. static const char PROGMEM on_on_1[] = {0xcb, 0};
  163. static const char PROGMEM on_on_2[] = {0xcc, 0};
  164. if(modifiers & MOD_MASK_GUI) {
  165. oled_write_P(gui_on_1, false);
  166. } else {
  167. oled_write_P(gui_off_1, false);
  168. }
  169. if ((modifiers & MOD_MASK_GUI) && (modifiers & MOD_MASK_ALT)) {
  170. oled_write_P(on_on_1, false);
  171. } else if(modifiers & MOD_MASK_GUI) {
  172. oled_write_P(on_off_1, false);
  173. } else if(modifiers & MOD_MASK_ALT) {
  174. oled_write_P(off_on_1, false);
  175. } else {
  176. oled_write_P(off_off_1, false);
  177. }
  178. if(modifiers & MOD_MASK_ALT) {
  179. oled_write_P(alt_on_1, false);
  180. } else {
  181. oled_write_P(alt_off_1, false);
  182. }
  183. if(modifiers & MOD_MASK_GUI) {
  184. oled_write_P(gui_on_2, false);
  185. } else {
  186. oled_write_P(gui_off_2, false);
  187. }
  188. if (modifiers & MOD_MASK_GUI & MOD_MASK_ALT) {
  189. oled_write_P(on_on_2, false);
  190. } else if(modifiers & MOD_MASK_GUI) {
  191. oled_write_P(on_off_2, false);
  192. } else if(modifiers & MOD_MASK_ALT) {
  193. oled_write_P(off_on_2, false);
  194. } else {
  195. oled_write_P(off_off_2, false);
  196. }
  197. if(modifiers & MOD_MASK_ALT) {
  198. oled_write_P(alt_on_2, false);
  199. } else {
  200. oled_write_P(alt_off_2, false);
  201. }
  202. }
  203. void render_mod_status_ctrl_shift(uint8_t modifiers) {
  204. static const char PROGMEM ctrl_off_1[] = {0x89, 0x8a, 0};
  205. static const char PROGMEM ctrl_off_2[] = {0xa9, 0xaa, 0};
  206. static const char PROGMEM ctrl_on_1[] = {0x91, 0x92, 0};
  207. static const char PROGMEM ctrl_on_2[] = {0xb1, 0xb2, 0};
  208. static const char PROGMEM shift_off_1[] = {0x8b, 0x8c, 0};
  209. static const char PROGMEM shift_off_2[] = {0xab, 0xac, 0};
  210. static const char PROGMEM shift_on_1[] = {0xcd, 0xce, 0};
  211. static const char PROGMEM shift_on_2[] = {0xcf, 0xd0, 0};
  212. // fillers between the modifier icons bleed into the icon frames
  213. static const char PROGMEM off_off_1[] = {0xc5, 0};
  214. static const char PROGMEM off_off_2[] = {0xc6, 0};
  215. static const char PROGMEM on_off_1[] = {0xc7, 0};
  216. static const char PROGMEM on_off_2[] = {0xc8, 0};
  217. static const char PROGMEM off_on_1[] = {0xc9, 0};
  218. static const char PROGMEM off_on_2[] = {0xca, 0};
  219. static const char PROGMEM on_on_1[] = {0xcb, 0};
  220. static const char PROGMEM on_on_2[] = {0xcc, 0};
  221. if(modifiers & MOD_MASK_CTRL) {
  222. oled_write_P(ctrl_on_1, false);
  223. } else {
  224. oled_write_P(ctrl_off_1, false);
  225. }
  226. if ((modifiers & MOD_MASK_CTRL) && (modifiers & MOD_MASK_SHIFT)) {
  227. oled_write_P(on_on_1, false);
  228. } else if(modifiers & MOD_MASK_CTRL) {
  229. oled_write_P(on_off_1, false);
  230. } else if(modifiers & MOD_MASK_SHIFT) {
  231. oled_write_P(off_on_1, false);
  232. } else {
  233. oled_write_P(off_off_1, false);
  234. }
  235. if(modifiers & MOD_MASK_SHIFT) {
  236. oled_write_P(shift_on_1, false);
  237. } else {
  238. oled_write_P(shift_off_1, false);
  239. }
  240. if(modifiers & MOD_MASK_CTRL) {
  241. oled_write_P(ctrl_on_2, false);
  242. } else {
  243. oled_write_P(ctrl_off_2, false);
  244. }
  245. if (modifiers & MOD_MASK_CTRL & MOD_MASK_SHIFT) {
  246. oled_write_P(on_on_2, false);
  247. } else if(modifiers & MOD_MASK_CTRL) {
  248. oled_write_P(on_off_2, false);
  249. } else if(modifiers & MOD_MASK_SHIFT) {
  250. oled_write_P(off_on_2, false);
  251. } else {
  252. oled_write_P(off_off_2, false);
  253. }
  254. if(modifiers & MOD_MASK_SHIFT) {
  255. oled_write_P(shift_on_2, false);
  256. } else {
  257. oled_write_P(shift_off_2, false);
  258. }
  259. }
  260. void render_logo(void) {
  261. static const char PROGMEM corne_logo[] = {
  262. 0x80, 0x81, 0x82, 0x83, 0x84,
  263. 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
  264. 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0};
  265. oled_write_P(corne_logo, false);
  266. oled_write_P(PSTR("corne"), false);
  267. }
  268. void render_layer_state(void) {
  269. static const char PROGMEM raise_layer[] = {
  270. 0x20, 0x97, 0x98, 0x99, 0x20,
  271. 0x20, 0xb7, 0xb8, 0xb9, 0x20,
  272. 0x20, 0xd7, 0xd8, 0xd9, 0x20, 0};
  273. static const char PROGMEM navigate_layer[] = {
  274. 0x20, 0x94, 0x95, 0x96, 0x20,
  275. 0x20, 0xb4, 0xb5, 0xb6, 0x20,
  276. 0x20, 0xd4, 0xd5, 0xd6, 0x20, 0};
  277. static const char PROGMEM lower_layer[] = {
  278. 0x20, 0x9a, 0x9b, 0x9c, 0x20,
  279. 0x20, 0xba, 0xbb, 0xbc, 0x20,
  280. 0x20, 0xda, 0xdb, 0xdc, 0x20, 0};
  281. static const char PROGMEM numpad_layer[] = {
  282. 0x20, 0x9b, 0x9c, 0x94, 0x20,
  283. 0x20, 0xbb, 0xbc, 0xb4, 0x20,
  284. 0x20, 0xdb, 0xdc, 0xd4, 0x20, 0};
  285. static const char PROGMEM adjust_layer[] = {
  286. 0x20, 0x9d, 0x9e, 0x9f, 0x20,
  287. 0x20, 0xbd, 0xbe, 0xbf, 0x20,
  288. 0x20, 0xdd, 0xde, 0xdf, 0x20, 0};
  289. if(layer_state_is(_ADJUST)) {
  290. oled_write_P(adjust_layer, false);
  291. } else if(layer_state_is(_NAVIGATE)) {
  292. oled_write_P(navigate_layer, false);
  293. } else if(layer_state_is(_SYMBOLS)) {
  294. oled_write_P(lower_layer, false);
  295. } else if(layer_state_is(_NUMPAD)) {
  296. oled_write_P(numpad_layer, false);
  297. } else {
  298. oled_write_P(raise_layer, false);
  299. }
  300. }
  301. bool oled_task_user(void) {
  302. // Renders the current keyboard state (layers and mods)
  303. render_logo();
  304. render_space();
  305. render_layer_state();
  306. render_space();
  307. render_mod_status_gui_alt(get_mods()|get_oneshot_mods());
  308. render_mod_status_ctrl_shift(get_mods()|get_oneshot_mods());
  309. return false;
  310. }
  311. #endif
  312. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  313. // static uint16_t my_colon_timer;
  314. switch (keycode) {
  315. /* case LOWER:
  316. if (record->event.pressed) {
  317. layer_on(_NAVIGATE);
  318. update_tri_layer_RGB(_NAVIGATE, _SYMBOLS, _ADJUST);
  319. } else {
  320. layer_off(_NAVIGATE);
  321. update_tri_layer_RGB(_NAVIGATE, _SYMBOLS, _ADJUST);
  322. }
  323. return false;
  324. case RAISE:
  325. if (record->event.pressed) {
  326. layer_on(_SYMBOLS);
  327. update_tri_layer_RGB(_NAVIGATE, _SYMBOLS, _ADJUST);
  328. } else {
  329. layer_off(_SYMBOLS);
  330. update_tri_layer_RGB(_NAVIGATE, _SYMBOLS, _ADJUST);
  331. }
  332. return false;
  333. case ADJUST:
  334. if (record->event.pressed) {
  335. layer_on(_ADJUST);
  336. } else {
  337. layer_off(_ADJUST);
  338. }
  339. return false;
  340. case KC_RACL:
  341. if (record->event.pressed) {
  342. my_colon_timer = timer_read();
  343. register_code(KC_RALT);
  344. } else {
  345. unregister_code(KC_RALT);
  346. if (timer_elapsed(my_colon_timer) < TAPPING_TERM) {
  347. SEND_STRING(":"); // Change the character(s) to be sent on tap here
  348. }
  349. }
  350. return false; */
  351. case RGBRST:
  352. #ifdef RGBLIGHT_ENABLE
  353. if (record->event.pressed) {
  354. eeconfig_update_rgblight_default();
  355. rgblight_enable();
  356. }
  357. #endif
  358. #ifdef RGB_MATRIX_ENABLE
  359. if (record->event.pressed) {
  360. eeconfig_update_rgb_matrix_default();
  361. rgb_matrix_enable();
  362. }
  363. #endif
  364. break;
  365. }
  366. return true;
  367. }