diff --git a/src/textual/_xterm_parser.py b/src/textual/_xterm_parser.py index 7a90a16bb..042861e63 100644 --- a/src/textual/_xterm_parser.py +++ b/src/textual/_xterm_parser.py @@ -2,7 +2,6 @@ from __future__ import annotations import re -from collections import deque from typing import Any, Callable, Generator, Iterable from . import messages @@ -36,11 +35,11 @@ class XTermParser(Parser[events.Event]): self.last_x = 0 self.last_y = 0 - self._debug_log_file = open("keys.log", "wt") + self._debug_log_file = open("keys.log", "wt") if debug else None super().__init__() - def debug_log(self, *args: Any) -> None: + def debug_log(self, *args: Any) -> None: # pragma: no cover if self._debug_log_file is not None: self._debug_log_file.write(" ".join(args) + "\n") self._debug_log_file.flush() @@ -187,12 +186,13 @@ class XTermParser(Parser[events.Event]): mouse_match = _re_mouse_event.match(sequence) if mouse_match is not None: mouse_code = mouse_match.group(0) - print(mouse_code) event = self.parse_mouse_code(mouse_code, self.sender) if event: on_token(event) break - # Or a mode report? (i.e. the terminal telling us if it supports a mode we requested) + + # Or a mode report? + # (i.e. the terminal saying it supports a mode we requested) mode_report_match = _re_terminal_mode_response.match(sequence) if mode_report_match is not None: if ( diff --git a/tests/test_xterm_parser.py b/tests/test_xterm_parser.py index 84b60d505..c1937ffc0 100644 --- a/tests/test_xterm_parser.py +++ b/tests/test_xterm_parser.py @@ -3,8 +3,15 @@ from unittest import mock import pytest from textual._xterm_parser import XTermParser -from textual.events import Paste, Key, MouseDown, MouseUp, MouseMove, MouseScrollDown, \ - MouseScrollUp +from textual.events import ( + Paste, + Key, + MouseDown, + MouseUp, + MouseMove, + MouseScrollDown, + MouseScrollUp, +) from textual.messages import TerminalSupportsSynchronizedOutput @@ -207,6 +214,13 @@ def test_mouse_scroll_up(parser, sequence, shift, meta): assert event.y == 24 +def test_mouse_event_detected_but_info_not_parsed(parser): + # I don't know if this can actually happen in reality, but + # there's a branch in the code that allows for the possibility. + events = list(parser.feed("\x1b[<65;18;20;25M")) + assert len(events) == 0 + + def test_escape_sequence_resulting_in_multiple_keypresses(parser): """Some sequences are interpreted as more than 1 keypress""" events = list(parser.feed("\x1b[2;4~"))