From f737f1f5900b3399b56951305b0f155afc9c9ee5 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 26 May 2026 09:00:00 -0600 Subject: [PATCH] winit-orbital: provide last mouse position with button events --- winit-orbital/src/event_loop.rs | 58 +++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/winit-orbital/src/event_loop.rs b/winit-orbital/src/event_loop.rs index 9c9b1adc..651560ee 100644 --- a/winit-orbital/src/event_loop.rs +++ b/winit-orbital/src/event_loop.rs @@ -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);