From c98acaed62db806c41b7d1b5ad63a89f18bce70a Mon Sep 17 00:00:00 2001 From: Vaxry Date: Thu, 9 May 2024 14:07:21 +0100 Subject: [PATCH] virtual-keyboard: release keys before destroy --- src/managers/input/InputManager.cpp | 2 ++ src/protocols/VirtualKeyboard.cpp | 18 ++++++++++++++++++ src/protocols/VirtualKeyboard.hpp | 2 ++ 3 files changed, 22 insertions(+) diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 7e746cfc..8d67760d 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -800,6 +800,7 @@ void CInputManager::setupKeyboard(SP keeb) { keeb->keyboardEvents.key.registerStaticListener( [this](void* owner, std::any data) { auto PKEEB = ((IKeyboard*)owner)->self.lock(); + onKeyboardKey(data, PKEEB); }, keeb.get()); @@ -807,6 +808,7 @@ void CInputManager::setupKeyboard(SP keeb) { keeb->keyboardEvents.modifiers.registerStaticListener( [this](void* owner, std::any data) { auto PKEEB = ((IKeyboard*)owner)->self.lock(); + onKeyboardMod(PKEEB); }, keeb.get()); diff --git a/src/protocols/VirtualKeyboard.cpp b/src/protocols/VirtualKeyboard.cpp index 3d67bd06..7325f7cd 100644 --- a/src/protocols/VirtualKeyboard.cpp +++ b/src/protocols/VirtualKeyboard.cpp @@ -12,10 +12,12 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP return; resource->setDestroy([this](CZwpVirtualKeyboardV1* r) { + releasePressed(); events.destroy.emit(); PROTO::virtualKeyboard->destroyResource(this); }); resource->setOnDestroy([this](CZwpVirtualKeyboardV1* r) { + releasePressed(); events.destroy.emit(); PROTO::virtualKeyboard->destroyResource(this); }); @@ -101,6 +103,22 @@ wl_client* CVirtualKeyboardV1Resource::client() { return resource->client(); } +void CVirtualKeyboardV1Resource::releasePressed() { + timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + size_t keycodesNum = keyboard.num_keycodes; + + for (size_t i = 0; i < keycodesNum; ++i) { + struct wlr_keyboard_key_event event = { + .time_msec = (now.tv_sec * 1000 + now.tv_nsec / 1000000), + .keycode = keyboard.keycodes[keycodesNum - i - 1], + .update_state = false, + .state = WL_KEYBOARD_KEY_STATE_RELEASED, + }; + wlr_keyboard_notify_key(&keyboard, &event); // updates num_keycodes + } +} + CVirtualKeyboardProtocol::CVirtualKeyboardProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) { ; } diff --git a/src/protocols/VirtualKeyboard.hpp b/src/protocols/VirtualKeyboard.hpp index 5ce3d748..447b5db9 100644 --- a/src/protocols/VirtualKeyboard.hpp +++ b/src/protocols/VirtualKeyboard.hpp @@ -24,6 +24,8 @@ class CVirtualKeyboardV1Resource { SP resource; wlr_keyboard keyboard; + void releasePressed(); + bool hasKeymap = false; };