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.

276 lines
6.1 KiB

  1. /*
  2. Copyright 2018 Yann Hodique <yann.hodique@gmail.com> @sigma
  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. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. #include "sigma.h"
  15. userspace_config_t runtime_userspace_config;
  16. userspace_config_t stored_userspace_config;
  17. __attribute__ ((weak))
  18. void matrix_init_keymap(void) {}
  19. __attribute__ ((weak))
  20. void startup_keymap(void) {}
  21. __attribute__ ((weak))
  22. void shutdown_keymap(void) {}
  23. __attribute__ ((weak))
  24. void suspend_power_down_keymap(void) {}
  25. __attribute__ ((weak))
  26. void suspend_wakeup_init_keymap(void) {}
  27. __attribute__ ((weak))
  28. void matrix_scan_keymap(void) {}
  29. __attribute__ ((weak))
  30. bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
  31. return true;
  32. }
  33. __attribute__ ((weak))
  34. bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
  35. return true;
  36. }
  37. __attribute__ ((weak))
  38. uint32_t layer_state_set_keymap (uint32_t state) {
  39. return state;
  40. }
  41. __attribute__ ((weak))
  42. uint32_t default_layer_state_set_keymap (uint32_t state) {
  43. return state;
  44. }
  45. __attribute__ ((weak))
  46. void led_set_keymap(uint8_t usb_led) {}
  47. void set_os(uint8_t os) {
  48. runtime_userspace_config.os_target = os;
  49. switch (os) {
  50. case _OS_MACOS:
  51. set_unicode_input_mode(UC_OSX);
  52. break;
  53. case _OS_LINUX:
  54. set_unicode_input_mode(UC_LNX);
  55. break;
  56. case _OS_WINDOWS:
  57. set_unicode_input_mode(UC_WIN);
  58. break;
  59. }
  60. }
  61. void matrix_init_user(void) {
  62. stored_userspace_config.raw = eeconfig_read_user();
  63. runtime_userspace_config.raw = stored_userspace_config.raw;
  64. set_os(runtime_userspace_config.os_target);
  65. }
  66. void store_userspace_config(void) {
  67. eeconfig_update_user(stored_userspace_config.raw);
  68. }
  69. LEADER_EXTERNS();
  70. void matrix_scan_user(void) {
  71. LEADER_DICTIONARY() {
  72. leading = false;
  73. leader_end();
  74. SEQ_TWO_KEYS(KC_F1, KC_L) {
  75. set_os(_OS_LINUX);
  76. }
  77. SEQ_TWO_KEYS(KC_F1, KC_M) {
  78. set_os(_OS_MACOS);
  79. }
  80. SEQ_TWO_KEYS(KC_F1, KC_W) {
  81. set_os(_OS_WINDOWS);
  82. }
  83. SEQ_TWO_KEYS(KC_F1, KC_S) {
  84. stored_userspace_config.raw = runtime_userspace_config.raw;
  85. store_userspace_config();
  86. }
  87. }
  88. }
  89. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  90. uint8_t os_target = runtime_userspace_config.os_target;
  91. bool pressed = record->event.pressed;
  92. switch (keycode) {
  93. case KC_QWERTY:
  94. if (pressed) {
  95. set_single_persistent_default_layer(_QWERTY);
  96. }
  97. return false;
  98. break;
  99. case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
  100. if (!pressed) {
  101. send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP
  102. #if defined(__ARM__)
  103. ":dfu-util"
  104. #elif defined(BOOTLOADER_DFU)
  105. ":dfu"
  106. #elif defined(BOOTLOADER_HALFKAY)
  107. ":teensy"
  108. #elif defined(BOOTLOADER_CATERINA)
  109. ":avrdude"
  110. #endif // bootloader options
  111. SS_TAP(X_ENTER)), 10);
  112. }
  113. return false;
  114. break;
  115. case EPRM: // Resets EEPROM
  116. if (pressed) {
  117. eeconfig_init();
  118. default_layer_set(1UL<<eeconfig_read_default_layer());
  119. layer_state_set(layer_state);
  120. set_os(_OS_MACOS);
  121. store_userspace_config();
  122. }
  123. return false;
  124. break;
  125. case VRSN: // Prints firmware version
  126. if (pressed) {
  127. send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER);
  128. }
  129. return false;
  130. break;
  131. case KC_OS_CUT:
  132. switch (os_target) {
  133. case _OS_MACOS:
  134. if (pressed)
  135. SEND_STRING(SS_LGUI("x"));
  136. break;
  137. case _OS_LINUX:
  138. pressed ?
  139. register_code(KC_CUT)
  140. : unregister_code(KC_CUT);
  141. break;
  142. default:
  143. if (pressed)
  144. SEND_STRING(SS_LCTRL("x"));
  145. break;
  146. }
  147. break;
  148. case KC_OS_COPY:
  149. switch (os_target) {
  150. case _OS_MACOS:
  151. if (pressed)
  152. SEND_STRING(SS_LGUI("c"));
  153. break;
  154. case _OS_LINUX:
  155. pressed ?
  156. register_code(KC_COPY)
  157. : unregister_code(KC_COPY);
  158. break;
  159. default:
  160. if (pressed)
  161. SEND_STRING(SS_LCTRL("c"));
  162. break;
  163. }
  164. break;
  165. case KC_OS_PASTE:
  166. switch (os_target) {
  167. case _OS_MACOS:
  168. if (pressed)
  169. SEND_STRING(SS_LGUI("v"));
  170. break;
  171. case _OS_LINUX:
  172. pressed ?
  173. register_code(KC_PASTE)
  174. : unregister_code(KC_PASTE);
  175. break;
  176. default:
  177. if (pressed)
  178. SEND_STRING(SS_LCTRL("v"));
  179. break;
  180. }
  181. break;
  182. case KC_OS_UNDO:
  183. switch (os_target) {
  184. case _OS_MACOS:
  185. if (pressed)
  186. SEND_STRING(SS_LGUI("z"));
  187. break;
  188. case _OS_LINUX:
  189. pressed ?
  190. register_code(KC_UNDO)
  191. : unregister_code(KC_UNDO);
  192. break;
  193. default:
  194. if (pressed)
  195. SEND_STRING(SS_LCTRL("z"));
  196. break;
  197. }
  198. break;
  199. case KC_OS_REDO:
  200. switch (os_target) {
  201. case _OS_MACOS:
  202. if (pressed)
  203. SEND_STRING(SS_LGUI(SS_LSFT("z")));
  204. break;
  205. case _OS_LINUX:
  206. pressed ?
  207. register_code(KC_AGAIN)
  208. : unregister_code(KC_AGAIN);
  209. break;
  210. default:
  211. if (pressed)
  212. SEND_STRING(SS_LCTRL(SS_LSFT("z")));
  213. break;
  214. }
  215. break;
  216. case KC_OS_LOCK:
  217. switch (os_target) {
  218. case _OS_MACOS:
  219. if (pressed)
  220. SEND_STRING(SS_LGUI(SS_LCTRL("q")));
  221. break;
  222. case _OS_LINUX:
  223. pressed ?
  224. register_code(KC_PWR)
  225. : unregister_code(KC_PWR);
  226. break;
  227. default:
  228. if (pressed)
  229. SEND_STRING(SS_LGUI("l"));
  230. break;
  231. }
  232. break;
  233. case KC_SCRT:
  234. if (pressed) {
  235. SEND_STRING(SS_LGUI("`"));
  236. }
  237. break;
  238. }
  239. return process_record_keymap(keycode, record);
  240. }