diff --git a/src/textual/drivers/win32.py b/src/textual/drivers/win32.py index a8eee1724b..3ed2136e96 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 764c9930da..144e62ce20 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."""