From 9bc95289cc6a51e1c39ae2927dbdb5c94744f970 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sat, 28 Aug 2021 08:37:07 +0200 Subject: [PATCH] egui_web: Fix use of egui on devices with both touch and mouse (#654) --- egui_web/CHANGELOG.md | 3 +- egui_web/src/backend.rs | 3 -- egui_web/src/lib.rs | 106 ++++++++++++++++++---------------------- 3 files changed, 49 insertions(+), 63 deletions(-) diff --git a/egui_web/CHANGELOG.md b/egui_web/CHANGELOG.md index fcf7241f..d187ae41 100644 --- a/egui_web/CHANGELOG.md +++ b/egui_web/CHANGELOG.md @@ -6,7 +6,8 @@ All notable changes to the `egui_web` integration will be noted in this file. ## Unreleased ### Fixed 🐛 -* Fix alpha blending for WebGL2 and WebGL1 with sRGB support backends, now having identical results as egui_glium +* Fix alpha blending for WebGL2 and WebGL1 with sRGB support backends, now having identical results as egui_glium. +* Fix use of egui on devices with both touch and mouse. ## 0.14.0 - 2021-08-24 diff --git a/egui_web/src/backend.rs b/egui_web/src/backend.rs index 34fe6226..a9d30653 100644 --- a/egui_web/src/backend.rs +++ b/egui_web/src/backend.rs @@ -78,9 +78,6 @@ impl WebBackend { /// Data gathered between frames. #[derive(Default)] pub struct WebInput { - /// Is this a touch screen? If so, we ignore mouse events. - pub is_touch: bool, - /// Required because we don't get a position on touched pub latest_touch_pos: Option, diff --git a/egui_web/src/lib.rs b/egui_web/src/lib.rs index 653ee600..620dcd2c 100644 --- a/egui_web/src/lib.rs +++ b/egui_web/src/lib.rs @@ -852,26 +852,24 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let event_name = "mousedown"; let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { - let mut runner_lock = runner_ref.0.lock(); - if !runner_lock.input.is_touch { - if let Some(button) = button_from_mouse_event(&event) { - let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); - let modifiers = runner_lock.input.raw.modifiers; - runner_lock - .input - .raw - .events - .push(egui::Event::PointerButton { - pos, - button, - pressed: true, - modifiers, - }); - runner_lock.needs_repaint.set_true(); - event.stop_propagation(); - event.prevent_default(); - } + if let Some(button) = button_from_mouse_event(&event) { + let mut runner_lock = runner_ref.0.lock(); + let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); + let modifiers = runner_lock.input.raw.modifiers; + runner_lock + .input + .raw + .events + .push(egui::Event::PointerButton { + pos, + button, + pressed: true, + modifiers, + }); + runner_lock.needs_repaint.set_true(); } + event.stop_propagation(); + event.prevent_default(); }) as Box); canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; closure.forget(); @@ -882,17 +880,15 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let mut runner_lock = runner_ref.0.lock(); - if !runner_lock.input.is_touch { - let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); - runner_lock - .input - .raw - .events - .push(egui::Event::PointerMoved(pos)); - runner_lock.needs_repaint.set_true(); - event.stop_propagation(); - event.prevent_default(); - } + let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); + runner_lock + .input + .raw + .events + .push(egui::Event::PointerMoved(pos)); + runner_lock.needs_repaint.set_true(); + event.stop_propagation(); + event.prevent_default(); }) as Box); canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; closure.forget(); @@ -902,27 +898,25 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let event_name = "mouseup"; let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { - let mut runner_lock = runner_ref.0.lock(); - if !runner_lock.input.is_touch { - if let Some(button) = button_from_mouse_event(&event) { - let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); - let modifiers = runner_lock.input.raw.modifiers; - runner_lock - .input - .raw - .events - .push(egui::Event::PointerButton { - pos, - button, - pressed: false, - modifiers, - }); - runner_lock.needs_repaint.set_true(); - event.stop_propagation(); - event.prevent_default(); - } + if let Some(button) = button_from_mouse_event(&event) { + let mut runner_lock = runner_ref.0.lock(); + let pos = pos_from_mouse_event(runner_lock.canvas_id(), &event); + let modifiers = runner_lock.input.raw.modifiers; + runner_lock + .input + .raw + .events + .push(egui::Event::PointerButton { + pos, + button, + pressed: false, + modifiers, + }); + runner_lock.needs_repaint.set_true(); manipulate_agent(runner_lock.canvas_id(), runner_lock.input.latest_touch_pos); } + event.stop_propagation(); + event.prevent_default(); }) as Box); canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; closure.forget(); @@ -933,12 +927,10 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::MouseEvent| { let mut runner_lock = runner_ref.0.lock(); - if !runner_lock.input.is_touch { - runner_lock.input.raw.events.push(egui::Event::PointerGone); - runner_lock.needs_repaint.set_true(); - event.stop_propagation(); - event.prevent_default(); - } + runner_lock.input.raw.events.push(egui::Event::PointerGone); + runner_lock.needs_repaint.set_true(); + event.stop_propagation(); + event.prevent_default(); }) as Box); canvas.add_event_listener_with_callback(event_name, closure.as_ref().unchecked_ref())?; closure.forget(); @@ -954,7 +946,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id); runner_lock.input.latest_touch_pos_id = latest_touch_pos_id; runner_lock.input.latest_touch_pos = Some(pos); - runner_lock.input.is_touch = true; let modifiers = runner_lock.input.raw.modifiers; runner_lock .input @@ -986,7 +977,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { pos_from_touch_event(runner_lock.canvas_id(), &event, &mut latest_touch_pos_id); runner_lock.input.latest_touch_pos_id = latest_touch_pos_id; runner_lock.input.latest_touch_pos = Some(pos); - runner_lock.input.is_touch = true; runner_lock .input .raw @@ -1007,7 +997,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| { let mut runner_lock = runner_ref.0.lock(); - runner_lock.input.is_touch = true; if let Some(pos) = runner_lock.input.latest_touch_pos { let modifiers = runner_lock.input.raw.modifiers; // First release mouse to click: @@ -1042,7 +1031,6 @@ fn install_canvas_events(runner_ref: &AppRunnerRef) -> Result<(), JsValue> { let runner_ref = runner_ref.clone(); let closure = Closure::wrap(Box::new(move |event: web_sys::TouchEvent| { let mut runner_lock = runner_ref.0.lock(); - runner_lock.input.is_touch = true; push_touches(&mut *runner_lock, egui::TouchPhase::Cancel, &event); event.stop_propagation(); event.prevent_default();