From d7d503e49cfd18154d22ea1a8440ee2daf2b459d Mon Sep 17 00:00:00 2001 From: Jovi Hsu Date: Fri, 19 Nov 2021 16:55:34 +0800 Subject: [PATCH] re-folder --- frontend/src/pages/page_remote.rs | 38 ++++++++++++++++++++++++-- frontend/src/protocal/common.rs | 6 ++-- frontend/src/protocal/mod.rs | 1 - frontend/src/protocal/{ => vnc}/des.rs | 0 frontend/src/protocal/vnc/mod.rs | 2 ++ frontend/src/protocal/{ => vnc}/vnc.rs | 8 +++--- 6 files changed, 44 insertions(+), 11 deletions(-) rename frontend/src/protocal/{ => vnc}/des.rs (100%) create mode 100644 frontend/src/protocal/vnc/mod.rs rename frontend/src/protocal/{ => vnc}/vnc.rs (99%) diff --git a/frontend/src/pages/page_remote.rs b/frontend/src/pages/page_remote.rs index eeded09..04c6131 100644 --- a/frontend/src/pages/page_remote.rs +++ b/frontend/src/pages/page_remote.rs @@ -15,7 +15,7 @@ use gloo::timers::callback::Interval; use crate::{ components::{self, input::Input, ws::WebsocketMsg}, - protocal::{common::*, vnc::VncHandler}, + protocal::{common::*, vnc::vnc::VncHandler}, utils::WeakComponentLink, }; @@ -327,17 +327,49 @@ impl PageRemote { } fn bind_mouse_and_key(&mut self, canvas: &HtmlCanvasElement) { + let window = web_sys::window().unwrap(); + let handler = self.handler.clone(); + let key_down = move |e: KeyboardEvent| { + e.stop_propagation(); + ConsoleService::log(&format!("key down {}", e.key_code())); + handler.key_press(e.key_code(), true); + }; + + let handler = Box::new(key_down) as Box; + + let cb = Closure::wrap(handler); + + window + .add_event_listener_with_callback("keydown", cb.as_ref().unchecked_ref()) + .unwrap(); + cb.forget(); + + let handler = self.handler.clone(); + let key_up = move |e: KeyboardEvent| { + e.stop_propagation(); + handler.key_press(e.key_code(), false); + }; + + let handler = Box::new(key_up) as Box; + + let cb = Closure::wrap(handler); + + window + .add_event_listener_with_callback("keyup", cb.as_ref().unchecked_ref()) + .unwrap(); + cb.forget(); + let handler = self.handler.clone(); let key_press = move |e: KeyboardEvent| { e.stop_propagation(); - handler.key_press(e.key_code()); + ConsoleService::log(&format!("key press {}", e.key_code())); }; let handler = Box::new(key_press) as Box; let cb = Closure::wrap(handler); - canvas + window .add_event_listener_with_callback("keypress", cb.as_ref().unchecked_ref()) .unwrap(); cb.forget(); diff --git a/frontend/src/protocal/common.rs b/frontend/src/protocal/common.rs index 1e84bcb..5f7a086 100644 --- a/frontend/src/protocal/common.rs +++ b/frontend/src/protocal/common.rs @@ -78,8 +78,8 @@ where .require_frame(incremental); } - pub fn key_press(&self, key: u32) { - self.inner.as_ref().lock().unwrap().key_press(key); + pub fn key_press(&self, key: u32, down: bool) { + self.inner.as_ref().lock().unwrap().key_press(key, down); } pub fn mouse_event(&self, x: u16, y: u16, button: u8) { @@ -97,7 +97,7 @@ pub trait ProtocalImpl { fn get_output(&mut self) -> Vec; fn set_credential(&mut self, username: &str, password: &str); fn set_resolution(&mut self, width: u16, height: u16); - fn key_press(&mut self, key: u32); + fn key_press(&mut self, key: u32, down: bool); fn mouse_event(&mut self, x: u16, y: u16, button: u8); fn require_frame(&mut self, incremental: u8); } diff --git a/frontend/src/protocal/mod.rs b/frontend/src/protocal/mod.rs index 6b1fa10..227f6f1 100644 --- a/frontend/src/protocal/mod.rs +++ b/frontend/src/protocal/mod.rs @@ -1,3 +1,2 @@ pub mod common; -mod des; pub mod vnc; diff --git a/frontend/src/protocal/des.rs b/frontend/src/protocal/vnc/des.rs similarity index 100% rename from frontend/src/protocal/des.rs rename to frontend/src/protocal/vnc/des.rs diff --git a/frontend/src/protocal/vnc/mod.rs b/frontend/src/protocal/vnc/mod.rs new file mode 100644 index 0000000..13d3f87 --- /dev/null +++ b/frontend/src/protocal/vnc/mod.rs @@ -0,0 +1,2 @@ +mod des; +pub mod vnc; diff --git a/frontend/src/protocal/vnc.rs b/frontend/src/protocal/vnc/vnc.rs similarity index 99% rename from frontend/src/protocal/vnc.rs rename to frontend/src/protocal/vnc/vnc.rs index ccafd23..3efd7aa 100644 --- a/frontend/src/protocal/vnc.rs +++ b/frontend/src/protocal/vnc/vnc.rs @@ -1,4 +1,4 @@ -use super::common::*; +use super::super::common::*; use super::des; use yew::services::ConsoleService; @@ -167,13 +167,13 @@ impl ProtocalImpl for VncHandler { // VNC client doen't support resolution change } - fn key_press(&mut self, key: u32) { + fn key_press(&mut self, key: u32, down: bool) { if self.state != VncState::Connected { return; } if let ServerMessage::None = self.msg_handling { let key = jskey_to_x11(key); - self.send_key_event(key, true); + self.send_key_event(key, down); } } @@ -303,7 +303,7 @@ impl VncHandler { sw.write_u8(if down { 1 } else { 0 }); // down sw.write_u16(0); // padding sw.write_u32(key); // key - // ConsoleService::log(&format!("send key event {:x?} {:?}", key, down)); + ConsoleService::log(&format!("send key event {:x?} {:?}", key, down)); self.outbuf.extend_from_slice(&out); }