From b82621c4ecd2697ac397ca0e47d5d75bf028632a Mon Sep 17 00:00:00 2001 From: vaxerski Date: Tue, 20 Sep 2022 10:02:20 +0100 Subject: [PATCH] fix mouse binds being stuck --- src/managers/KeybindManager.cpp | 23 +++++++++++++++++++++++ src/managers/KeybindManager.hpp | 3 +++ 2 files changed, 26 insertions(+) diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 47f42e2b..58da358c 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -129,6 +129,19 @@ void CKeybindManager::updateXKBTranslationState() { m_pXKBTranslationState = xkb_state_new(PKEYMAP); } +void CKeybindManager::ensureMouseBindState() { + if (!m_bIsMouseBindActive) + return; + + if (g_pInputManager->currentlyDraggedWindow) { + g_pLayoutManager->getCurrentLayout()->onEndDragWindow(); + g_pInputManager->currentlyDraggedWindow = nullptr; + g_pInputManager->dragMode = MBIND_INVALID; + } + + m_bIsMouseBindActive = false; +} + bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard) { if (!g_pCompositor->m_bSessionActive) { m_dPressedKeycodes.clear(); @@ -161,6 +174,8 @@ bool CKeybindManager::onKeyEvent(wlr_keyboard_key_event* e, SKeyboard* pKeyboard m_uLastCode = KEYCODE; m_uLastMouseCode = 0; + ensureMouseBindState(); + bool found = false; if (e->state == WL_KEYBOARD_KEY_STATE_PRESSED) { // clean repeat @@ -1587,11 +1602,15 @@ void CKeybindManager::mouse(std::string args) { if (TRUEARG == "movewindow") { if (PRESSED) { + g_pKeybindManager->m_bIsMouseBindActive = true; + g_pInputManager->currentlyDraggedWindow = g_pCompositor->windowFromCursor(); g_pInputManager->dragMode = MBIND_MOVE; g_pLayoutManager->getCurrentLayout()->onBeginDragWindow(); } else { + g_pKeybindManager->m_bIsMouseBindActive = false; + if (g_pInputManager->currentlyDraggedWindow) { g_pLayoutManager->getCurrentLayout()->onEndDragWindow(); g_pInputManager->currentlyDraggedWindow = nullptr; @@ -1600,11 +1619,15 @@ void CKeybindManager::mouse(std::string args) { } } else if (TRUEARG == "resizewindow") { if (PRESSED) { + g_pKeybindManager->m_bIsMouseBindActive = true; + g_pInputManager->currentlyDraggedWindow = g_pCompositor->windowFromCursor(); g_pInputManager->dragMode = MBIND_RESIZE; g_pLayoutManager->getCurrentLayout()->onBeginDragWindow(); } else { + g_pKeybindManager->m_bIsMouseBindActive = false; + if (g_pInputManager->currentlyDraggedWindow) { g_pLayoutManager->getCurrentLayout()->onEndDragWindow(); g_pInputManager->currentlyDraggedWindow = nullptr; diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index ab883c40..d782842c 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -64,6 +64,8 @@ private: uint32_t m_uLastCode = 0; uint32_t m_uLastMouseCode = 0; + bool m_bIsMouseBindActive = false; + int m_iPassPressed = -1; // used for pass CTimer m_tScrollTimer; @@ -76,6 +78,7 @@ private: xkb_state* m_pXKBTranslationState = nullptr; void updateXKBTranslationState(); + void ensureMouseBindState(); // -------------- Dispatchers -------------- // static void killActive(std::string);