aboutsummaryrefslogtreecommitdiff
path: root/src/client/terminal_sessions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/terminal_sessions.rs')
-rw-r--r--src/client/terminal_sessions.rs60
1 files changed, 58 insertions, 2 deletions
diff --git a/src/client/terminal_sessions.rs b/src/client/terminal_sessions.rs
index 6d3160c8..aeecbf47 100644
--- a/src/client/terminal_sessions.rs
+++ b/src/client/terminal_sessions.rs
@@ -7,8 +7,8 @@ use tracing::info;
use crate::ipc::LocalStream;
use crate::protocol::{
- self, AttachScrollDirection, AttachScrollSource, ClientMessage, RenderEncoding, ServerMessage,
- MAX_GRAPHICS_FRAME_SIZE,
+ self, AttachScrollDirection, AttachScrollSource, ClientMessage, ClientMouseButton,
+ ClientMouseKind, ClientMousePosition, RenderEncoding, ServerMessage, MAX_GRAPHICS_FRAME_SIZE,
};
use crate::server::socket_paths::client_socket_path;
@@ -187,12 +187,40 @@ enum TerminalControlCommand {
#[serde(default)]
modifiers: u8,
},
+ #[serde(rename = "terminal.mouse")]
+ Mouse {
+ action: TerminalControlMouseAction,
+ #[serde(default)]
+ button: TerminalControlMouseButton,
+ column: u16,
+ row: u16,
+ #[serde(default)]
+ modifiers: u8,
+ },
#[serde(rename = "terminal.release")]
Release {},
}
#[derive(Clone, Copy, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
+enum TerminalControlMouseAction {
+ Down,
+ Up,
+ Drag,
+ Move,
+}
+
+#[derive(Clone, Copy, Default, serde::Deserialize)]
+#[serde(rename_all = "snake_case")]
+enum TerminalControlMouseButton {
+ #[default]
+ Left,
+ Right,
+ Middle,
+}
+
+#[derive(Clone, Copy, serde::Deserialize)]
+#[serde(rename_all = "snake_case")]
enum TerminalControlScrollDirection {
Up,
Down,
@@ -273,6 +301,34 @@ pub(super) fn terminal_control_command_from_json(raw: &str) -> Result<ClientMess
modifiers,
})
}
+ TerminalControlCommand::Mouse {
+ action,
+ button,
+ column,
+ row,
+ modifiers,
+ } => {
+ let button = match button {
+ TerminalControlMouseButton::Left => ClientMouseButton::Left,
+ TerminalControlMouseButton::Right => ClientMouseButton::Right,
+ TerminalControlMouseButton::Middle => ClientMouseButton::Middle,
+ };
+ let kind = match action {
+ TerminalControlMouseAction::Down => ClientMouseKind::Down(button),
+ TerminalControlMouseAction::Up => ClientMouseKind::Up(button),
+ TerminalControlMouseAction::Drag => ClientMouseKind::Drag(button),
+ TerminalControlMouseAction::Move => ClientMouseKind::Moved,
+ };
+ // The server encodes the event for the pane's mouse mode and drops it
+ // when the application has not enabled mouse reporting.
+ Ok(ClientMessage::AttachMouse {
+ kind,
+ position: ClientMousePosition::Cell { column, row },
+ geometry: None,
+ modifiers,
+ lines: 1,
+ })
+ }
TerminalControlCommand::Release {} => Ok(ClientMessage::Detach),
}
}