From 23edb6c9174a1c24b698f72a8b0295ba5c5672bb Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sat, 1 Nov 2025 15:30:03 +0100 Subject: [PATCH] Mouse input --- src/elements/scroll.rs | 16 ++++++++++++++-- src/extensions/input_handling.rs | 20 +++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/elements/scroll.rs b/src/elements/scroll.rs index 910c0c5..3d760b7 100644 --- a/src/elements/scroll.rs +++ b/src/elements/scroll.rs @@ -80,16 +80,28 @@ impl Element for Scroll { if let Some(e) = event.get::() { match e { Event::Key(k) => match k.code { - crossterm::event::KeyCode::Up => { + crossterm::event::KeyCode::PageUp => { self.scroll_offset = self.scroll_offset.saturating_sub(1) } - crossterm::event::KeyCode::Down => { + crossterm::event::KeyCode::PageDown => { if self.scroll_offset + 1 < self.render.1 { self.scroll_offset += 1; } } _ => {} }, + + Event::Mouse(m) => match m.kind { + crossterm::event::MouseEventKind::ScrollDown => { + if self.scroll_offset + 1 < self.render.1 { + self.scroll_offset += 1; + } + } + crossterm::event::MouseEventKind::ScrollUp => { + self.scroll_offset = self.scroll_offset.saturating_sub(1) + } + _ => {} + }, _ => {} } } diff --git a/src/extensions/input_handling.rs b/src/extensions/input_handling.rs index 94156a6..8d80f0c 100644 --- a/src/extensions/input_handling.rs +++ b/src/extensions/input_handling.rs @@ -1,4 +1,14 @@ -use crate::extensions::{Extension, Context}; +use std::io::stdout; + +use crossterm::{ + event::{ + DisableMouseCapture, EnableMouseCapture, KeyboardEnhancementFlags, + PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, + }, + execute, +}; + +use crate::extensions::{Context, Extension}; pub struct InputExtension; @@ -6,6 +16,12 @@ impl Extension for InputExtension { fn init(&mut self, ctx: &Context) { let ctx = ctx.clone(); crossterm::terminal::enable_raw_mode().unwrap(); + execute!( + stdout(), + PushKeyboardEnhancementFlags(KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES) + ) + .unwrap(); + execute!(stdout(), EnableMouseCapture).unwrap(); std::thread::spawn(move || loop { if let Ok(e) = crossterm::event::read() { ctx.event(&e); @@ -14,6 +30,8 @@ impl Extension for InputExtension { } fn on_close(&mut self) { + execute!(stdout(), PopKeyboardEnhancementFlags).unwrap(); + execute!(stdout(), DisableMouseCapture).unwrap(); crossterm::terminal::disable_raw_mode().unwrap(); } }