summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalz Guenat <balz.guenat@gmail.com>2017-08-12 11:57:42 +0200
committerBalz Guenat <balz.guenat@gmail.com>2017-08-12 12:15:36 +0200
commitb4be711af1794d2f5eeb4ce1a1db38a1b5d8fd6d (patch)
tree1050c65d0605ff2932677ffbb29e56431e5716d1
parent430151dd51b8b0d925850ad4d52c8bae41d3c154 (diff)
downloadqmk_firmware-b4be711af1794d2f5eeb4ce1a1db38a1b5d8fd6d.tar.gz
qmk_firmware-b4be711af1794d2f5eeb4ce1a1db38a1b5d8fd6d.tar.xz
fix for issue #1568
-rw-r--r--quantum/quantum.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index aac1d07a9..65213eaea 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -161,6 +161,11 @@ void reset_keyboard(void) {
static bool shift_interrupted[2] = {0, 0};
static uint16_t scs_timer[2] = {0, 0};
+/* true if the last press of GRAVE_ESC was shifted (i.e. GUI or SHIFT were pressed), false otherwise.
+ * Used to ensure that the correct keycode is released if the key is released.
+ */
+static bool grave_esc_was_shifted = false;
+
bool process_record_quantum(keyrecord_t *record) {
/* This gets the keycode from the key pressed */
@@ -475,10 +480,9 @@ bool process_record_quantum(keyrecord_t *record) {
// break;
}
case GRAVE_ESC: {
- 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 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.
@@ -486,8 +490,15 @@ bool process_record_quantum(keyrecord_t *record) {
shifted = 0;
#endif
- method(shifted ? KC_GRAVE : KC_ESCAPE);
- send_keyboard_report();
+ if (record->event.pressed) {
+ grave_esc_was_shifted = shifted;
+ add_key(shifted ? KC_GRAVE : KC_ESCAPE);
+ }
+ else {
+ del_key(grave_esc_was_shifted ? KC_GRAVE : KC_ESCAPE);
+ }
+
+ send_keyboard_report();
}
default: {
shift_interrupted[0] = true;