diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 359737be66..96a13ba13b 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -86,3 +86,4 @@ changelog entry. ### Fixed - On MacOS, fix building with `feature = "rwh_04"`. +- On Web, pen events are now routed through to `WindowEvent::Cursor*`. diff --git a/src/platform_impl/web/event_loop/runner.rs b/src/platform_impl/web/event_loop/runner.rs index 317ff077fa..5fdba0e720 100644 --- a/src/platform_impl/web/event_loop/runner.rs +++ b/src/platform_impl/web/event_loop/runner.rs @@ -244,21 +244,10 @@ impl Shared { return; } - let pointer_type = event.pointer_type(); - - if pointer_type != "mouse" { - return; - } - // chorded button event let device_id = RootDeviceId(DeviceId(event.pointer_id())); if let Some(button) = backend::event::mouse_button(&event) { - debug_assert_eq!( - pointer_type, "mouse", - "expect pointer type of a chorded button event to be a mouse" - ); - let state = if backend::event::mouse_buttons(&event).contains(button.into()) { ElementState::Pressed } else { @@ -322,10 +311,6 @@ impl Shared { return; } - if event.pointer_type() != "mouse" { - return; - } - let button = backend::event::mouse_button(&event).expect("no mouse button pressed"); runner.send_event(Event::DeviceEvent { device_id: RootDeviceId(DeviceId(event.pointer_id())), @@ -345,10 +330,6 @@ impl Shared { return; } - if event.pointer_type() != "mouse" { - return; - } - let button = backend::event::mouse_button(&event).expect("no mouse button pressed"); runner.send_event(Event::DeviceEvent { device_id: RootDeviceId(DeviceId(event.pointer_id())), diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index f697142a08..144143f92f 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -266,21 +266,6 @@ impl ActiveEventLoop { }); canvas.on_cursor_move( - { - let runner = self.runner.clone(); - let has_focus = has_focus.clone(); - let modifiers = self.modifiers.clone(); - - move |active_modifiers| { - if has_focus.get() && modifiers.get() != active_modifiers { - modifiers.set(active_modifiers); - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::ModifiersChanged(active_modifiers.into()), - }) - } - } - }, { let runner = self.runner.clone(); let has_focus = has_focus.clone(); @@ -380,20 +365,6 @@ impl ActiveEventLoop { ); canvas.on_mouse_press( - { - let runner = self.runner.clone(); - let modifiers = self.modifiers.clone(); - - move |active_modifiers| { - if modifiers.get() != active_modifiers { - modifiers.set(active_modifiers); - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::ModifiersChanged(active_modifiers.into()), - }) - } - } - }, { let runner = self.runner.clone(); let modifiers = self.modifiers.clone(); @@ -458,21 +429,6 @@ impl ActiveEventLoop { ); canvas.on_mouse_release( - { - let runner = self.runner.clone(); - let has_focus = has_focus.clone(); - let modifiers = self.modifiers.clone(); - - move |active_modifiers| { - if has_focus.get() && modifiers.get() != active_modifiers { - modifiers.set(active_modifiers); - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::ModifiersChanged(active_modifiers.into()), - }); - } - } - }, { let runner = self.runner.clone(); let has_focus = has_focus.clone(); diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index f515bbf5ce..ef075aa02b 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -328,51 +328,29 @@ impl Canvas { self.pointer_handler.on_cursor_enter(&self.common, handler) } - pub fn on_mouse_release( - &mut self, - modifier_handler: MOD, - mouse_handler: M, - touch_handler: T, - ) where - MOD: 'static + FnMut(ModifiersState), + pub fn on_mouse_release(&mut self, mouse_handler: M, touch_handler: T) + where M: 'static + FnMut(ModifiersState, i32, PhysicalPosition, MouseButton), T: 'static + FnMut(ModifiersState, i32, PhysicalPosition, Force), { - self.pointer_handler.on_mouse_release( - &self.common, - modifier_handler, - mouse_handler, - touch_handler, - ) + self.pointer_handler.on_mouse_release(&self.common, mouse_handler, touch_handler) } - pub fn on_mouse_press( - &mut self, - modifier_handler: MOD, - mouse_handler: M, - touch_handler: T, - ) where - MOD: 'static + FnMut(ModifiersState), + pub fn on_mouse_press(&mut self, mouse_handler: M, touch_handler: T) + where M: 'static + FnMut(ModifiersState, i32, PhysicalPosition, MouseButton), T: 'static + FnMut(ModifiersState, i32, PhysicalPosition, Force), { self.pointer_handler.on_mouse_press( &self.common, - modifier_handler, mouse_handler, touch_handler, Rc::clone(&self.prevent_default), ) } - pub fn on_cursor_move( - &mut self, - modifier_handler: MOD, - mouse_handler: M, - touch_handler: T, - button_handler: B, - ) where - MOD: 'static + FnMut(ModifiersState), + pub fn on_cursor_move(&mut self, mouse_handler: M, touch_handler: T, button_handler: B) + where M: 'static + FnMut(ModifiersState, i32, &mut dyn Iterator>), T: 'static + FnMut(ModifiersState, i32, &mut dyn Iterator, Force)>), @@ -380,7 +358,6 @@ impl Canvas { { self.pointer_handler.on_cursor_move( &self.common, - modifier_handler, mouse_handler, touch_handler, button_handler, diff --git a/src/platform_impl/web/web_sys/pointer.rs b/src/platform_impl/web/web_sys/pointer.rs index f5e9365d5c..14b6722399 100644 --- a/src/platform_impl/web/web_sys/pointer.rs +++ b/src/platform_impl/web/web_sys/pointer.rs @@ -44,7 +44,7 @@ impl PointerHandler { // touch events are handled separately // handling them here would produce duplicate mouse events, inconsistent with // other platforms. - let pointer_id = (event.pointer_type() == "mouse").then(|| event.pointer_id()); + let pointer_id = (event.pointer_type() != "touch").then(|| event.pointer_id()); handler(modifiers, pointer_id); })); @@ -61,20 +61,18 @@ impl PointerHandler { // touch events are handled separately // handling them here would produce duplicate mouse events, inconsistent with // other platforms. - let pointer_id = (event.pointer_type() == "mouse").then(|| event.pointer_id()); + let pointer_id = (event.pointer_type() != "touch").then(|| event.pointer_id()); handler(modifiers, pointer_id); })); } - pub fn on_mouse_release( + pub fn on_mouse_release( &mut self, canvas_common: &Common, - mut modifier_handler: MOD, mut mouse_handler: M, mut touch_handler: T, ) where - MOD: 'static + FnMut(ModifiersState), M: 'static + FnMut(ModifiersState, i32, PhysicalPosition, MouseButton), T: 'static + FnMut(ModifiersState, i32, PhysicalPosition, Force), { @@ -90,26 +88,23 @@ impl PointerHandler { event::mouse_position(&event).to_physical(super::scale_factor(&window)), Force::Normalized(event.pressure() as f64), ), - "mouse" => mouse_handler( + _ => mouse_handler( modifiers, event.pointer_id(), event::mouse_position(&event).to_physical(super::scale_factor(&window)), event::mouse_button(&event).expect("no mouse button released"), ), - _ => modifier_handler(modifiers), } })); } - pub fn on_mouse_press( + pub fn on_mouse_press( &mut self, canvas_common: &Common, - mut modifier_handler: MOD, mut mouse_handler: M, mut touch_handler: T, prevent_default: Rc>, ) where - MOD: 'static + FnMut(ModifiersState), M: 'static + FnMut(ModifiersState, i32, PhysicalPosition, MouseButton), T: 'static + FnMut(ModifiersState, i32, PhysicalPosition, Force), { @@ -125,8 +120,9 @@ impl PointerHandler { } let modifiers = event::mouse_modifiers(&event); + let pointer_type = &event.pointer_type(); - match event.pointer_type().as_str() { + match pointer_type.as_str() { "touch" => { touch_handler( modifiers, @@ -135,7 +131,7 @@ impl PointerHandler { Force::Normalized(event.pressure() as f64), ); }, - "mouse" => { + _ => { mouse_handler( modifiers, event.pointer_id(), @@ -143,27 +139,27 @@ impl PointerHandler { event::mouse_button(&event).expect("no mouse button pressed"), ); - // Error is swallowed here since the error would occur every time the mouse - // is clicked when the cursor is grabbed, and there - // is probably not a situation where this could - // fail, that we care if it fails. - let _e = canvas.set_pointer_capture(event.pointer_id()); + if pointer_type == "mouse" { + // Error is swallowed here since the error would occur every time the + // mouse is clicked when the cursor is + // grabbed, and there is probably not a + // situation where this could fail, that we + // care if it fails. + let _e = canvas.set_pointer_capture(event.pointer_id()); + } }, - _ => modifier_handler(modifiers), } })); } - pub fn on_cursor_move( + pub fn on_cursor_move( &mut self, canvas_common: &Common, - mut modifier_handler: MOD, mut mouse_handler: M, mut touch_handler: T, mut button_handler: B, prevent_default: Rc>, ) where - MOD: 'static + FnMut(ModifiersState), M: 'static + FnMut(ModifiersState, i32, &mut dyn Iterator>), T: 'static + FnMut(ModifiersState, i32, &mut dyn Iterator, Force)>), @@ -175,23 +171,10 @@ impl PointerHandler { Some(canvas_common.add_event("pointermove", move |event: PointerEvent| { let modifiers = event::mouse_modifiers(&event); - let pointer_type = event.pointer_type(); - - if let "touch" | "mouse" = pointer_type.as_str() { - } else { - modifier_handler(modifiers); - return; - } - let id = event.pointer_id(); // chorded button event if let Some(button) = event::mouse_button(&event) { - debug_assert_eq!( - pointer_type, "mouse", - "expect pointer type of a chorded button event to be a mouse" - ); - if prevent_default.get() { // prevent text selection event.prevent_default(); @@ -212,13 +195,7 @@ impl PointerHandler { // pointer move event let scale = super::scale_factor(&window); - match pointer_type.as_str() { - "mouse" => mouse_handler( - modifiers, - id, - &mut event::pointer_move_event(event) - .map(|event| event::mouse_position(&event).to_physical(scale)), - ), + match event.pointer_type().as_str() { "touch" => touch_handler( modifiers, id, @@ -229,7 +206,12 @@ impl PointerHandler { ) }), ), - _ => unreachable!("didn't return early before"), + _ => mouse_handler( + modifiers, + id, + &mut event::pointer_move_event(event) + .map(|event| event::mouse_position(&event).to_physical(scale)), + ), }; })); }