From 52fe7c703f8fd5c55c25fbbe919593d087907ba5 Mon Sep 17 00:00:00 2001 From: Dany Sluijk Date: Thu, 20 May 2021 11:11:21 +0200 Subject: [PATCH 01/31] feat: add pointer events to web --- Cargo.toml | 3 +- src/event.rs | 15 +++ .../web/event_loop/window_target.rs | 62 +++++++++- src/platform_impl/web/web_sys/canvas.rs | 44 ++++++- .../web/web_sys/canvas/pointer_handler.rs | 110 +++++++++++++++++- 5 files changed, 230 insertions(+), 4 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3f5acfb21d..73f7d1ad37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,7 +122,8 @@ features = [ 'Node', 'PointerEvent', 'Window', - 'WheelEvent' + 'WheelEvent', + 'PointerEvent', ] [target.'cfg(target_arch = "wasm32")'.dependencies.wasm-bindgen] diff --git a/src/event.rs b/src/event.rs index 65e556a2f7..af03f3e169 100644 --- a/src/event.rs +++ b/src/event.rs @@ -746,6 +746,21 @@ pub struct Touch { pub force: Option, /// Unique identifier of a finger. pub id: u64, + /// Type of pointer used when touching. + /// + /// ## Platform-specific + /// + /// - Currently only available on Web targets. + pub pointer_type: Option, +} + +/// Describes the types of pointers available. +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum PointerType { + Mouse, + Pen, + Touch, + Unknown, } /// Describes the force of a touch event diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 0ed7c37ace..aa7b856c5b 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -4,7 +4,7 @@ use super::{ }; use crate::dpi::{PhysicalSize, Size}; use crate::event::{ - DeviceEvent, DeviceId as RootDeviceId, ElementState, Event, KeyboardInput, TouchPhase, + DeviceEvent, DeviceId as RootDeviceId, ElementState, Event, KeyboardInput, Touch, TouchPhase, WindowEvent, }; use crate::event_loop::ControlFlow; @@ -235,6 +235,66 @@ impl EventLoopWindowTarget { runner.request_redraw(RootWindowId(id)); }); + let runner = self.runner.clone(); + canvas.on_pointer_move(move |device_id, location, pointer_type| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Moved, + force: None, // Todo + pointer_type: Some(pointer_type), + location, + }), + }); + }); + + let runner = self.runner.clone(); + canvas.on_pointer_down(move |device_id, location, pointer_type| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Started, + force: None, // Todo + pointer_type: Some(pointer_type), + location, + }), + }); + }); + + let runner = self.runner.clone(); + canvas.on_pointer_up(move |device_id, location, pointer_type| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Ended, + force: None, // Todo + pointer_type: Some(pointer_type), + location, + }), + }); + }); + + let runner = self.runner.clone(); + canvas.on_pointer_cancel(move |device_id, location, pointer_type| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Cancelled, + force: None, // Todo + pointer_type: Some(pointer_type), + location, + }), + }); + }); + let runner = self.runner.clone(); canvas.on_dark_mode(move |is_dark_mode| { let theme = if is_dark_mode { diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 8d68e5aaab..085a8651c0 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -3,7 +3,9 @@ use super::event_handle::EventListenerHandle; use super::media_query_handle::MediaQueryListHandle; use crate::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize}; use crate::error::OsError as RootOE; -use crate::event::{ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode}; +use crate::event::{ + ModifiersState, MouseButton, MouseScrollDelta, PointerType, ScanCode, VirtualKeyCode, +}; use crate::platform_impl::{OsError, PlatformSpecificWindowBuilderAttributes}; use std::cell::RefCell; @@ -261,6 +263,46 @@ impl Canvas { } } + pub fn on_pointer_move(&mut self, handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + match &mut self.mouse_state { + MouseState::HasPointerEvent(h) => h.on_pointer_move(&self.common, handler), + _ => {} + } + } + + pub fn on_pointer_down(&mut self, handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + match &mut self.mouse_state { + MouseState::HasPointerEvent(h) => h.on_pointer_down(&self.common, handler), + _ => {} + } + } + + pub fn on_pointer_up(&mut self, handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + match &mut self.mouse_state { + MouseState::HasPointerEvent(h) => h.on_pointer_up(&self.common, handler), + _ => {} + } + } + + pub fn on_pointer_cancel(&mut self, handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + match &mut self.mouse_state { + MouseState::HasPointerEvent(h) => h.on_pointer_cancel(&self.common, handler), + _ => {} + } + } + pub fn on_mouse_wheel(&mut self, mut handler: F) where F: 'static + FnMut(i32, MouseScrollDelta, ModifiersState), diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 85a99eb8ab..b373645919 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -1,7 +1,7 @@ use super::event; use super::EventListenerHandle; use crate::dpi::PhysicalPosition; -use crate::event::{ModifiersState, MouseButton}; +use crate::event::{ModifiersState, MouseButton, PointerType}; use web_sys::PointerEvent; @@ -12,6 +12,10 @@ pub(super) struct PointerHandler { on_cursor_move: Option>, on_pointer_press: Option>, on_pointer_release: Option>, + on_pointer_move: Option>, + on_pointer_down: Option>, + on_pointer_up: Option>, + on_pointer_cancel: Option>, } impl PointerHandler { @@ -22,6 +26,10 @@ impl PointerHandler { on_cursor_move: None, on_pointer_press: None, on_pointer_release: None, + on_pointer_move: None, + on_pointer_down: None, + on_pointer_up: None, + on_pointer_cancel: None, } } @@ -105,11 +113,111 @@ impl PointerHandler { )); } + pub fn on_pointer_move(&mut self, canvas_common: &super::Common, mut handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + self.on_pointer_move = Some(canvas_common.add_event( + "pointermove", + move |event: PointerEvent| { + handler( + event.pointer_id(), + PhysicalPosition { + x: event.offset_x() as f64, + y: event.offset_y() as f64, + }, + match event.pointer_type().as_str() { + "mouse" => PointerType::Mouse, + "pen" => PointerType::Pen, + "touch" => PointerType::Touch, + _ => PointerType::Unknown, + }, + ); + }, + )); + } + + pub fn on_pointer_down(&mut self, canvas_common: &super::Common, mut handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + self.on_pointer_down = Some(canvas_common.add_event( + "pointerdown", + move |event: PointerEvent| { + handler( + event.pointer_id(), + PhysicalPosition { + x: event.offset_x() as f64, + y: event.offset_y() as f64, + }, + match event.pointer_type().as_str() { + "mouse" => PointerType::Mouse, + "pen" => PointerType::Pen, + "touch" => PointerType::Touch, + _ => PointerType::Unknown, + }, + ); + }, + )); + } + + pub fn on_pointer_up(&mut self, canvas_common: &super::Common, mut handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + self.on_pointer_up = Some(canvas_common.add_event( + "pointerup", + move |event: PointerEvent| { + handler( + event.pointer_id(), + PhysicalPosition { + x: event.offset_x() as f64, + y: event.offset_y() as f64, + }, + match event.pointer_type().as_str() { + "mouse" => PointerType::Mouse, + "pen" => PointerType::Pen, + "touch" => PointerType::Touch, + _ => PointerType::Unknown, + }, + ); + }, + )); + } + + pub fn on_pointer_cancel(&mut self, canvas_common: &super::Common, mut handler: F) + where + F: 'static + FnMut(i32, PhysicalPosition, PointerType), + { + self.on_pointer_cancel = Some(canvas_common.add_event( + "pointercancel", + move |event: PointerEvent| { + handler( + event.pointer_id(), + PhysicalPosition { + x: event.offset_x() as f64, + y: event.offset_y() as f64, + }, + match event.pointer_type().as_str() { + "mouse" => PointerType::Mouse, + "pen" => PointerType::Pen, + "touch" => PointerType::Touch, + _ => PointerType::Unknown, + }, + ); + }, + )); + } + pub fn remove_listeners(&mut self) { self.on_cursor_leave = None; self.on_cursor_enter = None; self.on_cursor_move = None; self.on_pointer_press = None; self.on_pointer_release = None; + self.on_pointer_move = None; + self.on_pointer_down = None; + self.on_pointer_up = None; + self.on_pointer_cancel = None; } } From 93422c1009bff38f312ef2516f81be2a720f0fe6 Mon Sep 17 00:00:00 2001 From: Dany Sluijk Date: Thu, 20 May 2021 15:45:33 +0200 Subject: [PATCH 02/31] feat: remove PointerType for touch events --- src/event.rs | 15 ----------- .../web/event_loop/window_target.rs | 12 +++------ src/platform_impl/web/web_sys/canvas.rs | 12 ++++----- .../web/web_sys/canvas/pointer_handler.rs | 26 +++---------------- 4 files changed, 13 insertions(+), 52 deletions(-) diff --git a/src/event.rs b/src/event.rs index af03f3e169..65e556a2f7 100644 --- a/src/event.rs +++ b/src/event.rs @@ -746,21 +746,6 @@ pub struct Touch { pub force: Option, /// Unique identifier of a finger. pub id: u64, - /// Type of pointer used when touching. - /// - /// ## Platform-specific - /// - /// - Currently only available on Web targets. - pub pointer_type: Option, -} - -/// Describes the types of pointers available. -#[derive(Debug, Clone, Copy, PartialEq)] -pub enum PointerType { - Mouse, - Pen, - Touch, - Unknown, } /// Describes the force of a touch event diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index aa7b856c5b..58e8e319ed 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -236,7 +236,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_pointer_move(move |device_id, location, pointer_type| { + canvas.on_pointer_move(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -244,14 +244,13 @@ impl EventLoopWindowTarget { device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Moved, force: None, // Todo - pointer_type: Some(pointer_type), location, }), }); }); let runner = self.runner.clone(); - canvas.on_pointer_down(move |device_id, location, pointer_type| { + canvas.on_pointer_down(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -259,14 +258,13 @@ impl EventLoopWindowTarget { device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Started, force: None, // Todo - pointer_type: Some(pointer_type), location, }), }); }); let runner = self.runner.clone(); - canvas.on_pointer_up(move |device_id, location, pointer_type| { + canvas.on_pointer_up(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -274,14 +272,13 @@ impl EventLoopWindowTarget { device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Ended, force: None, // Todo - pointer_type: Some(pointer_type), location, }), }); }); let runner = self.runner.clone(); - canvas.on_pointer_cancel(move |device_id, location, pointer_type| { + canvas.on_pointer_cancel(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -289,7 +286,6 @@ impl EventLoopWindowTarget { device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Cancelled, force: None, // Todo - pointer_type: Some(pointer_type), location, }), }); diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 085a8651c0..ea891ac080 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -3,9 +3,7 @@ use super::event_handle::EventListenerHandle; use super::media_query_handle::MediaQueryListHandle; use crate::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize}; use crate::error::OsError as RootOE; -use crate::event::{ - ModifiersState, MouseButton, MouseScrollDelta, PointerType, ScanCode, VirtualKeyCode, -}; +use crate::event::{ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode}; use crate::platform_impl::{OsError, PlatformSpecificWindowBuilderAttributes}; use std::cell::RefCell; @@ -265,7 +263,7 @@ impl Canvas { pub fn on_pointer_move(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_pointer_move(&self.common, handler), @@ -275,7 +273,7 @@ impl Canvas { pub fn on_pointer_down(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_pointer_down(&self.common, handler), @@ -285,7 +283,7 @@ impl Canvas { pub fn on_pointer_up(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_pointer_up(&self.common, handler), @@ -295,7 +293,7 @@ impl Canvas { pub fn on_pointer_cancel(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_pointer_cancel(&self.common, handler), diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index b373645919..d8e2f82945 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -1,7 +1,7 @@ use super::event; use super::EventListenerHandle; use crate::dpi::PhysicalPosition; -use crate::event::{ModifiersState, MouseButton, PointerType}; +use crate::event::{ModifiersState, MouseButton}; use web_sys::PointerEvent; @@ -139,7 +139,7 @@ impl PointerHandler { pub fn on_pointer_down(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { self.on_pointer_down = Some(canvas_common.add_event( "pointerdown", @@ -150,12 +150,6 @@ impl PointerHandler { x: event.offset_x() as f64, y: event.offset_y() as f64, }, - match event.pointer_type().as_str() { - "mouse" => PointerType::Mouse, - "pen" => PointerType::Pen, - "touch" => PointerType::Touch, - _ => PointerType::Unknown, - }, ); }, )); @@ -163,7 +157,7 @@ impl PointerHandler { pub fn on_pointer_up(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { self.on_pointer_up = Some(canvas_common.add_event( "pointerup", @@ -174,12 +168,6 @@ impl PointerHandler { x: event.offset_x() as f64, y: event.offset_y() as f64, }, - match event.pointer_type().as_str() { - "mouse" => PointerType::Mouse, - "pen" => PointerType::Pen, - "touch" => PointerType::Touch, - _ => PointerType::Unknown, - }, ); }, )); @@ -187,7 +175,7 @@ impl PointerHandler { pub fn on_pointer_cancel(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { self.on_pointer_cancel = Some(canvas_common.add_event( "pointercancel", @@ -198,12 +186,6 @@ impl PointerHandler { x: event.offset_x() as f64, y: event.offset_y() as f64, }, - match event.pointer_type().as_str() { - "mouse" => PointerType::Mouse, - "pen" => PointerType::Pen, - "touch" => PointerType::Touch, - _ => PointerType::Unknown, - }, ); }, )); From 08cdb4aec2ea6facd10bdd5cddbca88d2d09e869 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Feb 2022 19:17:06 +0900 Subject: [PATCH 03/31] Remove duplicate --- Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 73f7d1ad37..3f5acfb21d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -122,8 +122,7 @@ features = [ 'Node', 'PointerEvent', 'Window', - 'WheelEvent', - 'PointerEvent', + 'WheelEvent' ] [target.'cfg(target_arch = "wasm32")'.dependencies.wasm-bindgen] From a09201c36f8d3f1cef25d61f4926f12fa8307e2e Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Feb 2022 19:21:16 +0900 Subject: [PATCH 04/31] Changelog and features --- CHANGELOG.md | 1 + FEATURES.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 099994d498..d5a06dec78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre # Unreleased +- On Web, add support touch events. - On Wayland, fix bug where the cursor wouldn't hide in GNOME. - On macOS, Windows, and Wayland, add `set_cursor_hittest` to let the window ignore mouse events. - On Windows, added `WindowExtWindows::set_skip_taskbar` and `WindowBuilderExtWindows::with_skip_taskbar`. diff --git a/FEATURES.md b/FEATURES.md index 02625f064e..3e26c4ad42 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -201,7 +201,7 @@ Legend: |Cursor grab |✔️ |▢[#165] |▢[#242] |✔️ |**N/A**|**N/A**|✔️ | |Cursor icon |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|✔️ | |Cursor hittest |✔️ |✔️ |❌ |✔️ |**N/A**|**N/A**|❌ | -|Touch events |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |❌ | +|Touch events |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |️✔️ | |Touch pressure |✔️ |❌ |❌ |❌ |❌ |✔️ |❌ | |Multitouch |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |❌ | |Keyboard events |✔️ |✔️ |✔️ |✔️ |❓ |❌ |✔️ | From 950a7e5a77db987714bbf23b502f8a792a2e84a5 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Feb 2022 19:50:29 +0900 Subject: [PATCH 05/31] Remove PointerType --- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index d8e2f82945..9b3d9cb1d8 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -115,7 +115,7 @@ impl PointerHandler { pub fn on_pointer_move(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition, PointerType), + F: 'static + FnMut(i32, PhysicalPosition), { self.on_pointer_move = Some(canvas_common.add_event( "pointermove", From 6822fc8d6e5fdd851941b3bae680af7d9be796c6 Mon Sep 17 00:00:00 2001 From: Dany Sluijk Date: Sun, 23 May 2021 12:08:04 +0200 Subject: [PATCH 06/31] feat: renamed events, added touch type guard --- .../web/web_sys/canvas/pointer_handler.rs | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 9b3d9cb1d8..57c6b6924e 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -12,10 +12,10 @@ pub(super) struct PointerHandler { on_cursor_move: Option>, on_pointer_press: Option>, on_pointer_release: Option>, - on_pointer_move: Option>, - on_pointer_down: Option>, - on_pointer_up: Option>, - on_pointer_cancel: Option>, + on_touch_move: Option>, + on_touch_down: Option>, + on_touch_up: Option>, + on_touch_cancel: Option>, } impl PointerHandler { @@ -26,10 +26,10 @@ impl PointerHandler { on_cursor_move: None, on_pointer_press: None, on_pointer_release: None, - on_pointer_move: None, - on_pointer_down: None, - on_pointer_up: None, - on_pointer_cancel: None, + on_touch_move: None, + on_touch_down: None, + on_touch_up: None, + on_touch_cancel: None, } } @@ -117,21 +117,19 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { - self.on_pointer_move = Some(canvas_common.add_event( + self.on_touch_move = Some(canvas_common.add_event( "pointermove", move |event: PointerEvent| { + if event.pointer_type() != "touch" { + return; + } + handler( event.pointer_id(), PhysicalPosition { x: event.offset_x() as f64, y: event.offset_y() as f64, }, - match event.pointer_type().as_str() { - "mouse" => PointerType::Mouse, - "pen" => PointerType::Pen, - "touch" => PointerType::Touch, - _ => PointerType::Unknown, - }, ); }, )); @@ -141,9 +139,13 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { - self.on_pointer_down = Some(canvas_common.add_event( + self.on_touch_down = Some(canvas_common.add_event( "pointerdown", move |event: PointerEvent| { + if event.pointer_type() != "touch" { + return; + } + handler( event.pointer_id(), PhysicalPosition { @@ -159,9 +161,13 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { - self.on_pointer_up = Some(canvas_common.add_event( + self.on_touch_up = Some(canvas_common.add_event( "pointerup", move |event: PointerEvent| { + if event.pointer_type() != "touch" { + return; + } + handler( event.pointer_id(), PhysicalPosition { @@ -177,9 +183,13 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { - self.on_pointer_cancel = Some(canvas_common.add_event( + self.on_touch_cancel = Some(canvas_common.add_event( "pointercancel", move |event: PointerEvent| { + if event.pointer_type() != "touch" { + return; + } + handler( event.pointer_id(), PhysicalPosition { @@ -197,9 +207,9 @@ impl PointerHandler { self.on_cursor_move = None; self.on_pointer_press = None; self.on_pointer_release = None; - self.on_pointer_move = None; - self.on_pointer_down = None; - self.on_pointer_up = None; - self.on_pointer_cancel = None; + self.on_touch_move = None; + self.on_touch_down = None; + self.on_touch_up = None; + self.on_touch_cancel = None; } } From e47fe8d06c2ebbe9bf38cab3e0f48fcb84c4ed2a Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Feb 2022 20:22:47 +0900 Subject: [PATCH 07/31] Rename --- .../web/event_loop/window_target.rs | 8 ++++---- src/platform_impl/web/web_sys/canvas.rs | 16 ++++++++-------- .../web/web_sys/canvas/pointer_handler.rs | 8 ++++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 58e8e319ed..946fa3483d 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -236,7 +236,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_pointer_move(move |device_id, location| { + canvas.on_touch_move(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -250,7 +250,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_pointer_down(move |device_id, location| { + canvas.on_touch_down(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -264,7 +264,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_pointer_up(move |device_id, location| { + canvas.on_touch_up(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { @@ -278,7 +278,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_pointer_cancel(move |device_id, location| { + canvas.on_touch_cancel(move |device_id, location| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index ea891ac080..6c427f7742 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -261,42 +261,42 @@ impl Canvas { } } - pub fn on_pointer_move(&mut self, handler: F) + pub fn on_touch_move(&mut self, handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_pointer_move(&self.common, handler), + MouseState::HasPointerEvent(h) => h.on_touch_move(&self.common, handler), _ => {} } } - pub fn on_pointer_down(&mut self, handler: F) + pub fn on_touch_down(&mut self, handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_pointer_down(&self.common, handler), + MouseState::HasPointerEvent(h) => h.on_touch_down(&self.common, handler), _ => {} } } - pub fn on_pointer_up(&mut self, handler: F) + pub fn on_touch_up(&mut self, handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_pointer_up(&self.common, handler), + MouseState::HasPointerEvent(h) => h.on_touch_up(&self.common, handler), _ => {} } } - pub fn on_pointer_cancel(&mut self, handler: F) + pub fn on_touch_cancel(&mut self, handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_pointer_cancel(&self.common, handler), + MouseState::HasPointerEvent(h) => h.on_touch_cancel(&self.common, handler), _ => {} } } diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 57c6b6924e..253a8225ef 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -113,7 +113,7 @@ impl PointerHandler { )); } - pub fn on_pointer_move(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_move(&mut self, canvas_common: &super::Common, mut handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { @@ -135,7 +135,7 @@ impl PointerHandler { )); } - pub fn on_pointer_down(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_down(&mut self, canvas_common: &super::Common, mut handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { @@ -157,7 +157,7 @@ impl PointerHandler { )); } - pub fn on_pointer_up(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_up(&mut self, canvas_common: &super::Common, mut handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { @@ -179,7 +179,7 @@ impl PointerHandler { )); } - pub fn on_pointer_cancel(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, mut handler: F) where F: 'static + FnMut(i32, PhysicalPosition), { From 2c7eab93bc8aeb101cd0c00915b152b1c8dfeae2 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Feb 2022 20:27:27 +0900 Subject: [PATCH 08/31] Flip the y axis --- .../web/web_sys/canvas/pointer_handler.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 253a8225ef..94636a6d2b 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -117,6 +117,7 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { + let canvas = canvas_common.raw.clone(); self.on_touch_move = Some(canvas_common.add_event( "pointermove", move |event: PointerEvent| { @@ -128,7 +129,8 @@ impl PointerHandler { event.pointer_id(), PhysicalPosition { x: event.offset_x() as f64, - y: event.offset_y() as f64, + // Flip the Y axis. + y: (canvas.height() as i32 - event.offset_y()) as f64, }, ); }, @@ -139,6 +141,7 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { + let canvas = canvas_common.raw.clone(); self.on_touch_down = Some(canvas_common.add_event( "pointerdown", move |event: PointerEvent| { @@ -150,7 +153,8 @@ impl PointerHandler { event.pointer_id(), PhysicalPosition { x: event.offset_x() as f64, - y: event.offset_y() as f64, + // Flip the Y axis. + y: (canvas.height() as i32 - event.offset_y()) as f64, }, ); }, @@ -161,6 +165,7 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { + let canvas = canvas_common.raw.clone(); self.on_touch_up = Some(canvas_common.add_event( "pointerup", move |event: PointerEvent| { @@ -172,7 +177,8 @@ impl PointerHandler { event.pointer_id(), PhysicalPosition { x: event.offset_x() as f64, - y: event.offset_y() as f64, + // Flip the Y axis. + y: (canvas.height() as i32 - event.offset_y()) as f64, }, ); }, @@ -183,6 +189,7 @@ impl PointerHandler { where F: 'static + FnMut(i32, PhysicalPosition), { + let canvas = canvas_common.raw.clone(); self.on_touch_cancel = Some(canvas_common.add_event( "pointercancel", move |event: PointerEvent| { @@ -194,7 +201,8 @@ impl PointerHandler { event.pointer_id(), PhysicalPosition { x: event.offset_x() as f64, - y: event.offset_y() as f64, + // Flip the Y axis. + y: (canvas.height() as i32 - event.offset_y()) as f64, }, ); }, From 0094ec2afda0a8b5b1e09335b9de419d6c44feb1 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Tue, 8 Feb 2022 09:46:04 +0900 Subject: [PATCH 09/31] Fix physical position and add force --- .../web/event_loop/window_target.rs | 16 ++--- src/platform_impl/web/web_sys/canvas.rs | 12 ++-- .../web/web_sys/canvas/pointer_handler.rs | 60 ++++++++++++------- 3 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 946fa3483d..9894202f33 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -236,56 +236,56 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); - canvas.on_touch_move(move |device_id, location| { + canvas.on_touch_move(move |device_id, location, force| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Moved, - force: None, // Todo + force: Some(force), // Todo location, }), }); }); let runner = self.runner.clone(); - canvas.on_touch_down(move |device_id, location| { + canvas.on_touch_down(move |device_id, location, force| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Started, - force: None, // Todo + force: Some(force), location, }), }); }); let runner = self.runner.clone(); - canvas.on_touch_up(move |device_id, location| { + canvas.on_touch_up(move |device_id, location, force| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Ended, - force: None, // Todo + force: Some(force), // Todo location, }), }); }); let runner = self.runner.clone(); - canvas.on_touch_cancel(move |device_id, location| { + canvas.on_touch_cancel(move |device_id, location, force| { runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Cancelled, - force: None, // Todo + force: Some(force), // Todo location, }), }); diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 6c427f7742..4fd67f67ab 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -3,7 +3,9 @@ use super::event_handle::EventListenerHandle; use super::media_query_handle::MediaQueryListHandle; use crate::dpi::{LogicalPosition, PhysicalPosition, PhysicalSize}; use crate::error::OsError as RootOE; -use crate::event::{ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode}; +use crate::event::{ + Force, ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode, +}; use crate::platform_impl::{OsError, PlatformSpecificWindowBuilderAttributes}; use std::cell::RefCell; @@ -263,7 +265,7 @@ impl Canvas { pub fn on_touch_move(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_touch_move(&self.common, handler), @@ -273,7 +275,7 @@ impl Canvas { pub fn on_touch_down(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_touch_down(&self.common, handler), @@ -283,7 +285,7 @@ impl Canvas { pub fn on_touch_up(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_touch_up(&self.common, handler), @@ -293,7 +295,7 @@ impl Canvas { pub fn on_touch_cancel(&mut self, handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => h.on_touch_cancel(&self.common, handler), diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 94636a6d2b..e44a4609be 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -1,8 +1,10 @@ use super::event; use super::EventListenerHandle; use crate::dpi::PhysicalPosition; +use crate::event::Force; use crate::event::{ModifiersState, MouseButton}; +use web_sys::HtmlCanvasElement; use web_sys::PointerEvent; #[allow(dead_code)] @@ -115,7 +117,7 @@ impl PointerHandler { pub fn on_touch_move(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { let canvas = canvas_common.raw.clone(); self.on_touch_move = Some(canvas_common.add_event( @@ -127,10 +129,11 @@ impl PointerHandler { handler( event.pointer_id(), - PhysicalPosition { - x: event.offset_x() as f64, - // Flip the Y axis. - y: (canvas.height() as i32 - event.offset_y()) as f64, + touch_physical_position(&event, &canvas), + Force::Calibrated { + force: event.pressure() as f64, + max_possible_force: 1.0, + altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. }, ); }, @@ -139,7 +142,7 @@ impl PointerHandler { pub fn on_touch_down(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { let canvas = canvas_common.raw.clone(); self.on_touch_down = Some(canvas_common.add_event( @@ -151,10 +154,11 @@ impl PointerHandler { handler( event.pointer_id(), - PhysicalPosition { - x: event.offset_x() as f64, - // Flip the Y axis. - y: (canvas.height() as i32 - event.offset_y()) as f64, + touch_physical_position(&event, &canvas), + Force::Calibrated { + force: event.pressure() as f64, + max_possible_force: 1.0, + altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. }, ); }, @@ -163,7 +167,7 @@ impl PointerHandler { pub fn on_touch_up(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { let canvas = canvas_common.raw.clone(); self.on_touch_up = Some(canvas_common.add_event( @@ -175,10 +179,11 @@ impl PointerHandler { handler( event.pointer_id(), - PhysicalPosition { - x: event.offset_x() as f64, - // Flip the Y axis. - y: (canvas.height() as i32 - event.offset_y()) as f64, + touch_physical_position(&event, &canvas), + Force::Calibrated { + force: event.pressure() as f64, + max_possible_force: 1.0, + altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. }, ); }, @@ -187,7 +192,7 @@ impl PointerHandler { pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, mut handler: F) where - F: 'static + FnMut(i32, PhysicalPosition), + F: 'static + FnMut(i32, PhysicalPosition, Force), { let canvas = canvas_common.raw.clone(); self.on_touch_cancel = Some(canvas_common.add_event( @@ -199,10 +204,11 @@ impl PointerHandler { handler( event.pointer_id(), - PhysicalPosition { - x: event.offset_x() as f64, - // Flip the Y axis. - y: (canvas.height() as i32 - event.offset_y()) as f64, + touch_physical_position(&event, &canvas), + Force::Calibrated { + force: event.pressure() as f64, + max_possible_force: 1.0, + altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. }, ); }, @@ -221,3 +227,17 @@ impl PointerHandler { self.on_touch_cancel = None; } } + +fn touch_physical_position( + event: &PointerEvent, + canvas: &HtmlCanvasElement, +) -> PhysicalPosition { + // not scale factor here because we can modify the dpi. + let dpi_width = canvas.width() as f64 / canvas.offset_width() as f64; + let dpi_height = canvas.height() as f64 / canvas.offset_height() as f64; + PhysicalPosition { + x: event.client_x() as f64 * dpi_width, + // Flip the Y axis because canvas's origin is top-left. + y: canvas.height() as f64 - event.client_y() as f64 * dpi_height, + } +} From 4f38d825dfb740477e9eecec295fb63abaf52329 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Tue, 8 Feb 2022 10:37:54 +0900 Subject: [PATCH 10/31] Update comment --- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index e44a4609be..13d493dcdf 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -232,7 +232,7 @@ fn touch_physical_position( event: &PointerEvent, canvas: &HtmlCanvasElement, ) -> PhysicalPosition { - // not scale factor here because we can modify the dpi. + // not window scale factor here because we can modify the scale factor. let dpi_width = canvas.width() as f64 / canvas.offset_width() as f64; let dpi_height = canvas.height() as f64 / canvas.offset_height() as f64; PhysicalPosition { From 6b22593fb991dbd5a3f1d3c0718152ac799b9399 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Tue, 8 Feb 2022 10:47:47 +0900 Subject: [PATCH 11/31] Update features --- FEATURES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FEATURES.md b/FEATURES.md index 3e26c4ad42..5d974cee19 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -202,7 +202,7 @@ Legend: |Cursor icon |✔️ |✔️ |✔️ |✔️ |**N/A**|**N/A**|✔️ | |Cursor hittest |✔️ |✔️ |❌ |✔️ |**N/A**|**N/A**|❌ | |Touch events |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |️✔️ | -|Touch pressure |✔️ |❌ |❌ |❌ |❌ |✔️ |❌ | +|Touch pressure |✔️ |❌ |❌ |❌ |❌ |✔️ |✔️ | |Multitouch |✔️ |❌ |✔️ |✔️ |✔️ |✔️ |❌ | |Keyboard events |✔️ |✔️ |✔️ |✔️ |❓ |❌ |✔️ | |Drag & Drop |▢[#720] |▢[#720] |▢[#720] |❌[#306] |**N/A**|**N/A**|❓ | From 5ef967928b83da28389a00ae48c240c01c67b160 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Sun, 20 Feb 2022 18:02:54 +0900 Subject: [PATCH 12/31] Use normalized force --- .../web/web_sys/canvas/pointer_handler.rs | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 13d493dcdf..1bec60a8bb 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -130,11 +130,7 @@ impl PointerHandler { handler( event.pointer_id(), touch_physical_position(&event, &canvas), - Force::Calibrated { - force: event.pressure() as f64, - max_possible_force: 1.0, - altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. - }, + Force::Normalized(event.pressure() as f64), ); }, )); @@ -155,11 +151,7 @@ impl PointerHandler { handler( event.pointer_id(), touch_physical_position(&event, &canvas), - Force::Calibrated { - force: event.pressure() as f64, - max_possible_force: 1.0, - altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. - }, + Force::Normalized(event.pressure() as f64), ); }, )); @@ -180,11 +172,7 @@ impl PointerHandler { handler( event.pointer_id(), touch_physical_position(&event, &canvas), - Force::Calibrated { - force: event.pressure() as f64, - max_possible_force: 1.0, - altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. - }, + Force::Normalized(event.pressure() as f64), ); }, )); @@ -205,11 +193,7 @@ impl PointerHandler { handler( event.pointer_id(), touch_physical_position(&event, &canvas), - Force::Calibrated { - force: event.pressure() as f64, - max_possible_force: 1.0, - altitude_angle: None, // I don't have any idea how to calculate this from tilt_x and tilt_y. - }, + Force::Normalized(event.pressure() as f64), ); }, )); From 84f9c668e4b0e116035c6f424af71896d28d2553 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 26 May 2022 16:27:53 +0900 Subject: [PATCH 13/31] Remove unnecessary todos --- src/platform_impl/web/event_loop/window_target.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index 9894202f33..6a4a9df1c1 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -243,7 +243,7 @@ impl EventLoopWindowTarget { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Moved, - force: Some(force), // Todo + force: Some(force), location, }), }); @@ -271,7 +271,7 @@ impl EventLoopWindowTarget { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Ended, - force: Some(force), // Todo + force: Some(force), location, }), }); @@ -285,7 +285,7 @@ impl EventLoopWindowTarget { id: device_id as u64, device_id: RootDeviceId(DeviceId(device_id)), phase: TouchPhase::Cancelled, - force: Some(force), // Todo + force: Some(force), location, }), }); From 3c5635f403e6b7acdf3fc333e80e094d5aef8f42 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 26 May 2022 16:36:06 +0900 Subject: [PATCH 14/31] Update comment --- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 1bec60a8bb..9225ce9dfd 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -216,7 +216,7 @@ fn touch_physical_position( event: &PointerEvent, canvas: &HtmlCanvasElement, ) -> PhysicalPosition { - // not window scale factor here because we can modify the scale factor. + // calculate the scale factor everytime because we can resize the actual canvas on html. let dpi_width = canvas.width() as f64 / canvas.offset_width() as f64; let dpi_height = canvas.height() as f64 / canvas.offset_height() as f64; PhysicalPosition { From 1911832f28263b1cd8742a1209a8ec58057aaf6c Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 26 May 2022 16:42:09 +0900 Subject: [PATCH 15/31] Refactor add touch_handler --- .../web/web_sys/canvas/pointer_handler.rs | 94 ++++++------------- 1 file changed, 30 insertions(+), 64 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 9225ce9dfd..dc4db22474 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -115,88 +115,36 @@ impl PointerHandler { )); } - pub fn on_touch_move(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_move(&mut self, canvas_common: &super::Common, handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - let canvas = canvas_common.raw.clone(); - self.on_touch_move = Some(canvas_common.add_event( - "pointermove", - move |event: PointerEvent| { - if event.pointer_type() != "touch" { - return; - } - - handler( - event.pointer_id(), - touch_physical_position(&event, &canvas), - Force::Normalized(event.pressure() as f64), - ); - }, - )); + self.on_touch_move = + Some(canvas_common.add_event("pointermove", touch_handler(handler, canvas_common))); } - pub fn on_touch_down(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_down(&mut self, canvas_common: &super::Common, handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - let canvas = canvas_common.raw.clone(); - self.on_touch_down = Some(canvas_common.add_event( - "pointerdown", - move |event: PointerEvent| { - if event.pointer_type() != "touch" { - return; - } - - handler( - event.pointer_id(), - touch_physical_position(&event, &canvas), - Force::Normalized(event.pressure() as f64), - ); - }, - )); + self.on_touch_down = + Some(canvas_common.add_event("pointerdown", touch_handler(handler, canvas_common))); } - pub fn on_touch_up(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_up(&mut self, canvas_common: &super::Common, handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - let canvas = canvas_common.raw.clone(); - self.on_touch_up = Some(canvas_common.add_event( - "pointerup", - move |event: PointerEvent| { - if event.pointer_type() != "touch" { - return; - } - - handler( - event.pointer_id(), - touch_physical_position(&event, &canvas), - Force::Normalized(event.pressure() as f64), - ); - }, - )); + self.on_touch_up = + Some(canvas_common.add_event("pointerup", touch_handler(handler, canvas_common))); } - pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, mut handler: F) + pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - let canvas = canvas_common.raw.clone(); - self.on_touch_cancel = Some(canvas_common.add_event( - "pointercancel", - move |event: PointerEvent| { - if event.pointer_type() != "touch" { - return; - } - - handler( - event.pointer_id(), - touch_physical_position(&event, &canvas), - Force::Normalized(event.pressure() as f64), - ); - }, - )); + self.on_touch_cancel = + Some(canvas_common.add_event("pointercancel", touch_handler(handler, canvas_common))); } pub fn remove_listeners(&mut self) { @@ -212,6 +160,24 @@ impl PointerHandler { } } +fn touch_handler(mut handler: F, canvas_common: &super::Common) -> impl FnMut(PointerEvent) +where + F: 'static + FnMut(i32, PhysicalPosition, Force), +{ + let canvas = canvas_common.raw.clone(); + move |event: PointerEvent| { + if event.pointer_type() != "touch" { + return; + } + + handler( + event.pointer_id(), + touch_physical_position(&event, &canvas), + Force::Normalized(event.pressure() as f64), + ); + } +} + fn touch_physical_position( event: &PointerEvent, canvas: &HtmlCanvasElement, From a977817786a5c1c8d2062baf87d91468ebf9f06e Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 26 May 2022 19:11:19 +0900 Subject: [PATCH 16/31] Rephrase by Liamolucko --- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index dc4db22474..509403a2a8 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -182,7 +182,7 @@ fn touch_physical_position( event: &PointerEvent, canvas: &HtmlCanvasElement, ) -> PhysicalPosition { - // calculate the scale factor everytime because we can resize the actual canvas on html. + // Calculate the scale factor every time, since it's possible for the canvas's width and height attributes to get out of sync with its actual HTML size. let dpi_width = canvas.width() as f64 / canvas.offset_width() as f64; let dpi_height = canvas.height() as f64 / canvas.offset_height() as f64; PhysicalPosition { From 216242090f29033d85ca68d0d575a9326b654e43 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 26 May 2022 19:17:29 +0900 Subject: [PATCH 17/31] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a06dec78..5d0aa3df85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre # Unreleased -- On Web, add support touch events. +- On Web, add support for touch events. - On Wayland, fix bug where the cursor wouldn't hide in GNOME. - On macOS, Windows, and Wayland, add `set_cursor_hittest` to let the window ignore mouse events. - On Windows, added `WindowExtWindows::set_skip_taskbar` and `WindowBuilderExtWindows::with_skip_taskbar`. From 736168e29c92bd2ba507cf9a084c3156a0416c74 Mon Sep 17 00:00:00 2001 From: Johan Klokkhammer Helsing Date: Sat, 11 Jun 2022 22:35:55 +0200 Subject: [PATCH 18/31] Fix duplicate mouse and touch events --- .../web/web_sys/canvas/pointer_handler.rs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 509403a2a8..7b73704198 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -42,6 +42,13 @@ impl PointerHandler { self.on_cursor_leave = Some(canvas_common.add_event( "pointerout", move |event: PointerEvent| { + // touch events are handled separately + // handling them here would produce duplicate mouse events, inconsistent with + // other platforms. + if event.pointer_type() == "touch" { + return; + } + handler(event.pointer_id()); }, )); @@ -54,6 +61,13 @@ impl PointerHandler { self.on_cursor_enter = Some(canvas_common.add_event( "pointerover", move |event: PointerEvent| { + // touch events are handled separately + // handling them here would produce duplicate mouse events, inconsistent with + // other platforms. + if event.pointer_type() == "touch" { + return; + } + handler(event.pointer_id()); }, )); @@ -66,6 +80,13 @@ impl PointerHandler { self.on_pointer_release = Some(canvas_common.add_user_event( "pointerup", move |event: PointerEvent| { + // touch events are handled separately + // handling them here would produce duplicate mouse events, inconsistent with + // other platforms. + if event.pointer_type() == "touch" { + return; + } + handler( event.pointer_id(), event::mouse_button(&event), @@ -83,6 +104,13 @@ impl PointerHandler { self.on_pointer_press = Some(canvas_common.add_user_event( "pointerdown", move |event: PointerEvent| { + // touch events are handled separately + // handling them here would produce duplicate mouse events, inconsistent with + // other platforms. + if event.pointer_type() == "touch" { + return; + } + handler( event.pointer_id(), event::mouse_position(&event).to_physical(super::super::scale_factor()), @@ -105,6 +133,13 @@ impl PointerHandler { self.on_cursor_move = Some(canvas_common.add_event( "pointermove", move |event: PointerEvent| { + // touch events are handled separately + // handling them here would produce duplicate mouse events, inconsistent with + // other platforms. + if event.pointer_type() == "touch" { + return; + } + handler( event.pointer_id(), event::mouse_position(&event).to_physical(super::super::scale_factor()), From 94a834315816b0c4c6116cf0c39a0479ee98ac4b Mon Sep 17 00:00:00 2001 From: oscrim Date: Tue, 6 Sep 2022 10:13:34 +0200 Subject: [PATCH 19/31] Removed workaround for scale factor --- .../web/web_sys/canvas/pointer_handler.rs | 29 +++++-------------- src/platform_impl/web/web_sys/event.rs | 10 ++++++- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 7b73704198..e30ae3ac70 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -4,7 +4,6 @@ use crate::dpi::PhysicalPosition; use crate::event::Force; use crate::event::{ModifiersState, MouseButton}; -use web_sys::HtmlCanvasElement; use web_sys::PointerEvent; #[allow(dead_code)] @@ -155,7 +154,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_move = - Some(canvas_common.add_event("pointermove", touch_handler(handler, canvas_common))); + Some(canvas_common.add_event("pointermove", touch_handler(handler))); } pub fn on_touch_down(&mut self, canvas_common: &super::Common, handler: F) @@ -163,7 +162,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_down = - Some(canvas_common.add_event("pointerdown", touch_handler(handler, canvas_common))); + Some(canvas_common.add_event("pointerdown", touch_handler(handler))); } pub fn on_touch_up(&mut self, canvas_common: &super::Common, handler: F) @@ -171,7 +170,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_up = - Some(canvas_common.add_event("pointerup", touch_handler(handler, canvas_common))); + Some(canvas_common.add_event("pointerup", touch_handler(handler))); } pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, handler: F) @@ -179,7 +178,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_cancel = - Some(canvas_common.add_event("pointercancel", touch_handler(handler, canvas_common))); + Some(canvas_common.add_event("pointercancel", touch_handler(handler))); } pub fn remove_listeners(&mut self) { @@ -195,11 +194,10 @@ impl PointerHandler { } } -fn touch_handler(mut handler: F, canvas_common: &super::Common) -> impl FnMut(PointerEvent) +fn touch_handler(mut handler: F) -> impl FnMut(PointerEvent) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - let canvas = canvas_common.raw.clone(); move |event: PointerEvent| { if event.pointer_type() != "touch" { return; @@ -207,22 +205,9 @@ where handler( event.pointer_id(), - touch_physical_position(&event, &canvas), + event::touch_position(&event) + .to_physical(super::super::scale_factor()), Force::Normalized(event.pressure() as f64), ); } } - -fn touch_physical_position( - event: &PointerEvent, - canvas: &HtmlCanvasElement, -) -> PhysicalPosition { - // Calculate the scale factor every time, since it's possible for the canvas's width and height attributes to get out of sync with its actual HTML size. - let dpi_width = canvas.width() as f64 / canvas.offset_width() as f64; - let dpi_height = canvas.height() as f64 / canvas.offset_height() as f64; - PhysicalPosition { - x: event.client_x() as f64 * dpi_width, - // Flip the Y axis because canvas's origin is top-left. - y: canvas.height() as f64 - event.client_y() as f64 * dpi_height, - } -} diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index 7dfbd8cf87..3d1018084c 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -2,7 +2,7 @@ use crate::dpi::LogicalPosition; use crate::event::{ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode}; use std::convert::TryInto; -use web_sys::{HtmlCanvasElement, KeyboardEvent, MouseEvent, WheelEvent}; +use web_sys::{HtmlCanvasElement, KeyboardEvent, MouseEvent, WheelEvent, PointerEvent}; pub fn mouse_button(event: &MouseEvent) -> MouseButton { match event.button() { @@ -246,3 +246,11 @@ pub fn codepoint(event: &KeyboardEvent) -> char { // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key event.key().chars().next().unwrap() } + +pub fn touch_position(event: &PointerEvent) -> LogicalPosition { + LogicalPosition { + x: event.client_x() as f64, + // Flip the Y axis because canvas's origin is top-left. + y: event.client_y() as f64, + } +} From 0987b716e091f226f5fb1f3087314ea0ecd13c32 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 8 Sep 2022 22:04:22 +0900 Subject: [PATCH 20/31] Flip the y axis --- .../web/web_sys/canvas/pointer_handler.rs | 14 +++++++------- src/platform_impl/web/web_sys/event.rs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index e30ae3ac70..8d50ba43a4 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -154,7 +154,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_move = - Some(canvas_common.add_event("pointermove", touch_handler(handler))); + Some(canvas_common.add_event("pointermove", touch_handler(handler, canvas_common))); } pub fn on_touch_down(&mut self, canvas_common: &super::Common, handler: F) @@ -162,7 +162,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_down = - Some(canvas_common.add_event("pointerdown", touch_handler(handler))); + Some(canvas_common.add_event("pointerdown", touch_handler(handler, canvas_common))); } pub fn on_touch_up(&mut self, canvas_common: &super::Common, handler: F) @@ -170,7 +170,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_up = - Some(canvas_common.add_event("pointerup", touch_handler(handler))); + Some(canvas_common.add_event("pointerup", touch_handler(handler, canvas_common))); } pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, handler: F) @@ -178,7 +178,7 @@ impl PointerHandler { F: 'static + FnMut(i32, PhysicalPosition, Force), { self.on_touch_cancel = - Some(canvas_common.add_event("pointercancel", touch_handler(handler))); + Some(canvas_common.add_event("pointercancel", touch_handler(handler, canvas_common))); } pub fn remove_listeners(&mut self) { @@ -194,10 +194,11 @@ impl PointerHandler { } } -fn touch_handler(mut handler: F) -> impl FnMut(PointerEvent) +fn touch_handler(mut handler: F, canvas_common: &super::Common) -> impl FnMut(PointerEvent) where F: 'static + FnMut(i32, PhysicalPosition, Force), { + let canvas = canvas_common.raw.clone(); move |event: PointerEvent| { if event.pointer_type() != "touch" { return; @@ -205,8 +206,7 @@ where handler( event.pointer_id(), - event::touch_position(&event) - .to_physical(super::super::scale_factor()), + event::touch_position(&event, &canvas).to_physical(super::super::scale_factor()), Force::Normalized(event.pressure() as f64), ); } diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index 3d1018084c..9b0463afd0 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -247,10 +247,10 @@ pub fn codepoint(event: &KeyboardEvent) -> char { event.key().chars().next().unwrap() } -pub fn touch_position(event: &PointerEvent) -> LogicalPosition { +pub fn touch_position(event: &PointerEvent, canvas: &HtmlCanvasElement) -> LogicalPosition { LogicalPosition { x: event.client_x() as f64, // Flip the Y axis because canvas's origin is top-left. - y: event.client_y() as f64, + y: canvas.height() as f64 - event.client_y() as f64, } } From bac7e9323ba2b885a79accde71d0bda5189d4f60 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 8 Sep 2022 22:06:53 +0900 Subject: [PATCH 21/31] Fix --- src/platform_impl/web/web_sys/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index 9b0463afd0..e425b36696 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -251,6 +251,6 @@ pub fn touch_position(event: &PointerEvent, canvas: &HtmlCanvasElement) -> Logic LogicalPosition { x: event.client_x() as f64, // Flip the Y axis because canvas's origin is top-left. - y: canvas.height() as f64 - event.client_y() as f64, + y: canvas.client_height() as f64 - event.client_y() as f64, } } From 6d6cd8bdff635b825dabed0a0500913f675d238c Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 8 Sep 2022 22:54:34 +0900 Subject: [PATCH 22/31] Fmt --- src/platform_impl/web/web_sys/event.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index e425b36696..86a1f6ca71 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -2,7 +2,7 @@ use crate::dpi::LogicalPosition; use crate::event::{ModifiersState, MouseButton, MouseScrollDelta, ScanCode, VirtualKeyCode}; use std::convert::TryInto; -use web_sys::{HtmlCanvasElement, KeyboardEvent, MouseEvent, WheelEvent, PointerEvent}; +use web_sys::{HtmlCanvasElement, KeyboardEvent, MouseEvent, PointerEvent, WheelEvent}; pub fn mouse_button(event: &MouseEvent) -> MouseButton { match event.button() { From 4fed48db7394d25dd59460e30330842de96237c5 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Thu, 8 Sep 2022 23:21:58 +0900 Subject: [PATCH 23/31] Replace `match` with a single pattern with `if let` --- src/platform_impl/web/web_sys/canvas.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index bfda189baa..30ea354e0f 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -300,9 +300,8 @@ impl Canvas { where F: 'static + FnMut(i32, PhysicalPosition, Force), { - match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_touch_move(&self.common, handler), - _ => {} + if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { + h.on_touch_move(&self.common, handler) } } @@ -310,9 +309,8 @@ impl Canvas { where F: 'static + FnMut(i32, PhysicalPosition, Force), { - match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_touch_down(&self.common, handler), - _ => {} + if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { + h.on_touch_down(&self.common, handler) } } @@ -320,9 +318,8 @@ impl Canvas { where F: 'static + FnMut(i32, PhysicalPosition, Force), { - match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_touch_up(&self.common, handler), - _ => {} + if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { + h.on_touch_up(&self.common, handler) } } @@ -330,9 +327,8 @@ impl Canvas { where F: 'static + FnMut(i32, PhysicalPosition, Force), { - match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_touch_cancel(&self.common, handler), - _ => {} + if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { + h.on_touch_cancel(&self.common, handler) } } From 579efe3a36dc4fc0fd59f87fb830b18d0e532c3c Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Nov 2022 22:32:02 +0900 Subject: [PATCH 24/31] Update documentation --- CHANGELOG.md | 2 +- src/event.rs | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85231171c1..d35a7152d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre # Unreleased -- On Web, add support for touch events. +- **Breaking:** On Web, touch input no longer fires `WindowEvent::Cursor*`, `WindowEvent::MouseInput`, or `DeviceEvent::MouseMotion` like other platforms, but instead it fires `WindowEvent::Touch`. - Migrated `WindowBuilderExtUnix::with_resize_increments` to `WindowBuilder`. - Added `Window::resize_increments`/`Window::set_resize_increments` to update resize increments at runtime for X11/macOS. - macOS/iOS: Use `objc2` instead of `objc` internally. diff --git a/src/event.rs b/src/event.rs index 819dc33461..3d0d624fe1 100644 --- a/src/event.rs +++ b/src/event.rs @@ -477,6 +477,8 @@ pub enum WindowEvent<'a> { }, /// Touch event has been received + /// + /// At the moment, not supported on MacOS. Touch(Touch), /// The window's scale factor has changed. @@ -907,6 +909,8 @@ pub enum TouchPhase { /// Represents a touch event /// +/// At the moment, not supported on MacOS. +/// /// Every time the user touches the screen, a new [`TouchPhase::Started`] event with an unique /// identifier for the finger is generated. When the finger is lifted, an [`TouchPhase::Ended`] /// event is generated with the same finger id. From c32f0a0ba03e4e9990bcb0e06fd2b010074a325e Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Nov 2022 23:20:45 +0900 Subject: [PATCH 25/31] Have one callback per event --- .../web/event_loop/window_target.rs | 150 +++++++------- src/platform_impl/web/web_sys/canvas.rs | 65 +++---- .../web/web_sys/canvas/pointer_handler.rs | 183 ++++++++---------- 3 files changed, 183 insertions(+), 215 deletions(-) diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index f529970812..f6e60dd5ec 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -173,51 +173,91 @@ impl EventLoopWindowTarget { }, }); }, + move |device_id, location, force| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Moved, + force: Some(force), + location, + }), + }); + }, prevent_default, ); let runner = self.runner.clone(); - canvas.on_mouse_press(move |pointer_id, position, button, modifiers| { - // A mouse down event may come in without any prior CursorMoved events, - // therefore we should send a CursorMoved event to make sure that the - // user code has the correct cursor position. - runner.send_events( - std::iter::once(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::Focused(true), - }) - .chain(std::iter::once(Event::WindowEvent { + canvas.on_mouse_press( + move |pointer_id, position, button, modifiers| { + // A mouse down event may come in without any prior CursorMoved events, + // therefore we should send a CursorMoved event to make sure that the + // user code has the correct cursor position. + runner.send_events( + std::iter::once(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Focused(true), + }) + .chain(std::iter::once(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::CursorMoved { + device_id: RootDeviceId(DeviceId(pointer_id)), + position, + modifiers, + }, + })) + .chain(std::iter::once(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::MouseInput { + device_id: RootDeviceId(DeviceId(pointer_id)), + state: ElementState::Pressed, + button, + modifiers, + }, + })), + ); + }, + move |device_id, location, force| { + runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), - event: WindowEvent::CursorMoved { - device_id: RootDeviceId(DeviceId(pointer_id)), - position, - modifiers, - }, - })) - .chain(std::iter::once(Event::WindowEvent { + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Started, + force: Some(force), + location, + }), + }); + }, + ); + + let runner = self.runner.clone(); + canvas.on_mouse_release( + move |pointer_id, button, modifiers| { + runner.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::MouseInput { device_id: RootDeviceId(DeviceId(pointer_id)), - state: ElementState::Pressed, + state: ElementState::Released, button, modifiers, }, - })), - ); - }); - - let runner = self.runner.clone(); - canvas.on_mouse_release(move |pointer_id, button, modifiers| { - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::MouseInput { - device_id: RootDeviceId(DeviceId(pointer_id)), - state: ElementState::Released, - button, - modifiers, - }, - }); - }); + }); + }, + move |device_id, location, force| { + runner.send_event(Event::WindowEvent { + window_id: RootWindowId(id), + event: WindowEvent::Touch(Touch { + id: device_id as u64, + device_id: RootDeviceId(DeviceId(device_id)), + phase: TouchPhase::Ended, + force: Some(force), + location, + }), + }); + }, + ); let runner = self.runner.clone(); canvas.on_mouse_wheel( @@ -265,48 +305,6 @@ impl EventLoopWindowTarget { runner.request_redraw(RootWindowId(id)); }); - let runner = self.runner.clone(); - canvas.on_touch_move(move |device_id, location, force| { - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::Touch(Touch { - id: device_id as u64, - device_id: RootDeviceId(DeviceId(device_id)), - phase: TouchPhase::Moved, - force: Some(force), - location, - }), - }); - }); - - let runner = self.runner.clone(); - canvas.on_touch_down(move |device_id, location, force| { - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::Touch(Touch { - id: device_id as u64, - device_id: RootDeviceId(DeviceId(device_id)), - phase: TouchPhase::Started, - force: Some(force), - location, - }), - }); - }); - - let runner = self.runner.clone(); - canvas.on_touch_up(move |device_id, location, force| { - runner.send_event(Event::WindowEvent { - window_id: RootWindowId(id), - event: WindowEvent::Touch(Touch { - id: device_id as u64, - device_id: RootDeviceId(DeviceId(device_id)), - phase: TouchPhase::Ended, - force: Some(force), - location, - }), - }); - }); - let runner = self.runner.clone(); canvas.on_touch_cancel(move |device_id, location, force| { runner.send_event(Event::WindowEvent { diff --git a/src/platform_impl/web/web_sys/canvas.rs b/src/platform_impl/web/web_sys/canvas.rs index 30ea354e0f..0c0693c65b 100644 --- a/src/platform_impl/web/web_sys/canvas.rs +++ b/src/platform_impl/web/web_sys/canvas.rs @@ -264,62 +264,46 @@ impl Canvas { } } - pub fn on_mouse_release(&mut self, handler: F) + pub fn on_mouse_release(&mut self, mouse_handler: M, touch_handler: T) where - F: 'static + FnMut(i32, MouseButton, ModifiersState), + M: 'static + FnMut(i32, MouseButton, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_mouse_release(&self.common, handler), - MouseState::NoPointerEvent(h) => h.on_mouse_release(&self.common, handler), + MouseState::HasPointerEvent(h) => { + h.on_mouse_release(&self.common, mouse_handler, touch_handler) + } + MouseState::NoPointerEvent(h) => h.on_mouse_release(&self.common, mouse_handler), } } - pub fn on_mouse_press(&mut self, handler: F) + pub fn on_mouse_press(&mut self, mouse_handler: M, touch_handler: T) where - F: 'static + FnMut(i32, PhysicalPosition, MouseButton, ModifiersState), + M: 'static + FnMut(i32, PhysicalPosition, MouseButton, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { - MouseState::HasPointerEvent(h) => h.on_mouse_press(&self.common, handler), - MouseState::NoPointerEvent(h) => h.on_mouse_press(&self.common, handler), + MouseState::HasPointerEvent(h) => { + h.on_mouse_press(&self.common, mouse_handler, touch_handler) + } + MouseState::NoPointerEvent(h) => h.on_mouse_press(&self.common, mouse_handler), } } - pub fn on_cursor_move(&mut self, handler: F, prevent_default: bool) - where - F: 'static + FnMut(i32, PhysicalPosition, PhysicalPosition, ModifiersState), + pub fn on_cursor_move( + &mut self, + mouse_handler: M, + touch_handler: T, + prevent_default: bool, + ) where + M: 'static + FnMut(i32, PhysicalPosition, PhysicalPosition, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { match &mut self.mouse_state { MouseState::HasPointerEvent(h) => { - h.on_cursor_move(&self.common, handler, prevent_default) + h.on_cursor_move(&self.common, mouse_handler, touch_handler, prevent_default) } - MouseState::NoPointerEvent(h) => h.on_cursor_move(&self.common, handler), - } - } - - pub fn on_touch_move(&mut self, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { - h.on_touch_move(&self.common, handler) - } - } - - pub fn on_touch_down(&mut self, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { - h.on_touch_down(&self.common, handler) - } - } - - pub fn on_touch_up(&mut self, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - if let MouseState::HasPointerEvent(h) = &mut self.mouse_state { - h.on_touch_up(&self.common, handler) + MouseState::NoPointerEvent(h) => h.on_cursor_move(&self.common, mouse_handler), } } @@ -489,6 +473,7 @@ impl Common { } } +/// Pointer events are supported or not. enum MouseState { HasPointerEvent(pointer_handler::PointerHandler), NoPointerEvent(mouse_handler::MouseHandler), diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index c0790a984b..b2bacd2c38 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -13,9 +13,6 @@ pub(super) struct PointerHandler { on_cursor_move: Option>, on_pointer_press: Option>, on_pointer_release: Option>, - on_touch_move: Option>, - on_touch_down: Option>, - on_touch_up: Option>, on_touch_cancel: Option>, } @@ -27,9 +24,6 @@ impl PointerHandler { on_cursor_move: None, on_pointer_press: None, on_pointer_release: None, - on_touch_move: None, - on_touch_down: None, - on_touch_up: None, on_touch_cancel: None, } } @@ -72,32 +66,45 @@ impl PointerHandler { )); } - pub fn on_mouse_release(&mut self, canvas_common: &super::Common, mut handler: F) - where - F: 'static + FnMut(i32, MouseButton, ModifiersState), + pub fn on_mouse_release( + &mut self, + canvas_common: &super::Common, + mut mouse_handler: M, + mut touch_handler: T, + ) where + M: 'static + FnMut(i32, MouseButton, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { + let canvas = canvas_common.raw.clone(); self.on_pointer_release = Some(canvas_common.add_user_event( "pointerup", move |event: PointerEvent| { - // touch events are handled separately - // handling them here would produce duplicate mouse events, inconsistent with - // other platforms. if event.pointer_type() == "touch" { - return; + touch_handler( + event.pointer_id(), + event::touch_position(&event, &canvas) + .to_physical(super::super::scale_factor()), + Force::Normalized(event.pressure() as f64), + ); + } else { + mouse_handler( + event.pointer_id(), + event::mouse_button(&event), + event::mouse_modifiers(&event), + ); } - - handler( - event.pointer_id(), - event::mouse_button(&event), - event::mouse_modifiers(&event), - ); }, )); } - pub fn on_mouse_press(&mut self, canvas_common: &super::Common, mut handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, MouseButton, ModifiersState), + pub fn on_mouse_press( + &mut self, + canvas_common: &super::Common, + mut mouse_handler: M, + mut touch_handler: T, + ) where + M: 'static + FnMut(i32, PhysicalPosition, MouseButton, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { let canvas = canvas_common.raw.clone(); self.on_pointer_press = Some(canvas_common.add_user_event( @@ -107,85 +114,84 @@ impl PointerHandler { // handling them here would produce duplicate mouse events, inconsistent with // other platforms. if event.pointer_type() == "touch" { - return; + touch_handler( + event.pointer_id(), + event::touch_position(&event, &canvas) + .to_physical(super::super::scale_factor()), + Force::Normalized(event.pressure() as f64), + ); + } else { + mouse_handler( + event.pointer_id(), + event::mouse_position(&event).to_physical(super::super::scale_factor()), + event::mouse_button(&event), + event::mouse_modifiers(&event), + ); + + // 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()); } - - handler( - event.pointer_id(), - event::mouse_position(&event).to_physical(super::super::scale_factor()), - event::mouse_button(&event), - event::mouse_modifiers(&event), - ); - - // 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()); }, )); } - pub fn on_cursor_move( + pub fn on_cursor_move( &mut self, canvas_common: &super::Common, - mut handler: F, + mut mouse_handler: M, + mut touch_handler: T, prevent_default: bool, ) where - F: 'static + FnMut(i32, PhysicalPosition, PhysicalPosition, ModifiersState), + M: 'static + FnMut(i32, PhysicalPosition, PhysicalPosition, ModifiersState), + T: 'static + FnMut(i32, PhysicalPosition, Force), { + let canvas = canvas_common.raw.clone(); self.on_cursor_move = Some(canvas_common.add_event( "pointermove", move |event: PointerEvent| { - // touch events are handled separately - // handling them here would produce duplicate mouse events, inconsistent with - // other platforms. if event.pointer_type() == "touch" { - return; + if prevent_default { + // prevent scroll on mobile web + event.prevent_default(); + } + touch_handler( + event.pointer_id(), + event::touch_position(&event, &canvas) + .to_physical(super::super::scale_factor()), + Force::Normalized(event.pressure() as f64), + ); + } else { + mouse_handler( + event.pointer_id(), + event::mouse_position(&event).to_physical(super::super::scale_factor()), + event::mouse_delta(&event).to_physical(super::super::scale_factor()), + event::mouse_modifiers(&event), + ); } - - if prevent_default { - event.prevent_default(); - } - handler( - event.pointer_id(), - event::mouse_position(&event).to_physical(super::super::scale_factor()), - event::mouse_delta(&event).to_physical(super::super::scale_factor()), - event::mouse_modifiers(&event), - ); }, )); } - pub fn on_touch_move(&mut self, canvas_common: &super::Common, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - self.on_touch_move = - Some(canvas_common.add_event("pointermove", touch_handler(handler, canvas_common))); - } - - pub fn on_touch_down(&mut self, canvas_common: &super::Common, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - self.on_touch_down = - Some(canvas_common.add_event("pointerdown", touch_handler(handler, canvas_common))); - } - - pub fn on_touch_up(&mut self, canvas_common: &super::Common, handler: F) - where - F: 'static + FnMut(i32, PhysicalPosition, Force), - { - self.on_touch_up = - Some(canvas_common.add_event("pointerup", touch_handler(handler, canvas_common))); - } - pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { - self.on_touch_cancel = - Some(canvas_common.add_event("pointercancel", touch_handler(handler, canvas_common))); + let canvas = canvas_common.raw.clone(); + self.on_touch_cancel = Some(canvas_common.add_event( + "pointercancel", + move |event: PointerEvent| { + if event.pointer_type() == "touch" { + handler( + event.pointer_id(), + event::touch_position(&event, &canvas) + .to_physical(super::super::scale_factor()), + Force::Normalized(event.pressure() as f64), + ); + } + }, + )); } pub fn remove_listeners(&mut self) { @@ -194,27 +200,6 @@ impl PointerHandler { self.on_cursor_move = None; self.on_pointer_press = None; self.on_pointer_release = None; - self.on_touch_move = None; - self.on_touch_down = None; - self.on_touch_up = None; self.on_touch_cancel = None; } } - -fn touch_handler(mut handler: F, canvas_common: &super::Common) -> impl FnMut(PointerEvent) -where - F: 'static + FnMut(i32, PhysicalPosition, Force), -{ - let canvas = canvas_common.raw.clone(); - move |event: PointerEvent| { - if event.pointer_type() != "touch" { - return; - } - - handler( - event.pointer_id(), - event::touch_position(&event, &canvas).to_physical(super::super::scale_factor()), - Force::Normalized(event.pressure() as f64), - ); - } -} From b980d878319b5c60165b7fe19b873a85de0acdf1 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Nov 2022 23:25:54 +0900 Subject: [PATCH 26/31] Remove a comment --- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index b2bacd2c38..5a621a9379 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -110,9 +110,6 @@ impl PointerHandler { self.on_pointer_press = Some(canvas_common.add_user_event( "pointerdown", move |event: PointerEvent| { - // touch events are handled separately - // handling them here would produce duplicate mouse events, inconsistent with - // other platforms. if event.pointer_type() == "touch" { touch_handler( event.pointer_id(), From ee312a89bc0704de30e246a707e5a277dd575b20 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Mon, 7 Nov 2022 23:54:29 +0900 Subject: [PATCH 27/31] Fix --- src/platform_impl/web/event_loop/window_target.rs | 9 ++++++--- src/platform_impl/web/web_sys/canvas/pointer_handler.rs | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/platform_impl/web/event_loop/window_target.rs b/src/platform_impl/web/event_loop/window_target.rs index f6e60dd5ec..522156b0ac 100644 --- a/src/platform_impl/web/event_loop/window_target.rs +++ b/src/platform_impl/web/event_loop/window_target.rs @@ -156,6 +156,7 @@ impl EventLoopWindowTarget { }); let runner = self.runner.clone(); + let runner_touch = self.runner.clone(); canvas.on_cursor_move( move |pointer_id, position, delta, modifiers| { runner.send_event(Event::WindowEvent { @@ -174,7 +175,7 @@ impl EventLoopWindowTarget { }); }, move |device_id, location, force| { - runner.send_event(Event::WindowEvent { + runner_touch.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, @@ -189,6 +190,7 @@ impl EventLoopWindowTarget { ); let runner = self.runner.clone(); + let runner_touch = self.runner.clone(); canvas.on_mouse_press( move |pointer_id, position, button, modifiers| { // A mouse down event may come in without any prior CursorMoved events, @@ -219,7 +221,7 @@ impl EventLoopWindowTarget { ); }, move |device_id, location, force| { - runner.send_event(Event::WindowEvent { + runner_touch.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, @@ -233,6 +235,7 @@ impl EventLoopWindowTarget { ); let runner = self.runner.clone(); + let runner_touch = self.runner.clone(); canvas.on_mouse_release( move |pointer_id, button, modifiers| { runner.send_event(Event::WindowEvent { @@ -246,7 +249,7 @@ impl EventLoopWindowTarget { }); }, move |device_id, location, force| { - runner.send_event(Event::WindowEvent { + runner_touch.send_event(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Touch(Touch { id: device_id as u64, diff --git a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs index 5a621a9379..43412c3b8b 100644 --- a/src/platform_impl/web/web_sys/canvas/pointer_handler.rs +++ b/src/platform_impl/web/web_sys/canvas/pointer_handler.rs @@ -171,7 +171,7 @@ impl PointerHandler { )); } - pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, handler: F) + pub fn on_touch_cancel(&mut self, canvas_common: &super::Common, mut handler: F) where F: 'static + FnMut(i32, PhysicalPosition, Force), { From 79209f90dc0cb382ae2649caddb325731e90b71b Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Sat, 26 Nov 2022 16:56:48 +0900 Subject: [PATCH 28/31] Remove y-axis flip --- src/platform_impl/web/web_sys/event.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index 86a1f6ca71..83fc1cff3a 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -250,7 +250,6 @@ pub fn codepoint(event: &KeyboardEvent) -> char { pub fn touch_position(event: &PointerEvent, canvas: &HtmlCanvasElement) -> LogicalPosition { LogicalPosition { x: event.client_x() as f64, - // Flip the Y axis because canvas's origin is top-left. - y: canvas.client_height() as f64 - event.client_y() as f64, + y: event.client_y() as f64, } } From 8db6ac495f10b3e5ec79977347a993b7db26f207 Mon Sep 17 00:00:00 2001 From: Ryo Hirayama Date: Fri, 23 Dec 2022 12:43:23 +0900 Subject: [PATCH 29/31] Update src/event.rs Co-authored-by: Mads Marquart --- src/event.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/event.rs b/src/event.rs index 5b040101ee..8134142b6a 100644 --- a/src/event.rs +++ b/src/event.rs @@ -478,7 +478,9 @@ pub enum WindowEvent<'a> { /// Touch event has been received /// - /// At the moment, not supported on MacOS. + /// ## Platform-specific + /// + /// - **macOS:** Unsupported. Touch(Touch), /// The window's scale factor has changed. From 49890f1309c46a760de5a177f62075c5c3b74cd5 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 23 Dec 2022 06:39:54 +0100 Subject: [PATCH 30/31] Fix platform specific comment --- src/event.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/event.rs b/src/event.rs index 8134142b6a..7e169c4b43 100644 --- a/src/event.rs +++ b/src/event.rs @@ -914,8 +914,6 @@ pub enum TouchPhase { /// Represents a touch event /// -/// At the moment, not supported on MacOS. -/// /// Every time the user touches the screen, a new [`TouchPhase::Started`] event with an unique /// identifier for the finger is generated. When the finger is lifted, an [`TouchPhase::Ended`] /// event is generated with the same finger id. @@ -930,6 +928,10 @@ pub enum TouchPhase { /// A [`TouchPhase::Cancelled`] event is emitted when the system has canceled tracking this /// touch, such as when the window loses focus, or on iOS if the user moves the /// device against their face. +/// +/// ## Platform-specific +/// +/// - **macOS:** Unsupported. #[derive(Debug, Clone, Copy, PartialEq)] pub struct Touch { pub device_id: DeviceId, From 1e9dca12c0ee5c4f312c29b743a1fa8bd6323651 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 23 Dec 2022 06:45:30 +0100 Subject: [PATCH 31/31] Fix extra argument to `touch_position` function --- src/platform_impl/web/web_sys/event.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform_impl/web/web_sys/event.rs b/src/platform_impl/web/web_sys/event.rs index 83fc1cff3a..a75c0e1b82 100644 --- a/src/platform_impl/web/web_sys/event.rs +++ b/src/platform_impl/web/web_sys/event.rs @@ -247,7 +247,8 @@ pub fn codepoint(event: &KeyboardEvent) -> char { event.key().chars().next().unwrap() } -pub fn touch_position(event: &PointerEvent, canvas: &HtmlCanvasElement) -> LogicalPosition { +pub fn touch_position(event: &PointerEvent, _canvas: &HtmlCanvasElement) -> LogicalPosition { + // TODO: Should this handle more, like `mouse_position_by_client` does? LogicalPosition { x: event.client_x() as f64, y: event.client_y() as f64,