diff options
| author | JS Deck <jsdeckerido@gmail.com> | 2025-08-04 16:29:39 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-04 21:29:39 +0200 |
| commit | 2be309de1df5e4262175fbcc58e6dd8de4e0e6d3 (patch) | |
| tree | 866629ba5a4b9b45d8720383e4332726444f3566 /src/protocols/VirtualKeyboard.cpp | |
| parent | 6491bb4fb7c7e86d9168a104d5b87ace4e1b978d (diff) | |
virtualkeyboard: Add options to skip releasing pressed keys on close and to skip sharing key states (#11214)
Diffstat (limited to 'src/protocols/VirtualKeyboard.cpp')
| -rw-r--r-- | src/protocols/VirtualKeyboard.cpp | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/src/protocols/VirtualKeyboard.cpp b/src/protocols/VirtualKeyboard.cpp index 7512f9bd..3dc15d83 100644 --- a/src/protocols/VirtualKeyboard.cpp +++ b/src/protocols/VirtualKeyboard.cpp @@ -1,23 +1,42 @@ #include "VirtualKeyboard.hpp" +#include <filesystem> #include <sys/mman.h> +#include "../config/ConfigValue.hpp" +#include "../config/ConfigManager.hpp" #include "../devices/IKeyboard.hpp" #include "../helpers/time/Time.hpp" +#include "../helpers/MiscFunctions.hpp" using namespace Hyprutils::OS; +static std::string virtualKeyboardNameForWlClient(wl_client* client) { + std::string name = "hl-virtual-keyboard"; + + static auto PVKNAMEPROC = CConfigValue<Hyprlang::INT>("misc:name_vk_after_proc"); + if (!*PVKNAMEPROC) + return name; + + name += "-"; + const auto CLIENTNAME = binaryNameForWlClient(client); + if (CLIENTNAME.has_value()) { + const auto PATH = std::filesystem::path(CLIENTNAME.value()); + if (PATH.has_filename()) { + const auto FILENAME = PATH.filename(); + const auto NAME = deviceNameToInternalString(FILENAME); + name += NAME; + return name; + } + } + + name += "unknown"; + return name; +} + CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP<CZwpVirtualKeyboardV1> resource_) : m_resource(resource_) { if UNLIKELY (!good()) return; - m_resource->setDestroy([this](CZwpVirtualKeyboardV1* r) { - releasePressed(); - m_events.destroy.emit(); - PROTO::virtualKeyboard->destroyResource(this); - }); - m_resource->setOnDestroy([this](CZwpVirtualKeyboardV1* r) { - releasePressed(); - m_events.destroy.emit(); - PROTO::virtualKeyboard->destroyResource(this); - }); + m_resource->setDestroy([this](CZwpVirtualKeyboardV1* r) { destroy(); }); + m_resource->setOnDestroy([this](CZwpVirtualKeyboardV1* r) { destroy(); }); m_resource->setKey([this](CZwpVirtualKeyboardV1* r, uint32_t timeMs, uint32_t key, uint32_t state) { if UNLIKELY (!m_hasKeymap) { @@ -31,7 +50,7 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP<CZwpVirtualKeyboardV1> .state = (wl_keyboard_key_state)state, }); - const bool CONTAINS = std::ranges::find(m_pressed, key) != m_pressed.end(); + const bool CONTAINS = std::ranges::contains(m_pressed, key); if (state && !CONTAINS) m_pressed.emplace_back(key); else if (!state && CONTAINS) @@ -88,7 +107,7 @@ CVirtualKeyboardV1Resource::CVirtualKeyboardV1Resource(SP<CZwpVirtualKeyboardV1> xkb_context_unref(xkbContext); }); - m_name = "hl-virtual-keyboard"; + m_name = virtualKeyboardNameForWlClient(resource_->client()); } CVirtualKeyboardV1Resource::~CVirtualKeyboardV1Resource() { @@ -115,6 +134,14 @@ void CVirtualKeyboardV1Resource::releasePressed() { m_pressed.clear(); } +void CVirtualKeyboardV1Resource::destroy() { + const auto RELEASEPRESSED = g_pConfigManager->getDeviceInt(m_name, "release_pressed_on_close", "input:virtualkeyboard:release_pressed_on_close"); + if (RELEASEPRESSED) + releasePressed(); + m_events.destroy.emit(); + PROTO::virtualKeyboard->destroyResource(this); +} + CVirtualKeyboardProtocol::CVirtualKeyboardProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) { ; } |
