From dd49a5742d5d5303ab2a6b4ca27a85ed52fa627c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Mon, 31 Mar 2025 21:59:25 -0700 Subject: [PATCH] X11: Fixed send modifier keys when no other keys are pressed. --- examples/common/entry/entry_x11.cpp | 9 +++++++++ examples/common/imgui/imgui.cpp | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/examples/common/entry/entry_x11.cpp b/examples/common/entry/entry_x11.cpp index e26a20802..1441a2f3e 100644 --- a/examples/common/entry/entry_x11.cpp +++ b/examples/common/entry/entry_x11.cpp @@ -422,6 +422,8 @@ namespace entry bool joystick = s_joystick.update(m_eventQueue); bool xpending = XPending(m_display); + uint8_t oldModifers = m_modifiers; + if (!xpending) { bx::sleep(joystick ? 8 : 16); @@ -500,6 +502,7 @@ namespace entry { XKeyEvent& xkey = event.xkey; KeySym keysym = XLookupKeysym(&xkey, 0); + switch (keysym) { case XK_Meta_L: setModifier(Modifier::LeftMeta, KeyPress == event.type); break; @@ -538,6 +541,7 @@ namespace entry if (Key::None != key) { m_eventQueue.postKeyEvent(handle, key, m_modifiers, KeyPress == event.type); + oldModifers = m_modifiers; } } break; @@ -556,6 +560,11 @@ namespace entry } break; } + + if (oldModifers != m_modifiers) + { + m_eventQueue.postKeyEvent({ UINT16_MAX }, Key::None, m_modifiers, true); + } } } diff --git a/examples/common/imgui/imgui.cpp b/examples/common/imgui/imgui.cpp index 82adcbbe5..2fe825849 100644 --- a/examples/common/imgui/imgui.cpp +++ b/examples/common/imgui/imgui.cpp @@ -471,12 +471,13 @@ struct OcornutImguiContext m_lastScroll = _scroll; #if USE_ENTRY - uint8_t modifiers = inputGetModifiersState(); + const uint8_t modifiers = inputGetModifiersState(); io.AddKeyEvent(ImGuiMod_Shift, 0 != (modifiers & (entry::Modifier::LeftShift | entry::Modifier::RightShift) ) ); io.AddKeyEvent(ImGuiMod_Ctrl, 0 != (modifiers & (entry::Modifier::LeftCtrl | entry::Modifier::RightCtrl ) ) ); io.AddKeyEvent(ImGuiMod_Alt, 0 != (modifiers & (entry::Modifier::LeftAlt | entry::Modifier::RightAlt ) ) ); io.AddKeyEvent(ImGuiMod_Super, 0 != (modifiers & (entry::Modifier::LeftMeta | entry::Modifier::RightMeta ) ) ); - for (int32_t ii = 0; ii < (int32_t)entry::Key::Count; ++ii) + + for (int32_t ii = 0; ii < int32_t(entry::Key::Count); ++ii) { io.AddKeyEvent(m_keyMap[ii], inputGetKeyState(entry::Key::Enum(ii) ) ); io.SetKeyEventNativeData(m_keyMap[ii], 0, 0, ii);