Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions src/textual/drivers/win32.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""

Expand Down Expand Up @@ -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:
Expand Down
10 changes: 10 additions & 0 deletions tests/test_driver.py
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -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."""

Expand Down