summaryrefslogtreecommitdiff
path: root/src/protocols/VirtualKeyboard.cpp
diff options
context:
space:
mode:
authorVaxry <vaxry@vaxry.net>2024-05-09 14:07:21 +0100
committerVaxry <vaxry@vaxry.net>2024-05-09 14:07:21 +0100
commitc98acaed62db806c41b7d1b5ad63a89f18bce70a (patch)
tree8c7082a16c4c1b05ae1622f532aa9d245ed2a313 /src/protocols/VirtualKeyboard.cpp
parent67a5377b41f121017ed4295a3a592a19b4b7fbfb (diff)
virtual-keyboard: release keys before destroy
Diffstat (limited to 'src/protocols/VirtualKeyboard.cpp')
-rw-r--r--src/protocols/VirtualKeyboard.cpp18
1 files changed, 18 insertions, 0 deletions
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<CZwpVirtualKeyboardV1>
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) {
;
}