qmk_firmware

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

keycode_config.c (5718B)


      1 /* Copyright 2016 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 
     17 #include "keycode_config.h"
     18 
     19 keymap_config_t keymap_config;
     20 
     21 /** \brief keycode_config
     22  *
     23  * This function is used to check a specific keycode against the bootmagic config,
     24  * and will return the corrected keycode, when appropriate.
     25  */
     26 __attribute__((weak)) uint16_t keycode_config(uint16_t keycode) {
     27 #ifdef MAGIC_ENABLE
     28     switch (keycode) {
     29         case KC_CAPS_LOCK:
     30         case KC_LOCKING_CAPS_LOCK:
     31             if (keymap_config.swap_control_capslock || keymap_config.capslock_to_control) {
     32                 return KC_LEFT_CTRL;
     33             } else if (keymap_config.swap_escape_capslock) {
     34                 return KC_ESCAPE;
     35             }
     36             return keycode;
     37         case KC_LEFT_CTRL:
     38             if (keymap_config.swap_control_capslock) {
     39                 return KC_CAPS_LOCK;
     40             }
     41             if (keymap_config.swap_lctl_lgui) {
     42                 if (keymap_config.no_gui) {
     43                     return KC_NO;
     44                 }
     45                 return KC_LEFT_GUI;
     46             }
     47             return KC_LEFT_CTRL;
     48         case KC_LEFT_ALT:
     49             if (keymap_config.swap_lalt_lgui) {
     50                 if (keymap_config.no_gui) {
     51                     return KC_NO;
     52                 }
     53                 return KC_LEFT_GUI;
     54             }
     55             return KC_LEFT_ALT;
     56         case KC_LEFT_GUI:
     57             if (keymap_config.swap_lalt_lgui) {
     58                 return KC_LEFT_ALT;
     59             }
     60             if (keymap_config.swap_lctl_lgui) {
     61                 return KC_LEFT_CTRL;
     62             }
     63             if (keymap_config.no_gui) {
     64                 return KC_NO;
     65             }
     66             return KC_LEFT_GUI;
     67         case KC_RIGHT_CTRL:
     68             if (keymap_config.swap_rctl_rgui) {
     69                 if (keymap_config.no_gui) {
     70                     return KC_NO;
     71                 }
     72                 return KC_RIGHT_GUI;
     73             }
     74             return KC_RIGHT_CTRL;
     75         case KC_RIGHT_ALT:
     76             if (keymap_config.swap_ralt_rgui) {
     77                 if (keymap_config.no_gui) {
     78                     return KC_NO;
     79                 }
     80                 return KC_RIGHT_GUI;
     81             }
     82             return KC_RIGHT_ALT;
     83         case KC_RIGHT_GUI:
     84             if (keymap_config.swap_ralt_rgui) {
     85                 return KC_RIGHT_ALT;
     86             }
     87             if (keymap_config.swap_rctl_rgui) {
     88                 return KC_RIGHT_CTRL;
     89             }
     90             if (keymap_config.no_gui) {
     91                 return KC_NO;
     92             }
     93             return KC_RIGHT_GUI;
     94         case KC_GRAVE:
     95             if (keymap_config.swap_grave_esc) {
     96                 return KC_ESCAPE;
     97             }
     98             return KC_GRAVE;
     99         case KC_ESCAPE:
    100             if (keymap_config.swap_grave_esc) {
    101                 return KC_GRAVE;
    102             } else if (keymap_config.swap_escape_capslock) {
    103                 return KC_CAPS_LOCK;
    104             }
    105             return KC_ESCAPE;
    106         case KC_BACKSLASH:
    107             if (keymap_config.swap_backslash_backspace) {
    108                 return KC_BACKSPACE;
    109             }
    110             return KC_BACKSLASH;
    111         case KC_BACKSPACE:
    112             if (keymap_config.swap_backslash_backspace) {
    113                 return KC_BACKSLASH;
    114             }
    115             return KC_BACKSPACE;
    116         default:
    117             return keycode;
    118     }
    119 #else
    120     return keycode;
    121 #endif // MAGIC_ENABLE
    122 }
    123 
    124 /** \brief mod_config
    125  *
    126  *  This function checks the mods passed to it against the bootmagic config,
    127  *  and will remove or replace mods, based on that.
    128  */
    129 
    130 __attribute__((weak)) uint8_t mod_config(uint8_t mod) {
    131 #ifdef MAGIC_ENABLE
    132     /**
    133      * Note: This function is for the 5-bit packed mods, NOT the full 8-bit mods.
    134      * More info about the mods can be seen in modifiers.h.
    135      */
    136     if (keymap_config.swap_lalt_lgui) {
    137         /** If both modifiers pressed or neither pressed, do nothing
    138          * Otherwise swap the values
    139          * Note: The left mods are ANDed with the right-hand values to check
    140          * if they were pressed with the right hand bit set
    141          */
    142         if (((mod & MOD_RALT) == MOD_LALT) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
    143             mod ^= (MOD_LALT | MOD_LGUI);
    144         }
    145     }
    146     if (keymap_config.swap_ralt_rgui) {
    147         if (((mod & MOD_RALT) == MOD_RALT) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
    148             /* lefthand values to preserve the right hand bit */
    149             mod ^= (MOD_LALT | MOD_LGUI);
    150         }
    151     }
    152     if (keymap_config.swap_lctl_lgui) {
    153         /* left mods ANDed with right-hand values to check for right hand bit */
    154         if (((mod & MOD_RCTL) == MOD_LCTL) ^ ((mod & MOD_RGUI) == MOD_LGUI)) {
    155             mod ^= (MOD_LCTL | MOD_LGUI);
    156         }
    157     }
    158     if (keymap_config.swap_rctl_rgui) {
    159         if (((mod & MOD_RCTL) == MOD_RCTL) ^ ((mod & MOD_RGUI) == MOD_RGUI)) {
    160             /* lefthand values to preserve the right hand bit */
    161             mod ^= (MOD_LCTL | MOD_LGUI);
    162         }
    163     }
    164     if (keymap_config.no_gui) {
    165         if (mod & MOD_LGUI) {
    166             mod &= ~MOD_RGUI;
    167         }
    168     }
    169 
    170 #endif // MAGIC_ENABLE
    171     return mod;
    172 }