From 84768d505ca5ca7726af89702662c0f271323915 Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 8 Aug 2017 16:02:53 +0200 Subject: [PATCH 1/2] Layer_::updateKeyCache: Guard against out of bounds key coordinates It may happen that we get passed an UNKNOWN_KEYSWITCH_LOCATION, which will always be out of bounds. Lets not corrupt random memory when in this situation, but instead, return quickly. Signed-off-by: Gergely Nagy --- src/layers.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/layers.cpp b/src/layers.cpp index c05bde63..694e98c5 100644 --- a/src/layers.cpp +++ b/src/layers.cpp @@ -84,6 +84,9 @@ void Layer_::updateKeyCache(byte row, byte col) { int8_t layer = highestLayer; + if (row >= ROWS || col >= COLS) + return; + for (layer = highestLayer; layer >= DefaultLayer; layer--) { if (Layer.isOn(layer)) { Key mappedKey = (*getKey)(layer, row, col); From 96b1979ca5f3849f0fc5622e852fcf492faef7ab Mon Sep 17 00:00:00 2001 From: Gergely Nagy Date: Tue, 8 Aug 2017 16:05:08 +0200 Subject: [PATCH 2/2] Layer: Make the repeating behaviour the default and only variant Signed-off-by: Gergely Nagy --- src/layers.cpp | 19 ------------------- src/layers.h | 2 -- 2 files changed, 21 deletions(-) diff --git a/src/layers.cpp b/src/layers.cpp index 694e98c5..73a3c341 100644 --- a/src/layers.cpp +++ b/src/layers.cpp @@ -6,7 +6,6 @@ static uint32_t LayerState; uint8_t Layer_::highestLayer; Key Layer_::keyMap[ROWS][COLS]; Key(*Layer_::getKey)(uint8_t layer, byte row, byte col) = Layer.getKeyFromPROGMEM; -bool Layer_::repeat_first_press; static void handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) { if (keymapEntry.keyCode >= MOMENTARY_OFFSET) { @@ -29,24 +28,6 @@ static void handleKeymapKeyswitchEvent(Key keymapEntry, uint8_t keyState) { } else { Layer.off(target); } - - /* - * When toggling a layer off, we mask all keys still held. Masked keys - * will be ignored until released and pressed again (see - * `handleKeyswitchEvent` in key_events.cpp). - * - * We do this because when holding a momentary layer switch key, then - * pressing and holding some others, they will fire as keys on the - * momentary layer. But if we release the momentary layer switch key - * before releasing the others, they will continue firing, but from - * another layer. When typing fast, it may easily happen that we end up in - * a situation where the layer key releases first (in the same scan cycle, - * but handled first), and it will emit a key from the wrong layer. So we - * ignore held keys after releasing a layer key, until they are pressed - * again, to avoid the aforementioned issue. - */ - if (!Layer.repeat_first_press) - KeyboardHardware.maskHeldKeys(); } // switch keymap and stay there diff --git a/src/layers.h b/src/layers.h index 69d84899..60cf1b49 100644 --- a/src/layers.h +++ b/src/layers.h @@ -34,8 +34,6 @@ class Layer_ { static void updateKeyCache(byte row, byte col); - static bool repeat_first_press; - private: static uint8_t highestLayer; static Key keyMap[ROWS][COLS];