From ece65fac3e185862745ad6b61d756ffb2bfd068f Mon Sep 17 00:00:00 2001 From: mmaxjr Date: Fri, 7 Aug 2026 07:58:03 -0300 Subject: [PATCH] Keep Win32 IME character events --- src/textual/drivers/win32.py | 14 ++++++++++---- tests/test_driver.py | 10 ++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/textual/drivers/win32.py b/src/textual/drivers/win32.py index a8eee1724b6..3ed2136e96e 100644 --- a/src/textual/drivers/win32.py +++ b/src/textual/drivers/win32.py @@ -78,6 +78,15 @@ class KEY_EVENT_RECORD(Structure): ] +def _is_bare_modifier_key_event(key_event: KEY_EVENT_RECORD) -> bool: + """Check if a key event only represents modifier-key state.""" + return ( + bool(key_event.dwControlKeyState) + and key_event.wVirtualKeyCode == 0 + and key_event.uChar.UnicodeChar in ("", "\x00") + ) + + class MOUSE_EVENT_RECORD(Structure): """https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str""" @@ -270,10 +279,7 @@ def run(self) -> None: key_event = input_record.Event.KeyEvent key = key_event.uChar.UnicodeChar if key_event.bKeyDown: - if ( - key_event.dwControlKeyState - and key_event.wVirtualKeyCode == 0 - ): + if _is_bare_modifier_key_event(key_event): continue append_key(key) elif event_type == WINDOW_BUFFER_SIZE_EVENT: diff --git a/tests/test_driver.py b/tests/test_driver.py index 764c9930dac..144e62ce209 100644 --- a/tests/test_driver.py +++ b/tests/test_driver.py @@ -1,5 +1,6 @@ from textual import on from textual.app import App +from textual.drivers.win32 import KEY_EVENT_RECORD, _is_bare_modifier_key_event from textual.events import Click, MouseDown, MouseUp from textual.widgets import Button @@ -27,6 +28,15 @@ def handle(self, event): assert isinstance(app.messages[2], Click) +def test_win32_ime_vk0_shift_character_is_not_bare_modifier(): + key_event = KEY_EVENT_RECORD() + key_event.dwControlKeyState = 0x0010 + key_event.wVirtualKeyCode = 0 + key_event.uChar.UnicodeChar = "\uff1f" + + assert not _is_bare_modifier_key_event(key_event) + + async def test_driver_mouse_down_up_click_widget(): """Mouse down and up should issue a click when they're on a widget."""