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}