@@ -4,42 +4,59 @@ use crate::screen::Cap;
44use enigo:: Enigo ;
55use enigo:: KeyboardControllable ;
66use enigo:: MouseControllable ;
7- use flate2:: Compression ;
87use flate2:: write:: DeflateEncoder ;
9- use websocket:: OwnedMessage ;
10- use websocket:: sync:: Reader ;
11- use websocket:: sync:: Server ;
12- use websocket:: sync:: Writer ;
8+ use flate2:: Compression ;
139use std:: io:: Write ;
1410use std:: net:: Ipv4Addr ;
1511use std:: net:: SocketAddrV4 ;
1612use std:: net:: TcpStream ;
17- use std:: sync:: Arc ;
1813use std:: sync:: atomic:: AtomicBool ;
1914use std:: sync:: atomic:: Ordering ;
15+ use std:: sync:: Arc ;
16+ use websocket:: sync:: Reader ;
17+ use websocket:: sync:: Server ;
18+ use websocket:: sync:: Writer ;
19+ use websocket:: OwnedMessage ;
2020
2121pub fn run ( port : u16 ) {
2222 let host = SocketAddrV4 :: new ( Ipv4Addr :: new ( 0 , 0 , 0 , 0 ) , port) ;
2323 let server = Server :: bind ( host) . unwrap ( ) ;
24+ let isctrl = Arc :: new ( AtomicBool :: new ( false ) ) ;
2425 for request in server. filter_map ( Result :: ok) {
25- if ! request. protocols ( ) . contains ( & "diffscreen" . to_string ( ) ) {
26+ if request. protocols ( ) . len ( ) != 1 {
2627 request. reject ( ) . unwrap ( ) ;
2728 continue ;
2829 }
29- println ! ( "New income !" ) ;
30- let client = request. use_protocol ( "diffscreen" ) . accept ( ) . unwrap ( ) ;
31- let ( receiver, sender) = client. split ( ) . unwrap ( ) ;
32- let running = Arc :: new ( AtomicBool :: new ( true ) ) ;
33- let th1run = running. clone ( ) ;
34- let _ = std:: thread:: spawn ( move || {
35- screen_stream ( sender, th1run) ;
36- } ) ;
37- let th = std:: thread:: spawn ( move || {
38- event ( receiver) ;
39- } ) ;
40- let _ = th. join ( ) ;
41- running. store ( false , Ordering :: Relaxed ) ;
42- println ! ( "Break !" ) ;
30+ let proto = request. protocols ( ) [ 0 ] . as_str ( ) ;
31+ match proto {
32+ "diffscreen" => {
33+ if isctrl. load ( Ordering :: Relaxed ) {
34+ request. reject ( ) . unwrap ( ) ;
35+ continue ;
36+ }
37+ println ! ( "New income !" ) ;
38+ let client = request. use_protocol ( "diffscreen" ) . accept ( ) . unwrap ( ) ;
39+ let ( receiver, sender) = client. split ( ) . unwrap ( ) ;
40+ isctrl. store ( true , Ordering :: Relaxed ) ;
41+ let isctrlc = isctrl. clone ( ) ;
42+ let _ = std:: thread:: spawn ( move || {
43+ screen_stream ( sender, isctrlc) ;
44+ } ) ;
45+ let isctrlc = isctrl. clone ( ) ;
46+ let _ = std:: thread:: spawn ( move || {
47+ event ( receiver) ;
48+ isctrlc. store ( false , Ordering :: Relaxed ) ;
49+ println ! ( "Break !" ) ;
50+ } ) ;
51+ }
52+ "paste" => {
53+ // 处理粘贴
54+ }
55+ _ => {
56+ request. reject ( ) . unwrap ( ) ;
57+ continue ;
58+ }
59+ }
4360 }
4461}
4562
@@ -53,56 +70,52 @@ fn event(mut stream: Reader<TcpStream>) {
5370 Ok ( message) => message,
5471 Err ( e) => {
5572 eprintln ! ( "Msg err {}" , e) ;
56- continue ;
73+ return ;
5774 }
5875 } ;
5976 match message {
60- OwnedMessage :: Binary ( cmd) => {
61- match cmd[ 0 ] {
62- dscom:: KEY_UP => {
63- if let Some ( key) = key_mouse:: key_to_enigo ( cmd[ 1 ] ) {
64- enigo. key_up ( key) ;
65- }
66- }
67- dscom:: KEY_DOWN => {
68- if let Some ( key) = key_mouse:: key_to_enigo ( cmd[ 1 ] ) {
69- enigo. key_down ( key) ;
70- }
77+ OwnedMessage :: Binary ( cmd) => match cmd[ 0 ] {
78+ dscom:: KEY_UP => {
79+ if let Some ( key) = key_mouse:: key_to_enigo ( cmd[ 1 ] ) {
80+ enigo. key_up ( key) ;
7181 }
72- dscom:: MOUSE_KEY_UP => {
73- if let Some ( key) = key_mouse:: mouse_to_engin ( cmd[ 1 ] ) {
74- enigo. mouse_up ( key) ;
75- }
76- }
77- dscom:: MOUSE_KEY_DOWN => {
78- if let Some ( key) = key_mouse:: mouse_to_engin ( cmd[ 1 ] ) {
79- enigo. mouse_down ( key) ;
80- }
81- }
82- dscom:: MOUSE_WHEEL_UP => {
83- enigo. mouse_scroll_y ( -2 ) ;
84- }
85- dscom:: MOUSE_WHEEL_DOWN => {
86- enigo. mouse_scroll_y ( 2 ) ;
82+ }
83+ dscom:: KEY_DOWN => {
84+ if let Some ( key) = key_mouse:: key_to_enigo ( cmd[ 1 ] ) {
85+ enigo. key_down ( key) ;
8786 }
88- dscom :: MOVE => {
89- let x = ( ( cmd [ 1 ] as i32 ) << 8 ) | ( cmd [ 2 ] as i32 ) ;
90- let y = ( ( cmd [ 3 ] as i32 ) << 8 ) | ( cmd[ 4 ] as i32 ) ;
91- enigo. mouse_move_to ( x , y ) ;
87+ }
88+ dscom :: MOUSE_KEY_UP => {
89+ if let Some ( key ) = key_mouse :: mouse_to_engin ( cmd[ 1 ] ) {
90+ enigo. mouse_up ( key ) ;
9291 }
93- _ => {
94- return ;
92+ }
93+ dscom:: MOUSE_KEY_DOWN => {
94+ if let Some ( key) = key_mouse:: mouse_to_engin ( cmd[ 1 ] ) {
95+ enigo. mouse_down ( key) ;
9596 }
9697 }
97- }
98+ dscom:: MOUSE_WHEEL_UP => {
99+ enigo. mouse_scroll_y ( -2 ) ;
100+ }
101+ dscom:: MOUSE_WHEEL_DOWN => {
102+ enigo. mouse_scroll_y ( 2 ) ;
103+ }
104+ dscom:: MOVE => {
105+ let x = ( ( cmd[ 1 ] as i32 ) << 8 ) | ( cmd[ 2 ] as i32 ) ;
106+ let y = ( ( cmd[ 3 ] as i32 ) << 8 ) | ( cmd[ 4 ] as i32 ) ;
107+ enigo. mouse_move_to ( x, y) ;
108+ }
109+ _ => {
110+ return ;
111+ }
112+ } ,
98113 OwnedMessage :: Close ( _) => {
99114 println ! ( "Front close !" ) ;
100115 return ;
101116 }
102- _=> {
103- }
117+ _ => { }
104118 }
105-
106119 }
107120}
108121
@@ -114,11 +127,17 @@ fn get_data(data: OwnedMessage) -> Vec<u8> {
114127}
115128
116129/// 初始化rgb块
117- fn get_rgb_block ( w : usize , h : usize , sw : usize , sh : usize , offset : usize ) -> ( Vec < Vec < u8 > > , usize , usize ) {
118- let srw = ( w / sw) + if w % sw == 0 { 0usize } else { 1usize } ;
119- let srh = ( h / sh) + if h % sh == 0 { 0usize } else { 1usize } ;
130+ fn get_rgb_block (
131+ w : usize ,
132+ h : usize ,
133+ sw : usize ,
134+ sh : usize ,
135+ offset : usize ,
136+ ) -> ( Vec < Vec < u8 > > , usize , usize ) {
137+ let srw = ( w / sw) + if w % sw == 0 { 0usize } else { 1usize } ;
138+ let srh = ( h / sh) + if h % sh == 0 { 0usize } else { 1usize } ;
120139 let num = srw * srh;
121- let mut buf = vec ! [ vec![ 0u8 ; offset + sw* sh * 3 ] ; num] ;
140+ let mut buf = vec ! [ vec![ 0u8 ; offset + sw * sh * 3 ] ; num] ;
122141 for i in 0 ..( srw * srh) {
123142 buf[ i] [ offset - 2 ] = ( i >> 8 ) as u8 ;
124143 buf[ i] [ offset - 1 ] = i as u8 ;
@@ -129,7 +148,7 @@ fn get_rgb_block(w: usize, h: usize, sw: usize, sh: usize, offset: usize) -> (Ve
129148fn ws_send ( mut stream : Writer < TcpStream > , data : Vec < u8 > ) -> ( Writer < TcpStream > , Vec < u8 > ) {
130149 let om = OwnedMessage :: Binary ( data) ;
131150 stream. send_message ( & om) . unwrap ( ) ;
132- return ( stream, get_data ( om) )
151+ return ( stream, get_data ( om) ) ;
133152}
134153
135154fn screen_stream ( mut stream : Writer < TcpStream > , running : Arc < AtomicBool > ) {
@@ -139,7 +158,7 @@ fn screen_stream(mut stream: Writer<TcpStream>, running: Arc<AtomicBool>) {
139158 let block_len = srw * srh;
140159 let ( mut b, _, _) = get_rgb_block ( w, h, sw, sh, 2 ) ;
141160 // 发送w, h, sw, sh, mask
142- let mut meta = vec ! [ 0u8 ; 9 ] ;
161+ let mut meta = vec ! [ 0u8 ; 9 ] ;
143162 meta[ 0 ] = ( w >> 8 ) as u8 ;
144163 meta[ 1 ] = w as u8 ;
145164 meta[ 2 ] = ( h >> 8 ) as u8 ;
0 commit comments