Fixed mouse scroll events in opener

This commit is contained in:
Joshua Barretto 2025-09-30 21:29:13 +01:00
parent 52b07bfc0b
commit 517c952606
4 changed files with 25 additions and 21 deletions

View file

@ -480,12 +480,12 @@ impl RawEvent {
} }
} }
pub fn to_mouse(&self, area: Area, drag_id_counter: &mut usize) -> Option<Action> { pub fn to_mouse(&self, drag_id_counter: &mut usize) -> Option<Action> {
let TerminalEvent::Mouse(ev) = self.0 else { let TerminalEvent::Mouse(ev) = self.0 else {
return None; return None;
}; };
if let Some(pos) = area.contains([ev.column as isize, ev.row as isize]) { let pos = [ev.column as isize, ev.row as isize];
let action = match ev.kind { let action = match ev.kind {
MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up), MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up),
MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down), MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down),
@ -498,8 +498,5 @@ impl RawEvent {
}; };
let is_ctrl = ev.modifiers == KeyModifiers::CONTROL; let is_ctrl = ev.modifiers == KeyModifiers::CONTROL;
Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter)) Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter))
} else {
None
}
} }
} }

View file

@ -97,7 +97,9 @@ impl Input {
self.refocus(buffer, cursor_id); self.refocus(buffer, cursor_id);
Ok(Resp::handled(None)) Ok(Resp::handled(None))
} }
Some(Action::Mouse(MouseAction::Scroll(dir), pos, _, _)) if is_doc => { Some(Action::Mouse(MouseAction::Scroll(dir), pos, _, _))
if is_doc && self.last_area.contains(pos).is_some() =>
{
let dist = [1, 1]; let dist = [1, 1];
let dfocus = match dir { let dfocus = match dir {
Dir::Up => [0, -1], Dir::Up => [0, -1],

View file

@ -15,7 +15,6 @@ pub struct Panes {
selected: usize, selected: usize,
panes: Vec<Pane>, panes: Vec<Pane>,
last_area: Area, last_area: Area,
drag_id_counter: usize,
} }
impl Panes { impl Panes {
@ -30,7 +29,6 @@ impl Panes {
}) })
.collect(), .collect(),
last_area: Default::default(), last_area: Default::default(),
drag_id_counter: 0,
} }
} }
@ -46,7 +44,6 @@ impl Element for Panes {
.map(Action::PaneMove) .map(Action::PaneMove)
.or_else(|| e.to_pane_open().map(Action::PaneOpen)) .or_else(|| e.to_pane_open().map(Action::PaneOpen))
.or_else(|| e.to_pane_close()) .or_else(|| e.to_pane_close())
.or_else(|| e.to_mouse(self.last_area, &mut self.drag_id_counter))
}) { }) {
Some(Action::PaneMove(Dir::Left)) => { Some(Action::PaneMove(Dir::Left)) => {
self.selected = (self.selected + self.panes.len() - 1) % self.panes.len(); self.selected = (self.selected + self.panes.len() - 1) % self.panes.len();

View file

@ -5,6 +5,7 @@ pub struct Root {
panes: Panes, panes: Panes,
status: Status, status: Status,
tasks: Vec<Task>, tasks: Vec<Task>,
drag_id_counter: usize,
} }
pub enum Task { pub enum Task {
@ -35,12 +36,19 @@ impl Root {
panes: Panes::new(state, buffers), panes: Panes::new(state, buffers),
status: Status, status: Status,
tasks: Vec::new(), tasks: Vec::new(),
drag_id_counter: 0,
} }
} }
} }
impl Element<()> for Root { impl Element<()> for Root {
fn handle(&mut self, state: &mut State, mut event: Event) -> Result<Resp<()>, Event> { fn handle(&mut self, state: &mut State, mut event: Event) -> Result<Resp<()>, Event> {
// Perform any top-level conversion of raw events
let mut event = event
.to_action(|e| e.to_mouse(&mut self.drag_id_counter))
.map(Event::Action)
.unwrap_or(event);
// Pass the event down through the list of tasks until we meet one that can handle it // Pass the event down through the list of tasks until we meet one that can handle it
let mut task_idx = self.tasks.len(); let mut task_idx = self.tasks.len();
let event = loop { let event = loop {