feat: unicode clip text send

This commit is contained in:
qwqVictor 2024-04-26 00:53:23 +08:00
parent 9827b00c3c
commit 9d3a75593b
4 changed files with 104 additions and 61 deletions

View File

@ -53,6 +53,7 @@ features = [
"FileReader",
"HtmlButtonElement",
"HtmlCanvasElement",
"HtmlTextAreaElement",
"ImageData",
"Location",
"KeyboardEvent",

View File

@ -88,8 +88,8 @@
<button id="clipboardbtn">«</button>
<div id="clipboardbox" class="horizontal-centre vertical-centre">
<div style="position: relative; top: 50%; transform: translateY(-50%);">
<div><textarea id="clipboardtxt" placeholder="页面剪贴板内容" rows="15"></textarea></div>
<div><button id="clipboardsend">发送页面剪贴板内容</button></div>
<div><textarea id="clipboardtxt" placeholder="发送文本内容" rows="12"></textarea></div>
<div><button id="clipboardsend">发送文本内容</button></div>
<div><button type="button" id="ctrlaltdel">发送 Ctrl+Alt+Del</button></div>
</div>
</div>

View File

@ -102,64 +102,6 @@ impl Canvas {
.unwrap();
cb.forget();
let sender = self.output.clone();
let ctrl_alt_del_btn = web_sys::window()
.unwrap()
.document()
.unwrap()
.get_element_by_id("ctrlaltdel")
.unwrap()
.dyn_into::<HtmlButtonElement>()
.map_err(|_| ())
.unwrap();
let ctrl_alt_del = move || {
let sender = sender.clone();
futures::executor::block_on(async move {
let _ = sender
.send(InputEvent::KeyCode(
0x001D, /* Control Left */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x0038, /* Alt Left */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0xE053, /* Delete */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0xE053, /* Delete */
KeyEventType::Up,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x0038, /* Alt Left */
KeyEventType::Up,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x001D, /* Control Left */
KeyEventType::Up,
))
.await;
});
};
let handler = Box::new(ctrl_alt_del) as Box<dyn FnMut()>;
let cb = Closure::wrap(handler);
ctrl_alt_del_btn.set_onclick(Some(cb.as_ref().unchecked_ref()));
cb.forget();
// On a conventional mouse, buttons 1, 2, and 3 correspond to the left,
// middle, and right buttons on the mouse. On a wheel mouse, each step
// of the wheel upwards is represented by a press and release of button
@ -271,6 +213,101 @@ impl Canvas {
.unwrap();
cb.forget();
// page components
// ctrl+alt+del
let sender = self.output.clone();
let ctrl_alt_del_btn = web_sys::window()
.unwrap()
.document()
.unwrap()
.get_element_by_id("ctrlaltdel")
.unwrap()
.dyn_into::<HtmlButtonElement>()
.map_err(|_| ())
.unwrap();
let ctrl_alt_del = move || {
let sender = sender.clone();
futures::executor::block_on(async move {
let _ = sender
.send(InputEvent::KeyCode(
0x001D, /* Control Left */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x0038, /* Alt Left */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0xE053, /* Delete */
KeyEventType::Down,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0xE053, /* Delete */
KeyEventType::Up,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x0038, /* Alt Left */
KeyEventType::Up,
))
.await;
let _ = sender
.send(InputEvent::KeyCode(
0x001D, /* Control Left */
KeyEventType::Up,
))
.await;
});
};
let handler = Box::new(ctrl_alt_del) as Box<dyn FnMut()>;
let cb = Closure::wrap(handler);
ctrl_alt_del_btn.set_onclick(Some(cb.as_ref().unchecked_ref()));
cb.forget();
// send text
let sender = self.output.clone();
let send_text_btn = web_sys::window()
.unwrap()
.document()
.unwrap()
.get_element_by_id("clipboardsend")
.unwrap()
.dyn_into::<HtmlButtonElement>()
.map_err(|_| ())
.unwrap();
let send_text = move || {
let sender = sender.clone();
let text = web_sys::window()
.unwrap()
.document()
.unwrap()
.get_element_by_id("clipboardtxt")
.unwrap()
.dyn_into::<web_sys::HtmlTextAreaElement>()
.map_err(|_| ())
.unwrap()
.value();
futures::executor::block_on(async move {
for c in text.encode_utf16() {
tracing::trace!("unicode key char: {}", c);
let _ = sender.send(InputEvent::UnicodeKey(c, KeyEventType::Down)).await;
let _ = sender.send(InputEvent::UnicodeKey(c, KeyEventType::Up)).await;
}
});
};
let handler = Box::new(send_text) as Box<dyn FnMut()>;
let cb = Closure::wrap(handler);
send_text_btn.set_onclick(Some(cb.as_ref().unchecked_ref()));
cb.forget();
// initilize the timer
self.timer.set(Instant::now());

View File

@ -1,4 +1,4 @@
use rdp::core::event::{KeyboardEvent as RdpKeyboard, PointerButton, PointerEvent, PointerWheel, RdpEvent};
use rdp::core::event::{KeyboardEvent as RdpKeyboard, PointerButton, PointerEvent, PointerWheel, RdpEvent, UnicodeKeyEvent};
use tracing::trace;
use web_sys::{KeyboardEvent, MouseEvent, WheelEvent};
@ -25,6 +25,7 @@ pub enum InputEvent {
Mouse(MouseEvent, MouseEventType),
Keyboard(KeyboardEvent, KeyEventType),
KeyCode(u16, KeyEventType),
UnicodeKey(u16, KeyEventType),
Wheel(WheelEvent, WheelEventType),
}
@ -243,6 +244,10 @@ impl From<InputEvent> for RdpEvent {
code: e,
down: matches!(t, KeyEventType::Down),
}),
InputEvent::UnicodeKey(e, t) => RdpEvent::UnicodeKey(UnicodeKeyEvent {
code: e,
down: matches!(t, KeyEventType::Down),
}),
}
}
}