process_grave_esc.c (2377B)
1 /* Copyright 2020 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_grave_esc.h" 17 #include "keycodes.h" 18 #include "modifiers.h" 19 #include "action_util.h" 20 21 /* true if the last press of QK_GRAVE_ESCAPE was shifted (i.e. GUI or SHIFT were pressed), false otherwise. 22 * Used to ensure that the correct keycode is released if the key is released. 23 */ 24 static bool grave_esc_was_shifted = false; 25 26 bool process_grave_esc(uint16_t keycode, keyrecord_t *record) { 27 if (keycode == QK_GRAVE_ESCAPE) { 28 const uint8_t mods = get_mods(); 29 uint8_t shifted = mods & MOD_MASK_SG; 30 31 #ifdef GRAVE_ESC_ALT_OVERRIDE 32 // if ALT is pressed, ESC is always sent 33 // this is handy for the cmd+opt+esc shortcut on macOS, among other things. 34 if (mods & MOD_MASK_ALT) { 35 shifted = 0; 36 } 37 #endif 38 39 #ifdef GRAVE_ESC_CTRL_OVERRIDE 40 // if CTRL is pressed, ESC is always sent 41 // this is handy for the ctrl+shift+esc shortcut on windows, among other things. 42 if (mods & MOD_MASK_CTRL) { 43 shifted = 0; 44 } 45 #endif 46 47 #ifdef GRAVE_ESC_GUI_OVERRIDE 48 // if GUI is pressed, ESC is always sent 49 if (mods & MOD_MASK_GUI) { 50 shifted = 0; 51 } 52 #endif 53 54 #ifdef GRAVE_ESC_SHIFT_OVERRIDE 55 // if SHIFT is pressed, ESC is always sent 56 if (mods & MOD_MASK_SHIFT) { 57 shifted = 0; 58 } 59 #endif 60 61 if (record->event.pressed) { 62 grave_esc_was_shifted = shifted; 63 add_key(shifted ? KC_GRAVE : KC_ESCAPE); 64 } else { 65 del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE); 66 } 67 68 send_keyboard_report(); 69 return false; 70 } 71 72 // Not a grave keycode so continue processing 73 return true; 74 }