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.

278 lines
6.2 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. #if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
  50. switch (os) {
  51. case _OS_MACOS:
  52. set_unicode_input_mode(UC_OSX);
  53. break;
  54. case _OS_LINUX:
  55. set_unicode_input_mode(UC_LNX);
  56. break;
  57. case _OS_WINDOWS:
  58. set_unicode_input_mode(UC_WIN);
  59. break;
  60. }
  61. #endif
  62. }
  63. void matrix_init_user(void) {
  64. stored_userspace_config.raw = eeconfig_read_user();
  65. runtime_userspace_config.raw = stored_userspace_config.raw;
  66. set_os(runtime_userspace_config.os_target);
  67. }
  68. void store_userspace_config(void) {
  69. eeconfig_update_user(stored_userspace_config.raw);
  70. }
  71. LEADER_EXTERNS();
  72. void matrix_scan_user(void) {
  73. LEADER_DICTIONARY() {
  74. leading = false;
  75. leader_end();
  76. SEQ_TWO_KEYS(KC_F1, KC_L) {
  77. set_os(_OS_LINUX);
  78. }
  79. SEQ_TWO_KEYS(KC_F1, KC_M) {
  80. set_os(_OS_MACOS);
  81. }
  82. SEQ_TWO_KEYS(KC_F1, KC_W) {
  83. set_os(_OS_WINDOWS);
  84. }
  85. SEQ_TWO_KEYS(KC_F1, KC_S) {
  86. stored_userspace_config.raw = runtime_userspace_config.raw;
  87. store_userspace_config();
  88. }
  89. }
  90. }
  91. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  92. uint8_t os_target = runtime_userspace_config.os_target;
  93. bool pressed = record->event.pressed;
  94. switch (keycode) {
  95. case KC_QWERTY:
  96. if (pressed) {
  97. set_single_persistent_default_layer(_QWERTY);
  98. }
  99. return false;
  100. break;
  101. case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
  102. if (!pressed) {
  103. send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP
  104. #if defined(__ARM__)
  105. ":dfu-util"
  106. #elif defined(BOOTLOADER_DFU)
  107. ":dfu"
  108. #elif defined(BOOTLOADER_HALFKAY)
  109. ":teensy"
  110. #elif defined(BOOTLOADER_CATERINA)
  111. ":avrdude"
  112. #endif // bootloader options
  113. SS_TAP(X_ENTER)), 10);
  114. }
  115. return false;
  116. break;
  117. case EPRM: // Resets EEPROM
  118. if (pressed) {
  119. eeconfig_init();
  120. default_layer_set(1UL<<eeconfig_read_default_layer());
  121. layer_state_set(layer_state);
  122. set_os(_OS_MACOS);
  123. store_userspace_config();
  124. }
  125. return false;
  126. break;
  127. case VRSN: // Prints firmware version
  128. if (pressed) {
  129. send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), MACRO_TIMER);
  130. }
  131. return false;
  132. break;
  133. case KC_OS_CUT:
  134. switch (os_target) {
  135. case _OS_MACOS:
  136. if (pressed)
  137. SEND_STRING(SS_LGUI("x"));
  138. break;
  139. case _OS_LINUX:
  140. pressed ?
  141. register_code(KC_CUT)
  142. : unregister_code(KC_CUT);
  143. break;
  144. default:
  145. if (pressed)
  146. SEND_STRING(SS_LCTRL("x"));
  147. break;
  148. }
  149. break;
  150. case KC_OS_COPY:
  151. switch (os_target) {
  152. case _OS_MACOS:
  153. if (pressed)
  154. SEND_STRING(SS_LGUI("c"));
  155. break;
  156. case _OS_LINUX:
  157. pressed ?
  158. register_code(KC_COPY)
  159. : unregister_code(KC_COPY);
  160. break;
  161. default:
  162. if (pressed)
  163. SEND_STRING(SS_LCTRL("c"));
  164. break;
  165. }
  166. break;
  167. case KC_OS_PASTE:
  168. switch (os_target) {
  169. case _OS_MACOS:
  170. if (pressed)
  171. SEND_STRING(SS_LGUI("v"));
  172. break;
  173. case _OS_LINUX:
  174. pressed ?
  175. register_code(KC_PASTE)
  176. : unregister_code(KC_PASTE);
  177. break;
  178. default:
  179. if (pressed)
  180. SEND_STRING(SS_LCTRL("v"));
  181. break;
  182. }
  183. break;
  184. case KC_OS_UNDO:
  185. switch (os_target) {
  186. case _OS_MACOS:
  187. if (pressed)
  188. SEND_STRING(SS_LGUI("z"));
  189. break;
  190. case _OS_LINUX:
  191. pressed ?
  192. register_code(KC_UNDO)
  193. : unregister_code(KC_UNDO);
  194. break;
  195. default:
  196. if (pressed)
  197. SEND_STRING(SS_LCTRL("z"));
  198. break;
  199. }
  200. break;
  201. case KC_OS_REDO:
  202. switch (os_target) {
  203. case _OS_MACOS:
  204. if (pressed)
  205. SEND_STRING(SS_LGUI(SS_LSFT("z")));
  206. break;
  207. case _OS_LINUX:
  208. pressed ?
  209. register_code(KC_AGAIN)
  210. : unregister_code(KC_AGAIN);
  211. break;
  212. default:
  213. if (pressed)
  214. SEND_STRING(SS_LCTRL(SS_LSFT("z")));
  215. break;
  216. }
  217. break;
  218. case KC_OS_LOCK:
  219. switch (os_target) {
  220. case _OS_MACOS:
  221. if (pressed)
  222. SEND_STRING(SS_LGUI(SS_LCTRL("q")));
  223. break;
  224. case _OS_LINUX:
  225. pressed ?
  226. register_code(KC_PWR)
  227. : unregister_code(KC_PWR);
  228. break;
  229. default:
  230. if (pressed)
  231. SEND_STRING(SS_LGUI("l"));
  232. break;
  233. }
  234. break;
  235. case KC_SCRT:
  236. if (pressed) {
  237. SEND_STRING(SS_LGUI("`"));
  238. }
  239. break;
  240. }
  241. return process_record_keymap(keycode, record);
  242. }