Parent directory

process_magic.c

8050 bytes
  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
 36float ag_norm_song[][2] = AG_NORM_SONG;
 37float ag_swap_song[][2] = AG_SWAP_SONG;
 38float cg_norm_song[][2] = CG_NORM_SONG;
 39float cg_swap_song[][2] = CG_SWAP_SONG;
 40#endif
 41
 42/**
 43 * MAGIC actions (BOOTMAGIC without the boot)
 44 */
 45bool 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            keymap_config.raw = eeconfig_read_keymap();
 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.raw);
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}