From b0d85795f4390e2255ae99cf31ac5c64ca6b25d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 7 Jun 2018 14:42:23 +0200 Subject: [PATCH] Make the double tap to lock feature behave well. --- right/src/layer.c | 3 +-- right/src/usb_report_updater.c | 7 +++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/right/src/layer.c b/right/src/layer.c index 0cc851f..9ad9541 100644 --- a/right/src/layer.c +++ b/right/src/layer.c @@ -20,8 +20,7 @@ void updateLayerStates(void) if (action.type == KeyActionType_SwitchLayer) { if (action.switchLayer.mode != SwitchLayerMode_Toggle) { heldLayers[action.switchLayer.layer] = true; - } - if (action.switchLayer.mode != SwitchLayerMode_Hold && !keyState->previous && keyState->current) { + } else if (!keyState->previous) { toggledLayers[action.switchLayer.layer] = true; } } diff --git a/right/src/usb_report_updater.c b/right/src/usb_report_updater.c index 6c450dc..637ec8b 100644 --- a/right/src/usb_report_updater.c +++ b/right/src/usb_report_updater.c @@ -200,6 +200,7 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action) static key_state_t *doubleTapSwitchLayerKey; static uint32_t doubleTapSwitchLayerStartTime; static uint32_t doubleTapSwitchLayerTriggerTime; + static bool IsLayerDoubleTapToggled; if (keyState->suppressed) { return; @@ -209,6 +210,11 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action) doubleTapSwitchLayerKey = NULL; } + if (!keyState->previous && IsLayerDoubleTapToggled && ToggledLayer == action->switchLayer.layer) { + ToggledLayer = LayerId_Base; + IsLayerDoubleTapToggled = false; + } + switch (action->type) { case KeyActionType_Keystroke: ActiveUsbBasicKeyboardReport->modifiers |= action->keystroke.modifiers; @@ -247,6 +253,7 @@ static void applyKeyAction(key_state_t *keyState, key_action_t *action) if (!keyState->previous && previousLayer == LayerId_Base && action->switchLayer.mode == SwitchLayerMode_HoldAndDoubleTapToggle) { if (doubleTapSwitchLayerKey && Timer_GetElapsedTimeAndSetCurrent(&doubleTapSwitchLayerStartTime) < DoubleTapSwitchLayerTimeout) { ToggledLayer = action->switchLayer.layer; + IsLayerDoubleTapToggled = true; doubleTapSwitchLayerTriggerTime = Timer_GetCurrentTime(); } else { doubleTapSwitchLayerKey = keyState;