aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/_summary.md1
-rw-r--r--docs/faq_keymap.md6
-rw-r--r--docs/feature_grave_esc.md17
-rw-r--r--quantum/quantum.c27
4 files changed, 45 insertions, 6 deletions
diff --git a/docs/_summary.md b/docs/_summary.md
index 3c10e101d..2c0fc17e3 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -26,6 +26,7 @@
26 * [Backlight](feature_backlight.md) 26 * [Backlight](feature_backlight.md)
27 * [Bootmagic](feature_bootmagic.md) 27 * [Bootmagic](feature_bootmagic.md)
28 * [Dynamic Macros](feature_dynamic_macros.md) 28 * [Dynamic Macros](feature_dynamic_macros.md)
29 * [Grave Escape](feature_grave_escape.md)
29 * [Key Lock](feature_key_lock.md) 30 * [Key Lock](feature_key_lock.md)
30 * [Layouts](feature_layouts.md) 31 * [Layouts](feature_layouts.md)
31 * [Leader Key](feature_leader_key.md) 32 * [Leader Key](feature_leader_key.md)
diff --git a/docs/faq_keymap.md b/docs/faq_keymap.md
index 83eeb235e..6a364eb53 100644
--- a/docs/faq_keymap.md
+++ b/docs/faq_keymap.md
@@ -125,11 +125,9 @@ https://github.com/tmk/tmk_keyboard/issues/213
125https://github.com/tekezo/Karabiner/issues/403 125https://github.com/tekezo/Karabiner/issues/403
126 126
127 127
128## Esc and `~ on a key 128## Esc and `~ on a single key
129 129
130Use `GRAVE_ESC` or `KC_GESC` in your keymap. `GUI`+`GRAVE_ESC` results in `` ` `` and `SHIFT`+`GRAVE_ESC` results in `~`. 130See the [Grave Escape](feature_grave_escape.md) feature.
131
132Note 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.
133 131
134## Arrow on Right Modifier keys with Dual-Role 132## Arrow on Right Modifier keys with Dual-Role
135This 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**. 133This 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/docs/feature_grave_esc.md b/docs/feature_grave_esc.md
new file mode 100644
index 000000000..ea3c55c63
--- /dev/null
+++ b/docs/feature_grave_esc.md
@@ -0,0 +1,17 @@
1# Grave Escape
2
3Grave Escape is a feature that allows you to share the grave key (`\`` and `~`) on the same key as Escape. When `KC_GESC` is used it will act as `KC_ESC`, unless Shift or GUI is pressed, in which case it will act as `KC_GRAVE`.
4
5
6| Key | Alias | Description |
7|-----|-------|-------------|
8| `GRAVE_ESC` | `KC_GESC` | Act as `KC_ESC` normally, or `KC_GRAVE` when GUI or Shift are held. |
9
10There are several possible key combinations this will break, among them Ctrl+Shift+Esc on Windows and Cmd+Opt+Esc on macOS. You can use these options in your `config.h` to work around this:
11
12| Option | Description |
13|--------|-------------|
14| `GRAVE_ESC_ALT_OVERRIDE` | Always send Escape if Alt is pressed. |
15| `GRAVE_ESC_CTRL_OVERRIDE` | Always send Escape if Ctrl is pressed. |
16| `GRAVE_ESC_GUI_OVERRIDE` | Always send Escape if GUI is pressed. |
17| `GRAVE_ESC_SHIFT_OVERRIDE` | Always send Escape if SHIFT is pressed. |
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 9232cf441..d08f15870 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -548,11 +548,34 @@ bool process_record_quantum(keyrecord_t *record) {
548 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT) 548 uint8_t shifted = get_mods() & ((MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT)
549 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))); 549 |MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI)));
550 550
551#ifdef GRAVE_ESC_ALT_OVERRIDE
552 // if ALT is pressed, ESC is always sent
553 // this is handy for the cmd+opt+esc shortcut on macOS, among other things.
554 if (get_mods() & (MOD_BIT(KC_LALT) | MOD_BIT(KC_RALT))) {
555 shifted = 0;
556 }
557#endif
558
551#ifdef GRAVE_ESC_CTRL_OVERRIDE 559#ifdef GRAVE_ESC_CTRL_OVERRIDE
552 // if CTRL is pressed, ESC is always read as ESC, even if SHIFT or GUI is pressed. 560 // if CTRL is pressed, ESC is always sent
553 // this is handy for the ctrl+shift+esc shortcut on windows, among other things. 561 // this is handy for the ctrl+shift+esc shortcut on windows, among other things.
554 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) 562 if (get_mods() & (MOD_BIT(KC_LCTL) | MOD_BIT(KC_RCTL))) {
555 shifted = 0; 563 shifted = 0;
564 }
565#endif
566
567#ifdef GRAVE_ESC_GUI_OVERRIDE
568 // if GUI is pressed, ESC is always sent
569 if (get_mods() & (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI))) {
570 shifted = 0;
571 }
572#endif
573
574#ifdef GRAVE_ESC_SHIFT_OVERRIDE
575 // if SHIFT is pressed, ESC is always sent
576 if (get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
577 shifted = 0;
578 }
556#endif 579#endif
557 580
558 if (record->event.pressed) { 581 if (record->event.pressed) {