From 8b03329bbaea5ba80517b22e4978ef934119cbb2 Mon Sep 17 00:00:00 2001 From: Per Hurtig Date: Thu, 21 Aug 2025 04:57:55 +0200 Subject: [PATCH] Add ctrl+mousewheel zoom control for fill-screen mode (#94) * Add ctrl+mousewheel zoom control for fill-screen mode Enables mouse-based zooming; Uses ctrl+scroll up/down to increase/decrease zoom level while in fill-screen mode, with proper mouse capture handling. * removed unused include --- src/main.rs | 6 ++++-- src/tui.rs | 43 ++++++++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/main.rs b/src/main.rs index dbd7b5d..c00cfe4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -239,7 +239,8 @@ async fn main() -> Result<(), WrappedErr> { execute!( term.backend_mut(), EnterAlternateScreen, - crossterm::cursor::Hide + crossterm::cursor::Hide, + crossterm::event::EnableMouseCapture ) .map_err(|e| { WrappedErr( @@ -307,7 +308,8 @@ async fn main() -> Result<(), WrappedErr> { execute!( term.backend_mut(), LeaveAlternateScreen, - crossterm::cursor::Show + crossterm::cursor::Show, + crossterm::event::DisableMouseCapture ) .unwrap(); disable_raw_mode().unwrap(); diff --git a/src/tui.rs b/src/tui.rs index 5603cad..b08f950 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -624,7 +624,8 @@ impl Tui { execute!( &mut backend, LeaveAlternateScreen, - crossterm::cursor::Show + crossterm::cursor::Show, + crossterm::event::DisableMouseCapture ) .unwrap(); disable_raw_mode().unwrap(); @@ -638,7 +639,8 @@ impl Tui { execute!( &mut backend, EnterAlternateScreen, - crossterm::cursor::Hide + crossterm::cursor::Hide, + crossterm::event::EnableMouseCapture ) .unwrap(); @@ -754,17 +756,32 @@ impl Tui { _ => None } } - Event::Mouse(mouse) => match mouse.kind { - MouseEventKind::ScrollRight => - self.change_page(PageChange::Next, ChangeAmount::Single), - MouseEventKind::ScrollDown => - self.change_page(PageChange::Next, ChangeAmount::WholeScreen), - MouseEventKind::ScrollLeft => - self.change_page(PageChange::Prev, ChangeAmount::Single), - MouseEventKind::ScrollUp => - self.change_page(PageChange::Prev, ChangeAmount::WholeScreen), - _ => None - }, + Event::Mouse(mouse) => { + if mouse.modifiers.contains(KeyModifiers::CONTROL) + && self.is_kitty + && self.zoom.is_some() + { + match mouse.kind { + MouseEventKind::ScrollUp => + self.update_zoom(|z| z.level = z.level.saturating_add(1).min(0)), + MouseEventKind::ScrollDown => + self.update_zoom(|z| z.level = z.level.saturating_sub(1)), + _ => None + } + } else { + match mouse.kind { + MouseEventKind::ScrollRight => + self.change_page(PageChange::Next, ChangeAmount::Single), + MouseEventKind::ScrollDown => + self.change_page(PageChange::Next, ChangeAmount::WholeScreen), + MouseEventKind::ScrollLeft => + self.change_page(PageChange::Prev, ChangeAmount::Single), + MouseEventKind::ScrollUp => + self.change_page(PageChange::Prev, ChangeAmount::WholeScreen), + _ => None + } + } + } Event::Resize(_, _) => Some(InputAction::Redraw), _ => None }