Rewild Your Web
web
browser
dweb
1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5//! Simulates touch events from mouse input for mobile development.
6//! Copied from servoshell/desktop/headed_window.rs
7
8use std::cell::Cell;
9
10use euclid::Point2D;
11use servo::{DevicePixel, InputEvent, TouchEvent, TouchEventType, TouchId, WebView};
12use winit::event::{ElementState, MouseButton};
13
14/// Simulates touch events from mouse input when mobile simulation is enabled.
15#[derive(Default)]
16pub struct TouchEventSimulator {
17 left_mouse_button_down: Cell<bool>,
18}
19
20impl TouchEventSimulator {
21 /// Convert mouse button event to touch. Returns true if consumed.
22 pub fn maybe_consume_mouse_button_event(
23 &self,
24 webview: &WebView,
25 button: MouseButton,
26 action: ElementState,
27 point: Point2D<f32, DevicePixel>,
28 ) -> bool {
29 if button != MouseButton::Left {
30 return false;
31 }
32
33 if action == ElementState::Pressed && !self.left_mouse_button_down.get() {
34 webview.notify_input_event(InputEvent::Touch(TouchEvent::new(
35 TouchEventType::Down,
36 TouchId(0),
37 point.into(),
38 )));
39 self.left_mouse_button_down.set(true);
40 } else if action == ElementState::Released {
41 webview.notify_input_event(InputEvent::Touch(TouchEvent::new(
42 TouchEventType::Up,
43 TouchId(0),
44 point.into(),
45 )));
46 self.left_mouse_button_down.set(false);
47 }
48 true
49 }
50
51 /// Convert mouse move to touch move. Returns true if consumed.
52 pub fn maybe_consume_mouse_move_event(
53 &self,
54 webview: &WebView,
55 point: Point2D<f32, DevicePixel>,
56 ) -> bool {
57 if !self.left_mouse_button_down.get() {
58 return false;
59 }
60 webview.notify_input_event(InputEvent::Touch(TouchEvent::new(
61 TouchEventType::Move,
62 TouchId(0),
63 point.into(),
64 )));
65 true
66 }
67}