feat: add pointer wheel support
This commit is contained in:
parent
22043ef403
commit
d57232a1d6
@ -13,7 +13,7 @@ default = ["console_error_panic_hook"]
|
||||
wasm-bindgen = "0.2.63"
|
||||
js-sys = "0.3"
|
||||
x509-parser = "0.14.0"
|
||||
rdp-rs = { git = "https://github.com/qwqVictor/rdp-rs", default-features = false }
|
||||
rdp-rs = { path = "./rdp-rs", default-features = false }
|
||||
wasm-timer = "0.2.5"
|
||||
|
||||
# websocket
|
||||
@ -57,6 +57,7 @@ features = [
|
||||
"Location",
|
||||
"KeyboardEvent",
|
||||
"MouseEvent",
|
||||
"WheelEvent",
|
||||
"MessageEvent",
|
||||
"ProgressEvent",
|
||||
"Window",
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit f2abb9628201085036a004904259917dee00bb21
|
||||
Subproject commit 3fca98ebb561826427ef2eb37fe26c36be5a5713
|
@ -1,4 +1,4 @@
|
||||
use crate::input::{InputEvent, KeyEventType, MouseEventType};
|
||||
use crate::input::{InputEvent, KeyEventType, MouseEventType, WheelEventType};
|
||||
use rdp::core::event::BitmapEvent;
|
||||
use std::{
|
||||
cell::{Cell, RefCell},
|
||||
@ -9,7 +9,7 @@ use wasm_bindgen::prelude::*;
|
||||
use wasm_bindgen::{Clamped, JsCast};
|
||||
use wasm_timer::Instant;
|
||||
use web_sys::{
|
||||
CanvasRenderingContext2d, HtmlButtonElement, HtmlCanvasElement, KeyboardEvent, MouseEvent,
|
||||
CanvasRenderingContext2d, HtmlButtonElement, HtmlCanvasElement, KeyboardEvent, MouseEvent, WheelEvent
|
||||
};
|
||||
|
||||
const MILLIS_IN_SEC: u32 = 1000;
|
||||
@ -243,6 +243,35 @@ impl Canvas {
|
||||
.unwrap();
|
||||
cb.forget();
|
||||
|
||||
let sender = self.output.clone();
|
||||
let mouse_wheel = move |e: WheelEvent| {
|
||||
let sender = sender.clone();
|
||||
e.prevent_default();
|
||||
e.stop_propagation();
|
||||
futures::executor::block_on(async move {
|
||||
if (e.delta_x() as i32) != 0 {
|
||||
let _ = sender
|
||||
.send(InputEvent::Wheel(e.clone(), WheelEventType::Horizontal))
|
||||
.await;
|
||||
}
|
||||
if (e.delta_y() as i32) != 0 {
|
||||
let _ = sender
|
||||
.send(InputEvent::Wheel(e.clone(), WheelEventType::Vertical))
|
||||
.await;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
let handler = Box::new(mouse_wheel) as Box<dyn FnMut(_)>;
|
||||
|
||||
let cb = Closure::wrap(handler);
|
||||
|
||||
self.canvas
|
||||
.add_event_listener_with_callback("mousewheel", cb.as_ref().unchecked_ref())
|
||||
.unwrap();
|
||||
cb.forget();
|
||||
|
||||
|
||||
// initilize the timer
|
||||
self.timer.set(Instant::now());
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
use rdp::core::event::{KeyboardEvent as RdpKeyboard, PointerButton, PointerEvent, PointerWheel, RdpEvent};
|
||||
use tracing::trace;
|
||||
use web_sys::{KeyboardEvent, MouseEvent};
|
||||
use web_sys::{KeyboardEvent, MouseEvent, WheelEvent};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum MouseEventType {
|
||||
@ -10,16 +10,22 @@ pub enum MouseEventType {
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
|
||||
pub enum KeyEventType {
|
||||
Down,
|
||||
Up,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum WheelEventType {
|
||||
Vertical,
|
||||
Horizontal,
|
||||
}
|
||||
|
||||
pub enum InputEvent {
|
||||
Mouse(MouseEvent, MouseEventType),
|
||||
Keyboard(KeyboardEvent, KeyEventType),
|
||||
KeyCode(u16, KeyEventType),
|
||||
Wheel(WheelEvent, WheelEventType),
|
||||
}
|
||||
|
||||
fn to_scancode(code: &str) -> u16 {
|
||||
@ -192,6 +198,40 @@ impl From<InputEvent> for RdpEvent {
|
||||
wheel: PointerWheel::None,
|
||||
wheel_delta: 0i16,
|
||||
}),
|
||||
InputEvent::Wheel(e, t) => {
|
||||
match t {
|
||||
WheelEventType::Vertical => {
|
||||
RdpEvent::Pointer(PointerEvent {
|
||||
x: 0,
|
||||
y: 0,
|
||||
button: PointerButton::None,
|
||||
down: false,
|
||||
wheel: if e.delta_y() as i16 != 0 {
|
||||
PointerWheel::Vertical
|
||||
}
|
||||
else {
|
||||
PointerWheel::None
|
||||
},
|
||||
wheel_delta: -e.delta_y() as i16,
|
||||
})
|
||||
}
|
||||
WheelEventType::Horizontal => {
|
||||
RdpEvent::Pointer(PointerEvent {
|
||||
x: 0,
|
||||
y: 0,
|
||||
button: PointerButton::None,
|
||||
down: false,
|
||||
wheel: if e.delta_x() as i16 != 0 {
|
||||
PointerWheel::Horizontal
|
||||
}
|
||||
else {
|
||||
PointerWheel::None
|
||||
},
|
||||
wheel_delta: e.delta_x() as i16,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
InputEvent::Keyboard(e, t) => {
|
||||
trace!("Key {}, event {:?}", e.code(), t);
|
||||
RdpEvent::Key(RdpKeyboard {
|
||||
|
Loading…
Reference in New Issue
Block a user