From 2be309de1df5e4262175fbcc58e6dd8de4e0e6d3 Mon Sep 17 00:00:00 2001 From: JS Deck Date: Mon, 4 Aug 2025 16:29:39 -0300 Subject: virtualkeyboard: Add options to skip releasing pressed keys on close and to skip sharing key states (#11214) --- src/protocols/core/Seat.cpp | 21 ++++++++++++--------- src/protocols/core/Seat.hpp | 3 ++- 2 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src/protocols/core') diff --git a/src/protocols/core/Seat.cpp b/src/protocols/core/Seat.cpp index 53123abe..8aa2f36a 100644 --- a/src/protocols/core/Seat.cpp +++ b/src/protocols/core/Seat.cpp @@ -305,8 +305,14 @@ CWLKeyboardResource::CWLKeyboardResource(SP resource_, SPm_keyboard.lock()); repeatInfo(g_pSeatManager->m_keyboard->m_repeatRate, g_pSeatManager->m_keyboard->m_repeatDelay); - if (g_pSeatManager->m_state.keyboardFocus && g_pSeatManager->m_state.keyboardFocus->client() == m_resource->client()) - sendEnter(g_pSeatManager->m_state.keyboardFocus.lock()); + if (g_pSeatManager->m_state.keyboardFocus && g_pSeatManager->m_state.keyboardFocus->client() == m_resource->client()) { + wl_array keys; + wl_array_init(&keys); + + sendEnter(g_pSeatManager->m_state.keyboardFocus.lock(), &keys); + + wl_array_release(&keys); + } } bool CWLKeyboardResource::good() { @@ -334,7 +340,9 @@ void CWLKeyboardResource::sendKeymap(SP keyboard) { m_resource->sendKeymap(format, fd.get(), size); } -void CWLKeyboardResource::sendEnter(SP surface) { +void CWLKeyboardResource::sendEnter(SP surface, wl_array* keys) { + ASSERT(keys); + if (!m_owner || m_currentSurface == surface || !surface->getResource()->resource()) return; @@ -351,12 +359,7 @@ void CWLKeyboardResource::sendEnter(SP surface) { m_currentSurface = surface; m_listeners.destroySurface = surface->m_events.destroy.listen([this] { sendLeave(); }); - wl_array arr; - wl_array_init(&arr); - - m_resource->sendEnter(g_pSeatManager->nextSerial(m_owner.lock()), surface->getResource().get(), &arr); - - wl_array_release(&arr); + m_resource->sendEnter(g_pSeatManager->nextSerial(m_owner.lock()), surface->getResource().get(), keys); } void CWLKeyboardResource::sendLeave() { diff --git a/src/protocols/core/Seat.hpp b/src/protocols/core/Seat.hpp index 0c14e52a..8b8f6004 100644 --- a/src/protocols/core/Seat.hpp +++ b/src/protocols/core/Seat.hpp @@ -12,6 +12,7 @@ #include #include "../WaylandProtocol.hpp" #include +#include #include "wayland.hpp" #include "../../helpers/signal/Signal.hpp" #include "../../helpers/math/Math.hpp" @@ -104,7 +105,7 @@ class CWLKeyboardResource { bool good(); void sendKeymap(SP keeb); - void sendEnter(SP surface); + void sendEnter(SP surface, wl_array* keys); void sendLeave(); void sendKey(uint32_t timeMs, uint32_t key, wl_keyboard_key_state state); void sendMods(uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group); -- cgit v1.2.3