diff options
| author | Vaxry <vaxry@vaxry.net> | 2024-05-09 14:07:21 +0100 |
|---|---|---|
| committer | Vaxry <vaxry@vaxry.net> | 2024-05-09 14:07:21 +0100 |
| commit | c98acaed62db806c41b7d1b5ad63a89f18bce70a (patch) | |
| tree | 8c7082a16c4c1b05ae1622f532aa9d245ed2a313 /src/protocols/VirtualKeyboard.cpp | |
| parent | 67a5377b41f121017ed4295a3a592a19b4b7fbfb (diff) | |
virtual-keyboard: release keys before destroy
Diffstat (limited to 'src/protocols/VirtualKeyboard.cpp')
| -rw-r--r-- | src/protocols/VirtualKeyboard.cpp | 18 |
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) { ; } |
