diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 7e746cfc4..8d67760d2 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 3d67bd060..7325f7cd4 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 5ce3d7481..447b5db90 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; };