process_magic.c (8041B)
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 #include "keycode_config.h" 18 #include "keycodes.h" 19 #include "eeconfig.h" 20 21 #ifdef AUDIO_ENABLE 22 # include "audio.h" 23 24 # ifndef AG_NORM_SONG 25 # define AG_NORM_SONG SONG(AG_NORM_SOUND) 26 # endif 27 # ifndef AG_SWAP_SONG 28 # define AG_SWAP_SONG SONG(AG_SWAP_SOUND) 29 # endif 30 # ifndef CG_NORM_SONG 31 # define CG_NORM_SONG SONG(AG_NORM_SOUND) 32 # endif 33 # ifndef CG_SWAP_SONG 34 # define CG_SWAP_SONG SONG(AG_SWAP_SOUND) 35 # endif 36 float ag_norm_song[][2] = AG_NORM_SONG; 37 float ag_swap_song[][2] = AG_SWAP_SONG; 38 float cg_norm_song[][2] = CG_NORM_SONG; 39 float cg_swap_song[][2] = CG_SWAP_SONG; 40 #endif 41 42 /** 43 * MAGIC actions (BOOTMAGIC without the boot) 44 */ 45 bool process_magic(uint16_t keycode, keyrecord_t *record) { 46 // skip anything that isn't a keyup 47 if (record->event.pressed) { 48 if (IS_MAGIC_KEYCODE(keycode)) { 49 /* keymap config */ 50 eeconfig_read_keymap(&keymap_config); 51 switch (keycode) { 52 case QK_MAGIC_SWAP_CONTROL_CAPS_LOCK: 53 keymap_config.swap_control_capslock = true; 54 break; 55 case QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK: 56 keymap_config.swap_escape_capslock = true; 57 break; 58 case QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON: 59 keymap_config.capslock_to_control = true; 60 break; 61 case QK_MAGIC_SWAP_LALT_LGUI: 62 keymap_config.swap_lalt_lgui = true; 63 break; 64 case QK_MAGIC_SWAP_RALT_RGUI: 65 keymap_config.swap_ralt_rgui = true; 66 break; 67 case QK_MAGIC_SWAP_LCTL_LGUI: 68 keymap_config.swap_lctl_lgui = true; 69 break; 70 case QK_MAGIC_SWAP_RCTL_RGUI: 71 keymap_config.swap_rctl_rgui = true; 72 break; 73 case QK_MAGIC_GUI_OFF: 74 keymap_config.no_gui = true; 75 break; 76 case QK_MAGIC_SWAP_GRAVE_ESC: 77 keymap_config.swap_grave_esc = true; 78 break; 79 case QK_MAGIC_SWAP_BACKSLASH_BACKSPACE: 80 keymap_config.swap_backslash_backspace = true; 81 break; 82 case QK_MAGIC_NKRO_ON: 83 clear_keyboard(); // clear first buffer to prevent stuck keys 84 keymap_config.nkro = true; 85 break; 86 case QK_MAGIC_SWAP_ALT_GUI: 87 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = true; 88 #ifdef AUDIO_ENABLE 89 PLAY_SONG(ag_swap_song); 90 #endif 91 break; 92 case QK_MAGIC_SWAP_CTL_GUI: 93 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = true; 94 #ifdef AUDIO_ENABLE 95 PLAY_SONG(cg_swap_song); 96 #endif 97 break; 98 case QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK: 99 keymap_config.swap_control_capslock = false; 100 break; 101 case QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK: 102 keymap_config.swap_escape_capslock = false; 103 break; 104 case QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF: 105 keymap_config.capslock_to_control = false; 106 break; 107 case QK_MAGIC_UNSWAP_LALT_LGUI: 108 keymap_config.swap_lalt_lgui = false; 109 break; 110 case QK_MAGIC_UNSWAP_RALT_RGUI: 111 keymap_config.swap_ralt_rgui = false; 112 break; 113 case QK_MAGIC_UNSWAP_LCTL_LGUI: 114 keymap_config.swap_lctl_lgui = false; 115 break; 116 case QK_MAGIC_UNSWAP_RCTL_RGUI: 117 keymap_config.swap_rctl_rgui = false; 118 break; 119 case QK_MAGIC_GUI_ON: 120 keymap_config.no_gui = false; 121 break; 122 case QK_MAGIC_UNSWAP_GRAVE_ESC: 123 keymap_config.swap_grave_esc = false; 124 break; 125 case QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE: 126 keymap_config.swap_backslash_backspace = false; 127 break; 128 case QK_MAGIC_NKRO_OFF: 129 clear_keyboard(); // clear first buffer to prevent stuck keys 130 keymap_config.nkro = false; 131 break; 132 case QK_MAGIC_UNSWAP_ALT_GUI: 133 keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = false; 134 #ifdef AUDIO_ENABLE 135 PLAY_SONG(ag_norm_song); 136 #endif 137 break; 138 case QK_MAGIC_UNSWAP_CTL_GUI: 139 keymap_config.swap_lctl_lgui = keymap_config.swap_rctl_rgui = false; 140 #ifdef AUDIO_ENABLE 141 PLAY_SONG(cg_norm_song); 142 #endif 143 break; 144 case QK_MAGIC_TOGGLE_ALT_GUI: 145 keymap_config.swap_lalt_lgui = !keymap_config.swap_lalt_lgui; 146 keymap_config.swap_ralt_rgui = keymap_config.swap_lalt_lgui; 147 #ifdef AUDIO_ENABLE 148 if (keymap_config.swap_ralt_rgui) { 149 PLAY_SONG(ag_swap_song); 150 } else { 151 PLAY_SONG(ag_norm_song); 152 } 153 #endif 154 break; 155 case QK_MAGIC_TOGGLE_CTL_GUI: 156 keymap_config.swap_lctl_lgui = !keymap_config.swap_lctl_lgui; 157 keymap_config.swap_rctl_rgui = keymap_config.swap_lctl_lgui; 158 #ifdef AUDIO_ENABLE 159 if (keymap_config.swap_rctl_rgui) { 160 PLAY_SONG(cg_swap_song); 161 } else { 162 PLAY_SONG(cg_norm_song); 163 } 164 #endif 165 break; 166 case QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE: 167 keymap_config.swap_backslash_backspace = !keymap_config.swap_backslash_backspace; 168 break; 169 case QK_MAGIC_TOGGLE_NKRO: 170 clear_keyboard(); // clear first buffer to prevent stuck keys 171 keymap_config.nkro = !keymap_config.nkro; 172 break; 173 case QK_MAGIC_EE_HANDS_LEFT: 174 eeconfig_update_handedness(true); 175 break; 176 case QK_MAGIC_EE_HANDS_RIGHT: 177 eeconfig_update_handedness(false); 178 break; 179 case QK_MAGIC_TOGGLE_GUI: 180 keymap_config.no_gui = !keymap_config.no_gui; 181 break; 182 case QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK: 183 keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock; 184 break; 185 case QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK: 186 keymap_config.swap_escape_capslock = !keymap_config.swap_escape_capslock; 187 break; 188 } 189 190 eeconfig_update_keymap(&keymap_config); 191 clear_keyboard(); // clear to prevent stuck keys 192 193 return false; 194 } 195 } 196 197 // Not a magic keycode so continue processing 198 return true; 199 }