winit-orbital: provide last mouse position with button events

This commit is contained in:
Jeremy Soller 2026-05-26 09:00:00 -06:00
parent d64fc7b071
commit f737f1f590

View file

@ -187,6 +187,7 @@ bitflags! {
struct EventState {
keyboard: KeyboardModifierState,
mouse: MouseButtonState,
mouse_pos: (i32, i32),
resize_opt: Option<(u32, u32)>,
}
@ -422,35 +423,50 @@ impl EventLoop {
);
},
EventOption::Mouse(MouseEvent { x, y }) => {
app.window_event(window_target, window_id, event::WindowEvent::PointerMoved {
device_id: None,
primary: true,
position: (x, y).into(),
source: event::PointerSource::Mouse,
});
event_state.mouse_pos = (x, y);
app.window_event(
window_target,
window_id,
event::WindowEvent::PointerMoved {
device_id: None,
primary: true,
position: event_state.mouse_pos.into(),
source: event::PointerSource::Mouse,
},
);
},
EventOption::MouseRelative(MouseRelativeEvent { dx, dy }) => {
app.device_event(window_target, None, event::DeviceEvent::PointerMotion {
delta: (dx as f64, dy as f64),
});
app.device_event(
window_target,
None,
event::DeviceEvent::PointerMotion { delta: (dx as f64, dy as f64) },
);
},
EventOption::Button(ButtonEvent { left, middle, right }) => {
while let Some((button, state)) = event_state.mouse(left, middle, right) {
app.window_event(window_target, window_id, event::WindowEvent::PointerButton {
device_id: None,
primary: true,
state,
position: dpi::PhysicalPosition::default(),
button: button.into(),
});
app.window_event(
window_target,
window_id,
event::WindowEvent::PointerButton {
device_id: None,
primary: true,
state,
position: event_state.mouse_pos.into(),
button: button.into(),
},
);
}
},
EventOption::Scroll(ScrollEvent { x, y }) => {
app.window_event(window_target, window_id, event::WindowEvent::MouseWheel {
device_id: None,
delta: event::MouseScrollDelta::LineDelta(x as f32, y as f32),
phase: event::TouchPhase::Moved,
});
app.window_event(
window_target,
window_id,
event::WindowEvent::MouseWheel {
device_id: None,
delta: event::MouseScrollDelta::LineDelta(x as f32, y as f32),
phase: event::TouchPhase::Moved,
},
);
},
EventOption::Quit(QuitEvent {}) => {
app.window_event(window_target, window_id, event::WindowEvent::CloseRequested);