diff --git a/CHANGELOG.md b/CHANGELOG.md index 49502a63..8320f308 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ And please only add new entries to the top of this list, right below the `# Unre - On Web, fix touch input not gaining or loosing focus. - **Breaking:** On Web, dropped support for Safari versions below 13. - On Web, prevent clicks on the canvas to select text. +- On Web, use high-frequency pointer input events when supported by the browser. # 0.28.6 diff --git a/src/platform_impl/web/web_sys/pointer.rs b/src/platform_impl/web/web_sys/pointer.rs index c24355b6..aab89d29 100644 --- a/src/platform_impl/web/web_sys/pointer.rs +++ b/src/platform_impl/web/web_sys/pointer.rs @@ -6,9 +6,10 @@ use crate::event::{Force, MouseButton}; use crate::keyboard::ModifiersState; use event::ButtonsState; +use once_cell::unsync::OnceCell; use wasm_bindgen::prelude::wasm_bindgen; use wasm_bindgen::{JsCast, JsValue}; -use web_sys::PointerEvent; +use web_sys::{HtmlCanvasElement, PointerEvent}; #[allow(dead_code)] pub(super) struct PointerHandler { @@ -186,7 +187,11 @@ impl PointerHandler { { let canvas = canvas_common.raw.clone(); self.on_cursor_move = Some(canvas_common.add_event( - "pointermove", + if has_pointer_raw_support(&canvas) { + "pointerrawupdate" + } else { + "pointermove" + }, move |event: PointerEvent| { // coalesced events are not available on Safari #[wasm_bindgen] @@ -300,3 +305,24 @@ impl PointerHandler { self.on_touch_cancel = None; } } + +fn has_pointer_raw_support(canvas: &HtmlCanvasElement) -> bool { + thread_local! { + static POINTER_RAW_SUPPORT: OnceCell = OnceCell::new(); + } + + POINTER_RAW_SUPPORT.with(|support| { + *support.get_or_init(|| { + #[wasm_bindgen] + extern "C" { + type HtmlCanvasElementExt; + + #[wasm_bindgen(method, getter, js_name = onpointerrawupdate)] + fn has_on_pointerrawupdate(this: &HtmlCanvasElementExt) -> JsValue; + } + + let canvas: &HtmlCanvasElementExt = canvas.unchecked_ref(); + !canvas.has_on_pointerrawupdate().is_undefined() + }) + }) +}