diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-14 02:50:00 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-14 02:50:00 +0300 |
| commit | ed4253d6031c9a3b12ddd6dfc7d7bf39480ae761 (patch) | |
| tree | 315cea3ee7b5ad3a7c3f9fb31272064a0eed5dd2 /src/app/input | |
| parent | 287bf51640f8e1bed227cb27d93377d962851196 (diff) | |
feat: add tmux-style mouse capture config
Diffstat (limited to 'src/app/input')
| -rw-r--r-- | src/app/input/mouse.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/app/input/mouse.rs b/src/app/input/mouse.rs index 779af3ed..9b4055e5 100644 --- a/src/app/input/mouse.rs +++ b/src/app/input/mouse.rs @@ -25,6 +25,28 @@ use super::{ }; impl AppState { + pub(crate) fn handle_pane_mouse_only(&mut self, mouse: MouseEvent) { + if self.mode != Mode::Terminal { + return; + } + let Some(info) = self.pane_at(mouse.column, mouse.row).cloned() else { + return; + }; + + match mouse.kind { + MouseEventKind::ScrollUp + | MouseEventKind::ScrollDown + | MouseEventKind::ScrollLeft + | MouseEventKind::ScrollRight => { + self.forward_pane_reported_wheel(&info, mouse); + } + MouseEventKind::Down(_) | MouseEventKind::Up(_) | MouseEventKind::Drag(_) => { + self.forward_pane_mouse_button(&info, mouse); + } + MouseEventKind::Moved => {} + } + } + pub(super) fn handle_mouse(&mut self, mouse: MouseEvent) -> Option<SettingsAction> { if self.mode == Mode::Onboarding { self.handle_onboarding_mouse(mouse); @@ -1118,6 +1140,32 @@ impl AppState { true } + fn forward_pane_reported_wheel(&self, info: &PaneInfo, mouse: MouseEvent) -> bool { + let Some(ws) = self.active.and_then(|i| self.workspaces.get(i)) else { + return false; + }; + let Some(rt) = ws.runtimes.get(&info.id) else { + return false; + }; + if !rt + .input_state() + .is_some_and(crate::pane::InputState::mouse_reporting_enabled) + { + return false; + } + rt.scroll_reset(); + let column = mouse.column.saturating_sub(info.inner_rect.x); + let row = mouse.row.saturating_sub(info.inner_rect.y); + let Some(bytes) = rt.encode_mouse_wheel(mouse.kind, column, row, mouse.modifiers) else { + warn!(pane = info.id.raw(), kind = ?mouse.kind, "failed to encode mouse wheel event"); + return true; + }; + if let Err(err) = rt.try_send_bytes(Bytes::from(bytes)) { + warn!(pane = info.id.raw(), err = %err, "failed to forward mouse wheel event"); + } + true + } + pub(super) fn forward_pane_wheel(&self, info: &PaneInfo, mouse: MouseEvent) -> bool { let Some(ws) = self.active.and_then(|i| self.workspaces.get(i)) else { return false; |
