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.

182 lines
7.5 KiB

  1. /* Copyright 2019 Jack Humbert
  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 "process_magic.h"
  17. #ifdef AUDIO_ENABLE
  18. # ifndef AG_NORM_SONG
  19. # define AG_NORM_SONG SONG(AG_NORM_SOUND)
  20. # endif
  21. # ifndef AG_SWAP_SONG
  22. # define AG_SWAP_SONG SONG(AG_SWAP_SOUND)
  23. # endif
  24. # ifndef CG_NORM_SONG
  25. # define CG_NORM_SONG SONG(AG_NORM_SOUND)
  26. # endif
  27. # ifndef CG_SWAP_SONG
  28. # define CG_SWAP_SONG SONG(AG_SWAP_SOUND)
  29. # endif
  30. float ag_norm_song[][2] = AG_NORM_SONG;
  31. float ag_swap_song[][2] = AG_SWAP_SONG;
  32. float cg_norm_song[][2] = CG_NORM_SONG;
  33. float cg_swap_song[][2] = CG_SWAP_SONG;
  34. #endif
  35. /**
  36. * MAGIC actions (BOOTMAGIC without the boot)
  37. */
  38. bool process_magic(uint16_t keycode, keyrecord_t *record) {
  39. // skip anything that isn't a keyup
  40. if (record->event.pressed) {
  41. switch (keycode) {
  42. case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:
  43. case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:
  44. case MAGIC_TOGGLE_GUI:
  45. /* keymap config */
  46. keymap_config.raw = eeconfig_read_keymap();
  47. switch (keycode) {
  48. case MAGIC_SWAP_CONTROL_CAPSLOCK:
  49. keymap_config.swap_control_capslock = true;
  50. break;
  51. case MAGIC_CAPSLOCK_TO_CONTROL:
  52. keymap_config.capslock_to_control = true;
  53. break;
  54. case MAGIC_SWAP_LALT_LGUI:
  55. keymap_config.swap_lalt_lgui = true;
  56. break;
  57. case MAGIC_SWAP_RALT_RGUI:
  58. keymap_config.swap_ralt_rgui = true;
  59. break;
  60. case MAGIC_SWAP_LCTL_LGUI:
  61. keymap_config.swap_lctl_lgui = true;
  62. break;
  63. case MAGIC_SWAP_RCTL_RGUI:
  64. keymap_config.swap_rctl_rgui = true;
  65. break;
  66. case MAGIC_NO_GUI:
  67. keymap_config.no_gui = true;
  68. break;
  69. case MAGIC_SWAP_GRAVE_ESC:
  70. keymap_config.swap_grave_esc = true;
  71. break;
  72. case MAGIC_SWAP_BACKSLASH_BACKSPACE:
  73. keymap_config.swap_backslash_backspace = true;
  74. break;
  75. case MAGIC_HOST_NKRO:
  76. clear_keyboard(); // clear first buffer to prevent stuck keys
  77. keymap_config.nkro = true;
  78. break;
  79. case MAGIC_SWAP_ALT_GUI:
  80. keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true;
  81. #ifdef AUDIO_ENABLE
  82. PLAY_SONG(ag_swap_song);
  83. #endif
  84. break;
  85. case MAGIC_SWAP_CTL_GUI:
  86. keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true;
  87. #ifdef AUDIO_ENABLE
  88. PLAY_SONG(cg_swap_song);
  89. #endif
  90. break;
  91. case MAGIC_UNSWAP_CONTROL_CAPSLOCK:
  92. keymap_config.swap_control_capslock = false;
  93. break;
  94. case MAGIC_UNCAPSLOCK_TO_CONTROL:
  95. keymap_config.capslock_to_control = false;
  96. break;
  97. case MAGIC_UNSWAP_LALT_LGUI:
  98. keymap_config.swap_lalt_lgui = false;
  99. break;
  100. case MAGIC_UNSWAP_RALT_RGUI:
  101. keymap_config.swap_ralt_rgui = false;
  102. break;
  103. case MAGIC_UNSWAP_LCTL_LGUI:
  104. keymap_config.swap_lctl_lgui = false;
  105. break;
  106. case MAGIC_UNSWAP_RCTL_RGUI:
  107. keymap_config.swap_rctl_rgui = false;
  108. break;
  109. case MAGIC_UNNO_GUI:
  110. keymap_config.no_gui = false;
  111. break;
  112. case MAGIC_UNSWAP_GRAVE_ESC:
  113. keymap_config.swap_grave_esc = false;
  114. break;
  115. case MAGIC_UNSWAP_BACKSLASH_BACKSPACE:
  116. keymap_config.swap_backslash_backspace = false;
  117. break;
  118. case MAGIC_UNHOST_NKRO:
  119. clear_keyboard(); // clear first buffer to prevent stuck keys
  120. keymap_config.nkro = false;
  121. break;
  122. case MAGIC_UNSWAP_ALT_GUI:
  123. keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false;
  124. #ifdef AUDIO_ENABLE
  125. PLAY_SONG(ag_norm_song);
  126. #endif
  127. break;
  128. case MAGIC_UNSWAP_CTL_GUI:
  129. keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false;
  130. #ifdef AUDIO_ENABLE
  131. PLAY_SONG(cg_norm_song);
  132. #endif
  133. break;
  134. case MAGIC_TOGGLE_ALT_GUI:
  135. keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui;
  136. keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui;
  137. #ifdef AUDIO_ENABLE
  138. if (keymap_config.swap_ralt_rgui) {
  139. PLAY_SONG(ag_swap_song);
  140. } else {
  141. PLAY_SONG(ag_norm_song);
  142. }
  143. #endif
  144. break;
  145. case MAGIC_TOGGLE_CTL_GUI:
  146. keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui;
  147. keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui;
  148. #ifdef AUDIO_ENABLE
  149. if (keymap_config.swap_rctl_rgui) {
  150. PLAY_SONG(cg_swap_song);
  151. } else {
  152. PLAY_SONG(cg_norm_song);
  153. }
  154. #endif
  155. break;
  156. case MAGIC_TOGGLE_NKRO:
  157. clear_keyboard(); // clear first buffer to prevent stuck keys
  158. keymap_config.nkro = !keymap_config.nkro;
  159. break;
  160. case MAGIC_EE_HANDS_LEFT:
  161. eeconfig_update_handedness(true);
  162. break;
  163. case MAGIC_EE_HANDS_RIGHT:
  164. eeconfig_update_handedness(false);
  165. break;
  166. case MAGIC_TOGGLE_GUI:
  167. keymap_config.no_gui = !keymap_config.no_gui;
  168. break;
  169. }
  170. eeconfig_update_keymap(keymap_config.raw);
  171. clear_keyboard(); // clear to prevent stuck keys
  172. return false;
  173. }
  174. }
  175. // Not a magic keycode so continue processing
  176. return true;
  177. }