From 8e1be7c792c4c9f65ba7e990f2a773a23b40d20c Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Sun, 6 Aug 2017 01:50:20 -0700 Subject: Initial implementation of the key_lock feature. --- quantum/process_keycode/process_key_lock.c | 120 +++++++++++++++++++++++++++++ quantum/process_keycode/process_key_lock.h | 24 ++++++ quantum/quantum.c | 4 + quantum/quantum.h | 4 + quantum/quantum_keycodes.h | 4 + 5 files changed, 156 insertions(+) create mode 100644 quantum/process_keycode/process_key_lock.c create mode 100644 quantum/process_keycode/process_key_lock.h (limited to 'quantum') diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c new file mode 100644 index 000000000..60b0fcd9b --- /dev/null +++ b/quantum/process_keycode/process_key_lock.c @@ -0,0 +1,120 @@ +/* Copyright 2017 Fredric Silberberg + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "inttypes.h" +#include "stdint.h" +#include "process_key_lock.h" + +#define SHIFT(shift) (((uint64_t)1) << (shift)) +#define GET_KEY_ARRAY(code) (((code) < 0x40) ? key_state[0] : \ + ((code) < 0x80) ? key_state[1] : \ + ((code) < 0xC0) ? key_state[2] : key_state[3]) +#define GET_CODE_INDEX(code) (((code) < 0x40) ? (code) : \ + ((code) < 0x80) ? (code) - 0x40 : \ + ((code) < 0xC0) ? (code) - 0x80 : (code) - 0xC0) +#define KEY_STATE(code) (GET_KEY_ARRAY(code) & SHIFT(GET_CODE_INDEX(code))) == SHIFT(GET_CODE_INDEX(code)) +#define SET_KEY_ARRAY_STATE(code, val) do { \ + switch (code) { \ + case 0x00 ... 0x3F: \ + key_state[0] = (val); \ + break; \ + case 0x40 ... 0x7F: \ + key_state[1] = (val); \ + break; \ + case 0x80 ... 0xBF: \ + key_state[2] = (val); \ + break; \ + case 0xC0 ... 0xFF: \ + key_state[3] = (val); \ + break; \ + } \ +} while(0) +#define SET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code) | SHIFT(GET_CODE_INDEX(code)))) +#define UNSET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code)) & ~(SHIFT(GET_CODE_INDEX(code)))) +#define IS_STANDARD_KEYCODE(code) ((code) <= 0xFF) +#define print_hex64(num) do { print_hex32((num & 0xFFFFFFFF00000000) >> 32); print_hex32(num & 0x00000000FFFFFFFF); } while (0) + +// Locked key state. This is an array of 256 bits, one for each of the standard keys supported qmk. +uint64_t key_state[4] = { 0x0, 0x0, 0x0, 0x0 }; +bool watching = false; + +bool process_key_lock(uint16_t keycode, keyrecord_t *record) { + // We start by categorizing the keypress event. In the event of a down + // event, there are several possibilities: + // 1. The key is not being locked, and we are not watching for new keys. + // In this case, we bail immediately. This is the common case for down events. + // 2. The key was locked, and we need to unlock it. In this case, we will + // reset the state in our map and return false. When the user releases the + // key, the up event will no longer be masked and the OS will observe the + // released key. + // 3. KC_LOCK was just pressed. In this case, we set up the state machine + // to watch for the next key down event, and finish processing + // 4. The keycode is below 0xFF, and we are watching for new keys. In this case, + // we will send the key down event to the os, and set the key_state for that + // key to mask the up event. + // 5. The keycode is above 0xFF, and we're wathing for new keys. In this case, + // the user pressed a key that we cannot "lock", as it's a series of keys, + // or a macro invocation, or a layer transition, or a custom-defined key, or + // or some other arbitrary code. In this case, we bail immediately, reset + // our watch state, and return true. + // + // In the event of an up event, there are these possibilities: + // 1. The key is not being locked. In this case, we return true and bail + // immediately. This is the common case. + // 2. The key is being locked. In this case, we will mask the up event + // by returning false, so the OS never sees that the key was released + // until the user pressed the key again. + if (record->event.pressed) { + // Non-standard keycode, reset and return + if (!(IS_STANDARD_KEYCODE(keycode) || keycode == KC_LOCK)) { + watching = false; + return true; + } + + // If we're already watching, turn off the watch. + if (keycode == KC_LOCK) { + watching = !watching; + return false; + } + + if (IS_STANDARD_KEYCODE(keycode)) { + // We check watching first. This is so that in the following scenario, we continue to + // hold the key: KC_LOCK, KC_F, KC_LOCK, KC_F + // If we checked in reverse order, we'd end up holding the key pressed after the second + // KC_F press is registered, when the user likely meant to hold F + if (watching) { + watching = false; + SET_KEY_STATE(keycode); + // Let the standard keymap send the keycode down event. The up event will be masked. + return true; + } + + if (KEY_STATE(keycode)) { + UNSET_KEY_STATE(keycode); + // The key is already held, stop this process. The up event will be sent when the user + // releases the key. + return false; + } + } + + // Either the key isn't a standard key, or we need to send the down event. Continue standard + // processing + return true; + } else { + // Stop processing if it's a standard key and we're masking up. + return !(IS_STANDARD_KEYCODE(keycode) && KEY_STATE(keycode)); + } +} diff --git a/quantum/process_keycode/process_key_lock.h b/quantum/process_keycode/process_key_lock.h new file mode 100644 index 000000000..237e103bc --- /dev/null +++ b/quantum/process_keycode/process_key_lock.h @@ -0,0 +1,24 @@ +/* Copyright 2017 Fredric Silberberg + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef PROCESS_KEY_LOCK_H +#define PROCESS_KEY_LOCK_H + +#include "quantum.h" + +bool process_key_lock(uint16_t keycode, keyrecord_t *record); + +#endif // PROCESS_KEY_LOCK_H diff --git a/quantum/quantum.c b/quantum/quantum.c index 1f8ce6c46..c71a97bf2 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -193,6 +193,10 @@ bool process_record_quantum(keyrecord_t *record) { // } if (!( + #if defined(KEY_LOCK_ENABLE) + // Must run first to be able to mask key_up events. + process_key_lock(keycode, record) && + #endif process_record_kb(keycode, record) && #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) process_midi(keycode, record) && diff --git a/quantum/quantum.h b/quantum/quantum.h index 453cb43f8..9a6d691a1 100644 --- a/quantum/quantum.h +++ b/quantum/quantum.h @@ -99,6 +99,10 @@ extern uint32_t default_layer_state; #include "process_combo.h" #endif +#ifdef KEY_LOCK_ENABLE + #include "process_key_lock.h" +#endif + #define SEND_STRING(str) send_string(PSTR(str)) extern const bool ascii_to_shift_lut[0x80]; extern const uint8_t ascii_to_keycode_lut[0x80]; diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h index acdb9248d..1bb6706ba 100644 --- a/quantum/quantum_keycodes.h +++ b/quantum/quantum_keycodes.h @@ -419,6 +419,10 @@ enum quantum_keycodes { OUT_BT, #endif +#ifdef KEY_LOCK_ENABLE + KC_LOCK, +#endif + // always leave at the end SAFE_RANGE }; -- cgit v1.2.3-70-g09d2 From 02f405708bb3a486224b857feb1f03f883f55ffe Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Sun, 6 Aug 2017 13:22:26 -0700 Subject: Remove hex print code. --- quantum/process_keycode/process_key_lock.c | 1 - 1 file changed, 1 deletion(-) (limited to 'quantum') diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c index 60b0fcd9b..e3632b74f 100644 --- a/quantum/process_keycode/process_key_lock.c +++ b/quantum/process_keycode/process_key_lock.c @@ -45,7 +45,6 @@ #define SET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code) | SHIFT(GET_CODE_INDEX(code)))) #define UNSET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code)) & ~(SHIFT(GET_CODE_INDEX(code)))) #define IS_STANDARD_KEYCODE(code) ((code) <= 0xFF) -#define print_hex64(num) do { print_hex32((num & 0xFFFFFFFF00000000) >> 32); print_hex32(num & 0x00000000FFFFFFFF); } while (0) // Locked key state. This is an array of 256 bits, one for each of the standard keys supported qmk. uint64_t key_state[4] = { 0x0, 0x0, 0x0, 0x0 }; -- cgit v1.2.3-70-g09d2 From a3e1d9a8cc8b3d376d52f86aacae6315b15efebf Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Sun, 6 Aug 2017 14:14:27 -0700 Subject: Added support for locking One Shot modifiers. --- docs/key_lock.md | 2 +- keyboards/nyquist/keymaps/333fred/Makefile | 1 + quantum/process_keycode/process_key_lock.c | 41 ++++++++++++++++++++++-------- quantum/process_keycode/process_key_lock.h | 2 +- quantum/quantum.c | 2 +- 5 files changed, 34 insertions(+), 14 deletions(-) (limited to 'quantum') diff --git a/docs/key_lock.md b/docs/key_lock.md index 03cea2089..e424061a9 100644 --- a/docs/key_lock.md +++ b/docs/key_lock.md @@ -8,4 +8,4 @@ Here's how to use it: 2. Enable key lock by including `KEY_LOCK_ENABLE = yes` in your Makefile. 3. That's it! -Important: switching layers does not cancel the key lock. Additionally, key lock is only able to hold standard action keys. This does not include any of the QMK special functions, or shifted versions of keys such as KC_LPRN. If it's in the [basic_keycodes](basic_keycodes.md) list, it can be held. If it's not, then it can't be. +Important: switching layers does not cancel the key lock. Additionally, key lock is only able to hold standard action keys and One Shot modifier keys (for example, if you have your shift defined as `OSM(KC_LSFT)`; see [One Shot Keys](quantum_keycodes.md#one-shot-keys)). This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as KC_LPRN. If it's in the [basic_keycodes](basic_keycodes.md) list, it can be held. If it's not, then it can't be. diff --git a/keyboards/nyquist/keymaps/333fred/Makefile b/keyboards/nyquist/keymaps/333fred/Makefile index 576bb3c30..f85443280 100644 --- a/keyboards/nyquist/keymaps/333fred/Makefile +++ b/keyboards/nyquist/keymaps/333fred/Makefile @@ -1,5 +1,6 @@ KEY_LOCK_ENABLE = yes NKRO_ENABLE = yes +CONSOLE_ENABLE = yes ifndef QUANTUM_DIR include ../../../../Makefile diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c index e3632b74f..b1ba397a0 100644 --- a/quantum/process_keycode/process_key_lock.c +++ b/quantum/process_keycode/process_key_lock.c @@ -50,7 +50,16 @@ uint64_t key_state[4] = { 0x0, 0x0, 0x0, 0x0 }; bool watching = false; -bool process_key_lock(uint16_t keycode, keyrecord_t *record) { +// Translate any OSM keycodes back to their unmasked versions. +uint16_t inline translate_keycode(uint16_t keycode) { + if (keycode > QK_ONE_SHOT_MOD && keycode <= QK_ONE_SHOT_MOD_MAX) { + return keycode ^ QK_ONE_SHOT_MOD; + } else { + return keycode; + } +} + +bool process_key_lock(uint16_t *keycode, keyrecord_t *record) { // We start by categorizing the keypress event. In the event of a down // event, there are several possibilities: // 1. The key is not being locked, and we are not watching for new keys. @@ -76,44 +85,54 @@ bool process_key_lock(uint16_t keycode, keyrecord_t *record) { // 2. The key is being locked. In this case, we will mask the up event // by returning false, so the OS never sees that the key was released // until the user pressed the key again. + + // We translate any OSM keycodes back to their original keycodes, so that if the key being + // one-shot modded is a standard keycode, we can handle it. This is the only set of special + // keys that we handle + uint16_t translated_keycode = translate_keycode(*keycode); + if (record->event.pressed) { // Non-standard keycode, reset and return - if (!(IS_STANDARD_KEYCODE(keycode) || keycode == KC_LOCK)) { + if (!(IS_STANDARD_KEYCODE(translated_keycode) || translated_keycode == KC_LOCK)) { watching = false; return true; } // If we're already watching, turn off the watch. - if (keycode == KC_LOCK) { + if (translated_keycode == KC_LOCK) { watching = !watching; return false; } - - if (IS_STANDARD_KEYCODE(keycode)) { + + if (IS_STANDARD_KEYCODE(translated_keycode)) { // We check watching first. This is so that in the following scenario, we continue to // hold the key: KC_LOCK, KC_F, KC_LOCK, KC_F // If we checked in reverse order, we'd end up holding the key pressed after the second // KC_F press is registered, when the user likely meant to hold F if (watching) { watching = false; - SET_KEY_STATE(keycode); + SET_KEY_STATE(translated_keycode); + // We need to set the keycode passed in to be the translated keycode, in case we + // translated a OSM back to the original keycode. + *keycode = translated_keycode; // Let the standard keymap send the keycode down event. The up event will be masked. return true; } - - if (KEY_STATE(keycode)) { - UNSET_KEY_STATE(keycode); + + if (KEY_STATE(translated_keycode)) { + UNSET_KEY_STATE(translated_keycode); // The key is already held, stop this process. The up event will be sent when the user // releases the key. return false; } } - + // Either the key isn't a standard key, or we need to send the down event. Continue standard // processing return true; } else { // Stop processing if it's a standard key and we're masking up. - return !(IS_STANDARD_KEYCODE(keycode) && KEY_STATE(keycode)); + return !(IS_STANDARD_KEYCODE(translated_keycode) && KEY_STATE(translated_keycode)); } } + diff --git a/quantum/process_keycode/process_key_lock.h b/quantum/process_keycode/process_key_lock.h index 237e103bc..876db4a32 100644 --- a/quantum/process_keycode/process_key_lock.h +++ b/quantum/process_keycode/process_key_lock.h @@ -19,6 +19,6 @@ #include "quantum.h" -bool process_key_lock(uint16_t keycode, keyrecord_t *record); +bool process_key_lock(uint16_t *keycode, keyrecord_t *record); #endif // PROCESS_KEY_LOCK_H diff --git a/quantum/quantum.c b/quantum/quantum.c index c71a97bf2..0243a7e01 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -195,7 +195,7 @@ bool process_record_quantum(keyrecord_t *record) { if (!( #if defined(KEY_LOCK_ENABLE) // Must run first to be able to mask key_up events. - process_key_lock(keycode, record) && + process_key_lock(&keycode, record) && #endif process_record_kb(keycode, record) && #if defined(MIDI_ENABLE) && defined(MIDI_ADVANCED) -- cgit v1.2.3-70-g09d2 From 114565fe811f0264acfa52c38f993b37b0add43d Mon Sep 17 00:00:00 2001 From: Fredric Silberberg Date: Mon, 7 Aug 2017 22:05:59 -0700 Subject: Rename SHIFT macro to BV_64 --- quantum/process_keycode/process_key_lock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'quantum') diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c index b1ba397a0..d7978f91c 100644 --- a/quantum/process_keycode/process_key_lock.c +++ b/quantum/process_keycode/process_key_lock.c @@ -18,14 +18,14 @@ #include "stdint.h" #include "process_key_lock.h" -#define SHIFT(shift) (((uint64_t)1) << (shift)) +#define BV_64(shift) (((uint64_t)1) << (shift)) #define GET_KEY_ARRAY(code) (((code) < 0x40) ? key_state[0] : \ ((code) < 0x80) ? key_state[1] : \ ((code) < 0xC0) ? key_state[2] : key_state[3]) #define GET_CODE_INDEX(code) (((code) < 0x40) ? (code) : \ ((code) < 0x80) ? (code) - 0x40 : \ ((code) < 0xC0) ? (code) - 0x80 : (code) - 0xC0) -#define KEY_STATE(code) (GET_KEY_ARRAY(code) & SHIFT(GET_CODE_INDEX(code))) == SHIFT(GET_CODE_INDEX(code)) +#define KEY_STATE(code) (GET_KEY_ARRAY(code) & BV_64(GET_CODE_INDEX(code))) == BV_64(GET_CODE_INDEX(code)) #define SET_KEY_ARRAY_STATE(code, val) do { \ switch (code) { \ case 0x00 ... 0x3F: \ @@ -42,8 +42,8 @@ break; \ } \ } while(0) -#define SET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code) | SHIFT(GET_CODE_INDEX(code)))) -#define UNSET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code)) & ~(SHIFT(GET_CODE_INDEX(code)))) +#define SET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code) | BV_64(GET_CODE_INDEX(code)))) +#define UNSET_KEY_STATE(code) SET_KEY_ARRAY_STATE(code, (GET_KEY_ARRAY(code)) & ~(BV_64(GET_CODE_INDEX(code)))) #define IS_STANDARD_KEYCODE(code) ((code) <= 0xFF) // Locked key state. This is an array of 256 bits, one for each of the standard keys supported qmk. -- cgit v1.2.3-70-g09d2 From 6895c4510e1e683bf2cfa4a78dbde57a2a8554e4 Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Thu, 10 Aug 2017 16:52:24 -0400 Subject: fix default layer songs --- lib/chibios | 2 +- quantum/quantum.c | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) (limited to 'quantum') diff --git a/lib/chibios b/lib/chibios index 8fce03b3a..d34e8eb83 160000 --- a/lib/chibios +++ b/lib/chibios @@ -1 +1 @@ -Subproject commit 8fce03b3a75c743e5d5c40b9d59c1637c59d22a7 +Subproject commit d34e8eb83101a95f98892bf68605fe545821f320 diff --git a/quantum/quantum.c b/quantum/quantum.c index 0243a7e01..7a632d709 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -40,13 +40,12 @@ extern backlight_config_t backlight_config; #ifndef AG_SWAP_SONG #define AG_SWAP_SONG SONG(AG_SWAP_SOUND) #endif - #ifndef DEFAULT_LAYER_SONGS - #define DEFAULT_LAYER_SONGS { } - #endif float goodbye_song[][2] = GOODBYE_SONG; float ag_norm_song[][2] = AG_NORM_SONG; float ag_swap_song[][2] = AG_SWAP_SONG; - float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; + #ifdef DEFAULT_LAYER_SONGS + float default_layer_songs[][16][2] = DEFAULT_LAYER_SONGS; + #endif #endif static void do_code16 (uint16_t code, void (*f) (uint8_t)) { @@ -560,7 +559,7 @@ void send_string_with_delay(const char *str, uint8_t interval) { } void set_single_persistent_default_layer(uint8_t default_layer) { - #ifdef AUDIO_ENABLE + #if defined(AUDIO_ENABLE) && defined(DEFAULT_LAYER_SONGS) PLAY_SONG(default_layer_songs[default_layer]); #endif eeconfig_update_default_layer(1U< Date: Fri, 11 Aug 2017 18:53:08 +0200 Subject: add option to let ctrl override shift/gui for the GRAVE_ESC. This enables the ctrl+shift+esc shortcut to task manager on windows. --- keyboards/bananasplit/keymaps/coloneljesus/config.h | 1 + quantum/quantum.c | 5 +++++ 2 files changed, 6 insertions(+) (limited to 'quantum') diff --git a/keyboards/bananasplit/keymaps/coloneljesus/config.h b/keyboards/bananasplit/keymaps/coloneljesus/config.h index 060f5922f..af6cf8ef1 100644 --- a/keyboards/bananasplit/keymaps/coloneljesus/config.h +++ b/keyboards/bananasplit/keymaps/coloneljesus/config.h @@ -20,5 +20,6 @@ #include "../../config.h" // place overrides here +#define GRAVE_ESC_CTRL_OVERRIDE #endif diff --git a/quantum/quantum.c b/quantum/quantum.c index 7a632d709..db52c782f 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -478,6 +478,11 @@ bool process_record_quantum(keyrecord_t *record) { void (*method)(uint8_t) = (record->event.pressed) ? &add_key : &del_key; uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT) |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))); + +#ifdef GRAVE_ESC_CTRL_OVERRIDE + if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) + shifted = 0; +#endif method(shifted ? KC_GRAVE : KC_ESCAPE); send_keyboard_report(); -- cgit v1.2.3-70-g09d2 From 188ed682e37dba98a8ba86240abf182a8a6d4268 Mon Sep 17 00:00:00 2001 From: Balz Guenat Date: Fri, 11 Aug 2017 21:43:49 +0200 Subject: add short comment to grave_esc_ctrl_override --- quantum/quantum.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'quantum') diff --git a/quantum/quantum.c b/quantum/quantum.c index db52c782f..aac1d07a9 100644 --- a/quantum/quantum.c +++ b/quantum/quantum.c @@ -480,6 +480,8 @@ bool process_record_quantum(keyrecord_t *record) { |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))); #ifdef GRAVE_ESC_CTRL_OVERRIDE + // if CTRL is pressed, ESC is always read as ESC, even if SHIFT or GUI is pressed. + // this is handy for the ctrl+shift+esc shortcut on windows, among other things. if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) shifted = 0; #endif -- cgit v1.2.3-70-g09d2 From 5ad103fa51083cb26d3516e5598b7b2a099b1521 Mon Sep 17 00:00:00 2001 From: Balz Guenat Date: Fri, 11 Aug 2017 22:20:36 +0200 Subject: add description of new option to docs and add option (commented out) into template. --- docs/faq_keymap.md | 4 +++- quantum/template/config.h | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'quantum') diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md index d6442ac53..3c2795816 100644 --- a/docs/faq_keymap.md +++ b/docs/faq_keymap.md @@ -116,7 +116,9 @@ https://github.com/tekezo/Karabiner/issues/403 ## Esc and `~ on a key -Use `GRAVE_ESC` or `KC_GESC` in your keymap. +Use `GRAVE_ESC` or `KC_GESC` in your keymap. `GUI`+`GRAVE_ESC` results in `\`` and `SHIFT`+`GRAVE_ESC` results in `~`. + +Note that this will break the CTRL+SHIFT+ESC shortcut to the Windows task manager. Use `#define GRAVE_ESC_CTRL_OVERRIDE` in your `config.h` to get the shortcut back. With this option, `ESC_GRAVE` results in `ESC` if `CTRL` is held, even if `SHIFT` or `GUI` are also held. ## Arrow on Right Modifier keys with Dual-Role This turns right modifer keys into arrow keys when the keys are tapped while still modifiers when the keys are hold. In TMK the dual-role function is dubbed **TAP**. diff --git a/quantum/template/config.h b/quantum/template/config.h index dbca45765..700a56f52 100644 --- a/quantum/template/config.h +++ b/quantum/template/config.h @@ -67,6 +67,11 @@ along with this program. If not, see . /* Locking resynchronize hack */ #define LOCKING_RESYNC_ENABLE +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is userful for the Windows task manager shortcut (ctrl+shift+esc). + */ +// #define GRAVE_ESC_CTRL_OVERRIDE + /* * Force NKRO * -- cgit v1.2.3-70-g09d2