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.

435 lines
9.5 KiB

  1. /* Copyright 2020 obuwunkunubi
  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. // Defines for shortcut macros
  18. #define KC_CAD LALT(LCTL(KC_DEL)) // CTRL + ALT + DEL
  19. #define KC_CPY LCTL(KC_C) // Copy
  20. #define KC_PST LCTL(KC_V) // Paste
  21. #define KC_AF4 LALT(KC_F4) // ALT + F4
  22. enum custom_keycodes {
  23. SELWN = SAFE_RANGE,
  24. SELWP,
  25. EM1,
  26. EM2,
  27. EM3,
  28. EM4,
  29. EM5,
  30. EM6,
  31. EM7,
  32. EM8,
  33. EM9,
  34. MAKE1,
  35. MAKE2,
  36. MAIL1,
  37. MAIL2,
  38. OBUWUN,
  39. DIR
  40. };
  41. enum layer_names {
  42. BASE,
  43. ONE,
  44. TWO
  45. };
  46. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  47. /* Keymap BASE: Base Layer
  48. *
  49. * ,---. ,---.
  50. * |NUM| |PLY|
  51. * `---' `---'
  52. * ,---------------.
  53. * |CAL| UP|PRE|NXT|
  54. * |---------------|
  55. * | = | / | * | - |
  56. * |---------------|
  57. * | 7 | 8 | 9 | |
  58. * |------------ + |
  59. * | 4 | 5 | 6 | |
  60. * |---------------|
  61. * | 1 | 2 | 3 | |
  62. * |------------ENT|
  63. * | 0 | . | |
  64. * `---------------'
  65. */
  66. [BASE] = LAYOUT( \
  67. KC_NLCK, KC_MPLY, \
  68. KC_CALC, TO(ONE), KC_MPRV, KC_MNXT, \
  69. KC_EQL, KC_PSLS, KC_PAST, KC_MINS, \
  70. KC_P7, KC_P8, KC_P9, \
  71. KC_P4, KC_P5, KC_P6, KC_PPLS, \
  72. KC_P1, KC_P2, KC_P3, \
  73. KC_P0, KC_PDOT, KC_PENT \
  74. ),
  75. /* Keymap ONE: Util Layer
  76. *
  77. * ,---. ,---.
  78. * |RST| |CAD|
  79. * `---' `---'
  80. * ,---------------.
  81. * |BAS|TWO|MK1|MK2|
  82. * |---------------|
  83. * |DIR|@1 |@2 |OBU|
  84. * |---------------|
  85. * |SWP|AF4|SWN| |
  86. * |------------PSC|
  87. * |CPY| U |PST| |
  88. * |---------------|
  89. * | L | D | R | |
  90. * |------------ NO|
  91. * | NO | NO| |
  92. * `---------------'
  93. */
  94. [ONE] = LAYOUT( \
  95. RESET, KC_CAD, \
  96. TO(BASE), TO(TWO), MAKE1, MAKE2, \
  97. DIR, MAIL1, MAIL2, OBUWUN, \
  98. SELWP, KC_AF4, SELWN, \
  99. KC_CPY, KC_UP, KC_PST, KC_PSCR, \
  100. KC_LEFT, KC_DOWN, KC_RGHT, \
  101. KC_P0, KC_PDOT, KC_PENT \
  102. ),
  103. /* Keymap TWO: Emoji Layer
  104. *
  105. * ,---. ,---.
  106. * | NO| | NO|
  107. * `---' `---'
  108. * ,---------------.
  109. * |ONE|BAS| [ | ] |
  110. * |---------------|
  111. * |F13|F14|F15|F16|
  112. * |---------------|
  113. * |EM7|EM8|EM9| |
  114. * |------------ NO|
  115. * |EM4|EM5|EM6| |
  116. * |---------------|
  117. * |EM1|EM2|EM3| |
  118. * |------------ NO|
  119. * | NO | NO| |
  120. * `---------------'
  121. */
  122. [TWO] = LAYOUT( \
  123. KC_NO, KC_NO, \
  124. TO(ONE), TO(BASE), KC_LBRC, KC_RBRC, \
  125. KC_F13, KC_F14, KC_F15, KC_F16, \
  126. EM7, EM8, EM9, \
  127. EM4, EM5, EM6, KC_NO, \
  128. EM1, EM2, EM3, \
  129. KC_NO, KC_NO, KC_NO \
  130. ),
  131. };
  132. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  133. switch (keycode) {
  134. case SELWN: // select and copy next word
  135. if (record->event.pressed) {
  136. // when keycode SELWN is pressed
  137. tap_code16(C(S(KC_RGHT)));
  138. tap_code16(KC_CPY);
  139. return false; break;
  140. } else {
  141. // when keycode SELWN is released
  142. }
  143. break;
  144. case SELWP: // select and copy previous word
  145. if (record->event.pressed) {
  146. // when keycode SELWP is pressed
  147. tap_code16(C(S(KC_LEFT)));
  148. tap_code16(KC_CPY);
  149. return false; break;
  150. } else {
  151. // when keycode SELWP is released
  152. }
  153. break;
  154. case MAKE1:
  155. if (record->event.pressed) {
  156. // when keycode MAKE1 is pressed
  157. send_string("make handwired/obuwunkunubi/spaget:default:avrdude");
  158. } else {
  159. // when keycode MAKE1 is released
  160. }
  161. break;
  162. case MAKE2:
  163. if (record->event.pressed) {
  164. // when keycode MAKE2 is pressed
  165. send_string("make preonic/rev3:obuwunkunubi:dfu-util");
  166. } else {
  167. // when keycode MAKE2 is released
  168. }
  169. break;
  170. case DIR:
  171. if (record->event.pressed) {
  172. // when keycode DIR is pressed
  173. send_string("cd /d/Keyboards/qmk/qmk_firmware/");
  174. } else {
  175. // when keycode DIR is released
  176. }
  177. break;
  178. case OBUWUN:
  179. if (record->event.pressed) {
  180. // when keycode OBUWUN is pressed
  181. send_string("obuwunkunubi");
  182. } else {
  183. // when keycode OBUWUN is released
  184. }
  185. break;
  186. case MAIL1:
  187. if (record->event.pressed) {
  188. // when keycode MAIL1 is pressed
  189. send_string("marko.bakan7");
  190. } else {
  191. // when keycode MAIL1 is released
  192. }
  193. break;
  194. case MAIL2:
  195. if (record->event.pressed) {
  196. // when keycode MAIL2 is pressed
  197. send_string("bakan.marko7");
  198. } else {
  199. // when keycode MAIL2 is released
  200. }
  201. break;
  202. case EM1:
  203. if (record->event.pressed) {
  204. // when keycode EM1 is pressed
  205. send_unicode_string("ʕ•ᴥ•ʔ");
  206. } else {
  207. // when keycode EM1 is released
  208. }
  209. break;
  210. case EM2:
  211. if (record->event.pressed) {
  212. // when keycode EM2 is pressed
  213. send_unicode_string("༼ つ ◕_◕ ༽つ");
  214. } else {
  215. // when keycode EM2 is released
  216. }
  217. break;
  218. case EM3:
  219. if (record->event.pressed) {
  220. // when keycode EM3 is pressed
  221. send_unicode_string("( ⌐■_■)");
  222. } else {
  223. // when keycode EM3 is released
  224. }
  225. break;
  226. case EM4:
  227. if (record->event.pressed) {
  228. // when keycode EM4 is pressed
  229. send_unicode_string("(╯°□°)╯彡 ┻━┻");
  230. } else {
  231. // when keycode EM4 is released
  232. }
  233. break;
  234. case EM5:
  235. if (record->event.pressed) {
  236. // when keycode EM5 is pressed
  237. send_unicode_string("ಠ_ಠ");
  238. } else {
  239. // when keycode EM5 is released
  240. }
  241. break;
  242. case EM6:
  243. if (record->event.pressed) {
  244. // when keycode EM6 is pressed
  245. send_unicode_string("( ͡° ͜ʖ ͡°)");
  246. } else {
  247. // when keycode EM6 is released
  248. }
  249. break;
  250. case EM7:
  251. if (record->event.pressed) {
  252. // when keycode EM7 is pressed
  253. send_unicode_string("(☞゚ヮ゚)☞");
  254. } else {
  255. // when keycode EM7 is released
  256. }
  257. break;
  258. case EM8:
  259. if (record->event.pressed) {
  260. // when keycode EM8 is pressed
  261. send_unicode_string("(^‿^)");
  262. } else {
  263. // when keycode EM8 is released
  264. }
  265. break;
  266. case EM9:
  267. if (record->event.pressed) {
  268. // when keycode EM9 is pressed
  269. send_unicode_string("¯\\_(ツ)_/¯");
  270. } else {
  271. // when keycode EM9 is released
  272. }
  273. break;
  274. }
  275. return true;
  276. };
  277. // Unicode input mode set to Windows using WinCompose
  278. void matrix_init_user(void) {
  279. set_unicode_input_mode(UC_WINC);
  280. };
  281. #ifdef OLED_DRIVER_ENABLE
  282. void oled_task_user(void) {
  283. oled_write_P(PSTR(" spaget v1\n\n"), false);
  284. // Host Keyboard Layer Status
  285. oled_write_P(PSTR("Layer: "), false);
  286. switch (get_highest_layer(layer_state)) {
  287. case BASE:
  288. oled_write_P(PSTR("Base\n"), false);
  289. break;
  290. case ONE:
  291. oled_write_P(PSTR("Util\n"), false);
  292. break;
  293. case TWO:
  294. oled_write_P(PSTR("Emoji\n"), false);
  295. break;
  296. default:
  297. oled_write_ln_P(PSTR("Undefined"), false);
  298. }
  299. // Host Keyboard LED Status
  300. led_t led_state = host_keyboard_led_state();
  301. oled_write_P(PSTR("Lock: "), false);
  302. oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
  303. oled_write_P(led_state.caps_lock ? PSTR("CAPS ") : PSTR(" "), false);
  304. oled_write_P(led_state.scroll_lock ? PSTR("SCROLL ") : PSTR(" "), false);
  305. }
  306. #endif
  307. void encoder_update_user(uint8_t index, bool clockwise) {
  308. if(IS_LAYER_ON(BASE)) {
  309. if (index == 0) { /* First encoder */
  310. if (clockwise) {
  311. tap_code(KC_PGDN);
  312. } else {
  313. tap_code(KC_PGUP);
  314. }
  315. } else if (index == 1) { /* Second encoder */
  316. if (clockwise) {
  317. tap_code(KC_VOLU);
  318. } else {
  319. tap_code(KC_VOLD);
  320. }
  321. }
  322. }
  323. else if(IS_LAYER_ON(ONE)) {
  324. if (index == 0) { /* First encoder */
  325. if (clockwise) {
  326. tap_code(KC_WH_R);
  327. } else {
  328. tap_code(KC_WH_L);
  329. }
  330. } else if (index == 1) { /* Second encoder */
  331. if (clockwise) {
  332. tap_code(KC_WH_D);
  333. } else {
  334. tap_code(KC_WH_U);
  335. }
  336. }
  337. }
  338. else if(IS_LAYER_ON(TWO)) {
  339. if (index == 0) { /* First encoder */
  340. if (clockwise) {
  341. tap_code(KC_DEL);
  342. } else {
  343. tap_code(KC_BSPC);
  344. }
  345. } else if (index == 1) { /* Second encoder */
  346. if (clockwise) {
  347. tap_code(KC_DOWN);
  348. } else {
  349. tap_code(KC_UP);
  350. }
  351. }
  352. }
  353. else {
  354. if (index == 0) { /* First encoder */
  355. if (clockwise) {
  356. tap_code(KC_PGDN);
  357. } else {
  358. tap_code(KC_PGUP);
  359. }
  360. } else if (index == 1) { /* Second encoder */
  361. if (clockwise) {
  362. tap_code(KC_VOLU);
  363. } else {
  364. tap_code(KC_VOLD);
  365. }
  366. }
  367. }
  368. }