feat: add pointer wheel support

This commit is contained in:
qwqVictor 2024-04-22 12:39:34 +08:00
parent 22043ef403
commit d57232a1d6
4 changed files with 76 additions and 6 deletions

View File

@ -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

View File

@ -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());
}

View File

@ -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 {