Don't route query responses until we pop them from the input queue

This makes more sense, see also the next commit.
This commit is contained in:
Johannes Altmanninger
2025-04-26 19:08:48 +02:00
parent 7e393f47e4
commit 168c1a50a4
2 changed files with 21 additions and 29 deletions

View File

@@ -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<u8>) -> Option<KeyEvent> {
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),

View File

@@ -2539,11 +2539,21 @@ fn handle_char_event(&mut self, injected_event: Option<CharEvent>) -> 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());