Skip to content

Commit 858cbea

Browse files
committed
添加文本复制功能
1 parent 88280d1 commit 858cbea

File tree

5 files changed

+147
-7
lines changed

5 files changed

+147
-7
lines changed

Cargo.lock

Lines changed: 62 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dsweb-core/Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ dscom = {path = "../dscom"}
1010
websocket = "0.26.5"
1111
scrap = "0.5"
1212
enigo = "0.1.2"
13-
flate2 = "1.0"
13+
flate2 = "1.0"
14+
clipboard = "0.5"

dsweb-core/src/server.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
use crate::config;
22
use crate::key_mouse;
33
use crate::screen::Cap;
4+
use clipboard::ClipboardContext;
5+
use clipboard::ClipboardProvider;
46
use enigo::Enigo;
57
use enigo::KeyboardControllable;
68
use enigo::MouseControllable;
79
use flate2::write::DeflateEncoder;
810
use flate2::Compression;
11+
use websocket::sync::Client;
912
use std::io::Write;
1013
use std::net::Ipv4Addr;
1114
use std::net::SocketAddrV4;
@@ -49,8 +52,12 @@ pub fn run(port: u16) {
4952
println!("Break !");
5053
});
5154
}
52-
"paste" => {
53-
// 处理粘贴
55+
"diffscreen-transfer" => {
56+
// 处理复制粘贴、文件
57+
let client = request.use_protocol("diffscreen-transfer").accept().unwrap();
58+
std::thread::spawn(move ||{
59+
handle_transfer(client);
60+
});
5461
}
5562
_ => {
5663
request.reject().unwrap();
@@ -137,7 +144,7 @@ fn get_rgb_block(
137144
let srw = (w / sw) + if w % sw == 0 { 0usize } else { 1usize };
138145
let srh = (h / sh) + if h % sh == 0 { 0usize } else { 1usize };
139146
let num = srw * srh;
140-
let mut buf = vec![vec![0u8; offset + sw * sh * 3]; num];
147+
let mut buf = vec![vec![255u8; offset + sw * sh * 3]; num];
141148
for i in 0..(srw * srh) {
142149
buf[i][offset - 2] = (i >> 8) as u8;
143150
buf[i][offset - 1] = i as u8;
@@ -190,3 +197,40 @@ fn screen_stream(mut stream: Writer<TcpStream>, running: Arc<AtomicBool>) {
190197
(a, b) = (b, a);
191198
}
192199
}
200+
201+
202+
fn handle_transfer(client: Client<TcpStream>) {
203+
let (mut receiver, mut sender) = client.split().unwrap();
204+
let mut cbctx: ClipboardContext = ClipboardProvider::new().unwrap();
205+
for message in receiver.incoming_messages() {
206+
let message = match message {
207+
Ok(message) => message,
208+
Err(e) => {
209+
eprintln!("Msg err {}", e);
210+
return;
211+
}
212+
};
213+
match message {
214+
OwnedMessage::Text(ctx) => {
215+
if ctx.starts_with("paste-text") {
216+
let ctx = ctx.replacen("paste-text ", "", 1);
217+
cbctx.set_contents(ctx).unwrap();
218+
} else if ctx.starts_with("copy-text") {
219+
if let Ok(mut txt) = cbctx.get_contents() {
220+
txt.insert_str(0, "copy-text ");
221+
sender.send_message(&OwnedMessage::Text(txt)).unwrap();
222+
}
223+
}
224+
}
225+
OwnedMessage::Ping(ping) => {
226+
let message = OwnedMessage::Pong(ping);
227+
sender.send_message(&message).unwrap();
228+
}
229+
OwnedMessage::Close(_) => {
230+
println!("Front transfer close !");
231+
return;
232+
}
233+
_ => {}
234+
}
235+
}
236+
}

dsweb-front/index.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,19 @@
1616
<button onclick="add()">+</button>
1717
<button onclick="sub()">-</button>
1818
</div>
19+
<div style="margin-top: 10px;margin-left: 30%;">
20+
<div>
21+
<textarea id="transfer" style="height: 100px;width: 50%;"></textarea>
22+
</div>
23+
<button onclick="dsweb.copy_text()">复制出来(文本)</button>
24+
<button onclick="dsweb.paste_text()">复制进去(文本)</button>
25+
</div>
1926
</body>
2027
<script>
2128
var scale_rate = 0.05;
2229
var hostdom = document.getElementById("host");
2330
function start() {
24-
dsweb.start("canvas", hostdom.value);
31+
dsweb.start("canvas", "transfer", hostdom.value);
2532
}
2633
function stop() {
2734
dsweb.stop();

dsweb-front/src/main.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,44 @@
11
import init, { start_websocket } from "../pkg/dsweb_front"
22

33
var ws = null;
4+
var transfer_ws = null;
5+
var transferdom = null;
46

5-
const start = (canvasid, url) => {
7+
const start = (canvasid, transferid, url) => {
68
init().then(()=>{
79
ws = start_websocket(canvasid, url);
10+
transferdom = document.getElementById(transferid);
11+
transfer_ws = new WebSocket(url, "diffscreen-transfer");
12+
transfer_ws.onopen = function(event) {
13+
console.log('Transfer Websocket 已经连接');
14+
};
15+
transfer_ws.onmessage = function(event) {
16+
var d = event.data;
17+
if(d.startsWith("copy-text")) {
18+
d = d.replace("copy-text ", "");
19+
transferdom.value = d;
20+
}
21+
};
822
});
923
}
1024

1125
const stop = () => {
1226
ws.close();
27+
transfer_ws.close();
28+
}
29+
30+
const paste_text = () => {
31+
var msg = transferdom.value;
32+
transfer_ws.send(`paste-text ${msg}`);
33+
};
34+
35+
const copy_text = () => {
36+
transfer_ws.send("copy-text");
1337
}
1438

1539
export {
1640
start,
17-
stop
41+
stop,
42+
paste_text,
43+
copy_text,
1844
};

0 commit comments

Comments
 (0)