sigma.c 6.2 KB

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