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 c4afadbfab
commit 7262e460f6

View File

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