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 0000000000..60b0fcd9b1
--- /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 0000000000..237e103bcd
--- /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 1f8ce6c46f..c71a97bf28 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 453cb43f88..9a6d691a15 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 acdb9248d6..1bb6706ba4 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
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 60b0fcd9b1..e3632b74fb 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
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 03cea20890..e424061a9a 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 576bb3c30e..f854432807 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 e3632b74fb..b1ba397a02 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 237e103bcd..876db4a324 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 c71a97bf28..0243a7e012 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
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 b1ba397a02..d7978f91c7 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
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 8fce03b3a7..d34e8eb831 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 0243a7e012..7a632d709a 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<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
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 db52c782fc..aac1d07a9b 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
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 d6442ac53a..3c27958168 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 dbca45765d..700a56f527 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