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