Mouse input

This commit is contained in:
2025-11-01 15:30:03 +01:00
parent 72e8df007e
commit 23edb6c917
2 changed files with 33 additions and 3 deletions
+14 -2
View File
@@ -80,16 +80,28 @@ impl Element for Scroll {
if let Some(e) = event.get::<crossterm::event::Event>() {
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)
}
_ => {}
},
_ => {}
}
}
+19 -1
View File
@@ -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();
}
}