diff --git a/src/input_common.rs b/src/input_common.rs index acfafe401..11d1111a0 100644 --- a/src/input_common.rs +++ b/src/input_common.rs @@ -340,12 +340,8 @@ pub enum ImplicitEvent { #[derive(Debug, Clone)] pub enum QueryResponseEvent { - /// Primary DA response. PrimaryDeviceAttribute, - /// Handle mouse left click. - MouseLeftClickContinuation(ViewportPosition, ViewportPosition), - /// Push prompt to top. - ScrollbackPushContinuation(usize), + CursorPositionReport(ViewportPosition), } #[derive(Debug, Clone)] @@ -760,7 +756,7 @@ pub fn function_set_status(&mut self, status: bool) { } } -#[derive(Eq, PartialEq)] +#[derive(Clone, Eq, PartialEq)] pub enum CursorPositionQuery { MouseLeft(ViewportPosition), ScrollbackPush, @@ -1184,24 +1180,10 @@ fn parse_csi(&mut self, buffer: &mut Vec) -> Option { return invalid_sequence(buffer); }; FLOG!(reader, "Received cursor position report y:", y, "x:", x); - let query = self.blocking_query(); - use TerminalQuery::CursorPositionReport; - let Some(CursorPositionReport(cursor_pos_query)) = &*query else { - return None; - }; - let continuation = match cursor_pos_query { - CursorPositionQuery::MouseLeft(click_position) => { - QueryResponseEvent::MouseLeftClickContinuation( - ViewportPosition { x, y }, - *click_position, - ) - } - CursorPositionQuery::ScrollbackPush => { - QueryResponseEvent::ScrollbackPushContinuation(y) - } - }; - drop(query); - self.push_front(CharEvent::QueryResponse(continuation)); + let cursor_pos = ViewportPosition { x, y }; + self.push_front(CharEvent::QueryResponse( + QueryResponseEvent::CursorPositionReport(cursor_pos), + )); return None; } b'S' => masked_key(function_key(4), None), diff --git a/src/reader.rs b/src/reader.rs index 23cc0dccc..515e8ee2a 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -2539,11 +2539,21 @@ fn handle_char_event(&mut self, injected_event: Option) -> ControlFlo .store(Capability::NotSupported as _, Ordering::Release); } } - QueryResponseEvent::MouseLeftClickContinuation(cursor, click_position) => { - self.mouse_left_click(cursor, click_position); - } - QueryResponseEvent::ScrollbackPushContinuation(cursor_y) => { - self.screen.push_to_scrollback(cursor_y); + QueryResponseEvent::CursorPositionReport(cursor_pos) => { + let cursor_pos_query = match &*self.blocking_query() { + Some(TerminalQuery::CursorPositionReport(cursor_pos_query)) => { + cursor_pos_query.clone() + } + _ => return ControlFlow::Continue(()), // Rogue reply. + }; + match cursor_pos_query { + CursorPositionQuery::MouseLeft(click_position) => { + self.mouse_left_click(cursor_pos, click_position); + } + CursorPositionQuery::ScrollbackPush => { + self.screen.push_to_scrollback(cursor_pos.y); + } + } } } let ok = stop_query(self.blocking_query());