qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }