diff --git a/webrdp/Cargo.toml b/webrdp/Cargo.toml index 765636d..efd7fab 100644 --- a/webrdp/Cargo.toml +++ b/webrdp/Cargo.toml @@ -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", diff --git a/webrdp/rdp-rs b/webrdp/rdp-rs index f2abb96..3fca98e 160000 --- a/webrdp/rdp-rs +++ b/webrdp/rdp-rs @@ -1 +1 @@ -Subproject commit f2abb9628201085036a004904259917dee00bb21 +Subproject commit 3fca98ebb561826427ef2eb37fe26c36be5a5713 diff --git a/webrdp/src/canvas.rs b/webrdp/src/canvas.rs index b52fe32..0c3dfb3 100644 --- a/webrdp/src/canvas.rs +++ b/webrdp/src/canvas.rs @@ -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; + + 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()); } diff --git a/webrdp/src/input.rs b/webrdp/src/input.rs index b76d8e5..aa45eab 100644 --- a/webrdp/src/input.rs +++ b/webrdp/src/input.rs @@ -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 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 {