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,26 +480,23 @@ 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 {
return None;
};
if let Some(pos) = area.contains([ev.column as isize, ev.row as isize]) {
let action = match ev.kind {
MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up),
MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down),
MouseEventKind::Down(MouseButton::Left) => {
*drag_id_counter += 1;
MouseAction::Click
}
MouseEventKind::Drag(MouseButton::Left) => MouseAction::Drag,
_ => return None,
};
let is_ctrl = ev.modifiers == KeyModifiers::CONTROL;
Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter))
} else {
None
}
let pos = [ev.column as isize, ev.row as isize];
let action = match ev.kind {
MouseEventKind::ScrollUp => MouseAction::Scroll(Dir::Up),
MouseEventKind::ScrollDown => MouseAction::Scroll(Dir::Down),
MouseEventKind::Down(MouseButton::Left) => {
*drag_id_counter += 1;
MouseAction::Click
}
MouseEventKind::Drag(MouseButton::Left) => MouseAction::Drag,
_ => return None,
};
let is_ctrl = ev.modifiers == KeyModifiers::CONTROL;
Some(Action::Mouse(action, pos, is_ctrl, *drag_id_counter))
}
}

View file

@ -97,7 +97,9 @@ impl Input {
self.refocus(buffer, cursor_id);
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 dfocus = match dir {
Dir::Up => [0, -1],

View file

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

View file

@ -5,6 +5,7 @@ pub struct Root {
panes: Panes,
status: Status,
tasks: Vec<Task>,
drag_id_counter: usize,
}
pub enum Task {
@ -35,12 +36,19 @@ impl Root {
panes: Panes::new(state, buffers),
status: Status,
tasks: Vec::new(),
drag_id_counter: 0,
}
}
}
impl Element<()> for Root {
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
let mut task_idx = self.tasks.len();
let event = loop {