@@ -5,13 +5,11 @@ use fltk::input::Input;
55use fltk:: input:: SecretInput ;
66use fltk:: prelude:: InputExt ;
77use fltk:: window:: Window ;
8- use std:: cell:: RefCell ;
98use std:: collections:: hash_map:: DefaultHasher ;
109use std:: hash:: Hasher ;
1110use std:: io:: Read ;
1211use std:: io:: Write ;
1312use std:: net:: TcpStream ;
14- use std:: rc:: Rc ;
1513use std:: sync:: Arc ;
1614use std:: sync:: RwLock ;
1715
@@ -55,52 +53,168 @@ pub fn app_run() {
5553}
5654
5755fn draw ( app : app:: App , host : String , pwd : String ) {
58- let mut conn = TcpStream :: connect ( host) . unwrap ( ) ;
59- // 认证
60- let mut hasher = DefaultHasher :: new ( ) ;
61- hasher. write ( pwd. as_bytes ( ) ) ;
62- let pk = hasher. finish ( ) ;
63- conn. write_all ( & [
64- ( pk >> ( 7 * 8 ) ) as u8 ,
65- ( pk >> ( 6 * 8 ) ) as u8 ,
66- ( pk >> ( 5 * 8 ) ) as u8 ,
67- ( pk >> ( 4 * 8 ) ) as u8 ,
68- ( pk >> ( 3 * 8 ) ) as u8 ,
69- ( pk >> ( 2 * 8 ) ) as u8 ,
70- ( pk >> ( 1 * 8 ) ) as u8 ,
71- pk as u8 ,
72- ] )
73- . unwrap ( ) ;
74- let mut suc = [ 0u8 ] ;
75- conn. read_exact ( & mut suc) . unwrap ( ) ;
76- if suc[ 0 ] != 1 {
77- // 密码错误
78- return ;
79- }
80- // 发送指令socket
81- let mut txc = conn. try_clone ( ) . unwrap ( ) ;
82- // 接收meta信息
83- let mut meta = [ 0u8 ; 4 ] ;
84- if let Err ( _) = conn. read_exact ( & mut meta) {
85- return ;
86- }
87- let w = ( ( ( meta[ 0 ] as u16 ) << 8 ) | meta[ 1 ] as u16 ) as i32 ;
88- let h = ( ( ( meta[ 2 ] as u16 ) << 8 ) | meta[ 3 ] as u16 ) as i32 ;
56+ // 开始绘制wind2窗口
57+ let ( sw, sh) = app:: screen_size ( ) ;
58+ let mut wind_screen = Window :: default ( ) . with_size ( ( sw / 2.0 ) as i32 , ( sh / 2.0 ) as i32 ) ;
59+ let mut frame = Frame :: default ( ) . size_of ( & wind_screen) ;
60+ wind_screen. make_resizable ( true ) ;
61+ wind_screen. end ( ) ;
62+ wind_screen. show ( ) ;
63+
64+ std:: thread:: spawn ( move || {
65+ let mut conn = TcpStream :: connect ( host) . unwrap ( ) ;
66+ // 认证
67+ let mut hasher = DefaultHasher :: new ( ) ;
68+ hasher. write ( pwd. as_bytes ( ) ) ;
69+ let pk = hasher. finish ( ) ;
70+ conn. write_all ( & [
71+ ( pk >> ( 7 * 8 ) ) as u8 ,
72+ ( pk >> ( 6 * 8 ) ) as u8 ,
73+ ( pk >> ( 5 * 8 ) ) as u8 ,
74+ ( pk >> ( 4 * 8 ) ) as u8 ,
75+ ( pk >> ( 3 * 8 ) ) as u8 ,
76+ ( pk >> ( 2 * 8 ) ) as u8 ,
77+ ( pk >> ( 1 * 8 ) ) as u8 ,
78+ pk as u8 ,
79+ ] )
80+ . unwrap ( ) ;
81+ let mut suc = [ 0u8 ] ;
82+ conn. read_exact ( & mut suc) . unwrap ( ) ;
83+ if suc[ 0 ] != 1 {
84+ // 密码错误
85+ return ;
86+ }
87+ // 发送指令socket
88+ let mut txc = conn. try_clone ( ) . unwrap ( ) ;
89+ // 接收meta信息
90+ let mut meta = [ 0u8 ; 4 ] ;
91+ if let Err ( _) = conn. read_exact ( & mut meta) {
92+ return ;
93+ }
94+ let w = ( ( ( meta[ 0 ] as u16 ) << 8 ) | meta[ 1 ] as u16 ) as i32 ;
95+ let h = ( ( ( meta[ 2 ] as u16 ) << 8 ) | meta[ 3 ] as u16 ) as i32 ;
8996
90- let dlen = ( w * h * 3 ) as usize ;
91- // 解包
92- let depack = |buffer : & [ u8 ] | -> usize {
93- ( ( buffer[ 0 ] as usize ) << 16 ) | ( ( buffer[ 1 ] as usize ) << 8 ) | ( buffer[ 2 ] as usize )
94- } ;
97+ let dlen = ( w * h * 3 ) as usize ;
98+ // 解包
99+ let depack = |buffer : & [ u8 ] | -> usize {
100+ ( ( buffer[ 0 ] as usize ) << 16 ) | ( ( buffer[ 1 ] as usize ) << 8 ) | ( buffer[ 2 ] as usize )
101+ } ;
95102
96- // 收到的数据
97- let data = Vec :: < u8 > :: with_capacity ( dlen) ;
98- let _data = Arc :: new ( RwLock :: new ( data) ) ;
99- let arc_data1 = Arc :: clone ( & _data) ;
100- let arc_data2 = Arc :: clone ( & _data) ;
103+ // 收到的数据
104+ let data = vec ! [ 0u8 ; dlen] ;
105+ let _data = Arc :: new ( RwLock :: new ( data) ) ;
106+ let arc_data1 = Arc :: clone ( & _data) ;
107+ let arc_data2 = Arc :: clone ( & _data) ;
108+
109+ frame. draw ( move |f| match arc_data2. read ( ) {
110+ Ok ( data) => {
111+ if let Ok ( mut image) = image:: RgbImage :: new ( & data, w, h, enums:: ColorDepth :: Rgb8 ) {
112+ image. scale ( f. width ( ) , f. height ( ) , false , true ) ;
113+ image. draw ( f. x ( ) , f. y ( ) , f. width ( ) , f. height ( ) ) ;
114+ }
115+ }
116+ Err ( _) => { }
117+ } ) ;
118+ let mut hooked = false ;
119+ let mut bmap = bitmap:: Bitmap :: new ( ) ;
120+ let mut cmd_buf = [ 0u8 ; 5 ] ;
121+ frame. handle ( move |f, ev| {
122+ match ev {
123+ Event :: Enter => {
124+ // 进入窗口
125+ hooked = true ;
126+ }
127+ Event :: Leave => {
128+ // 离开窗口
129+ hooked = false ;
130+ }
131+ Event :: KeyDown if hooked => {
132+ // 按键按下
133+ let key = app:: event_key ( ) . bits ( ) as u8 ;
134+ cmd_buf[ 0 ] = dscom:: KEY_DOWN ;
135+ cmd_buf[ 1 ] = key;
136+ if bmap. push ( key) {
137+ txc. write_all ( & cmd_buf[ ..2 ] ) . unwrap ( ) ;
138+ }
139+ }
140+ Event :: Shortcut if hooked => {
141+ // 按键按下
142+ let key = app:: event_key ( ) . bits ( ) as u8 ;
143+ cmd_buf[ 0 ] = dscom:: KEY_DOWN ;
144+ cmd_buf[ 1 ] = key;
145+ if bmap. push ( key) {
146+ txc. write_all ( & cmd_buf[ ..2 ] ) . unwrap ( ) ;
147+ }
148+ }
149+ Event :: KeyUp if hooked => {
150+ // 按键放开
151+ let key = app:: event_key ( ) . bits ( ) as u8 ;
152+ bmap. remove ( key) ;
153+ cmd_buf[ 0 ] = dscom:: KEY_UP ;
154+ cmd_buf[ 1 ] = key;
155+ txc. write_all ( & cmd_buf[ ..2 ] ) . unwrap ( ) ;
156+ }
157+ Event :: Move if hooked => {
158+ // 鼠标移动
159+ let relx = ( w * app:: event_x ( ) / f. width ( ) ) as u16 ;
160+ let rely = ( h * app:: event_y ( ) / f. height ( ) ) as u16 ;
161+ // MOVE xu xd yu yd
162+ cmd_buf[ 0 ] = dscom:: MOVE ;
163+ cmd_buf[ 1 ] = ( relx >> 8 ) as u8 ;
164+ cmd_buf[ 2 ] = relx as u8 ;
165+ cmd_buf[ 3 ] = ( rely >> 8 ) as u8 ;
166+ cmd_buf[ 4 ] = rely as u8 ;
167+ txc. write_all ( & cmd_buf) . unwrap ( ) ;
168+ }
169+ Event :: Push if hooked => {
170+ // 鼠标按下
171+ cmd_buf[ 0 ] = dscom:: MOUSE_KEY_DOWN ;
172+ cmd_buf[ 1 ] = app:: event_key ( ) . bits ( ) as u8 ;
173+ txc. write_all ( & cmd_buf[ ..2 ] ) . unwrap ( ) ;
174+ }
175+ Event :: Released if hooked => {
176+ // 鼠标释放
177+ cmd_buf[ 0 ] = dscom:: MOUSE_KEY_UP ;
178+ cmd_buf[ 1 ] = app:: event_key ( ) . bits ( ) as u8 ;
179+ txc. write_all ( & cmd_buf[ ..2 ] ) . unwrap ( ) ;
180+ }
181+ Event :: Drag if hooked => {
182+ // 鼠标按下移动
183+ let relx = ( w * app:: event_x ( ) / f. width ( ) ) as u16 ;
184+ let rely = ( h * app:: event_y ( ) / f. height ( ) ) as u16 ;
185+ // MOVE xu xd yu yd
186+ cmd_buf[ 0 ] = dscom:: MOVE ;
187+ cmd_buf[ 1 ] = ( relx >> 8 ) as u8 ;
188+ cmd_buf[ 2 ] = relx as u8 ;
189+ cmd_buf[ 3 ] = ( rely >> 8 ) as u8 ;
190+ cmd_buf[ 4 ] = rely as u8 ;
191+ txc. write_all ( & cmd_buf) . unwrap ( ) ;
192+ }
193+ Event :: MouseWheel if hooked => {
194+ // app::MouseWheel::Down;
195+ match app:: event_dy ( ) {
196+ app:: MouseWheel :: Down => {
197+ // 滚轮下滚
198+ cmd_buf[ 0 ] = dscom:: MOUSE_WHEEL_DOWN ;
199+ txc. write_all ( & cmd_buf[ ..1 ] ) . unwrap ( ) ;
200+ }
201+ app:: MouseWheel :: Up => {
202+ // 滚轮上滚
203+ cmd_buf[ 0 ] = dscom:: MOUSE_WHEEL_UP ;
204+ txc. write_all ( & cmd_buf[ ..1 ] ) . unwrap ( ) ;
205+ }
206+ _ => { }
207+ }
208+ }
209+ _ => {
210+ if hooked {
211+ println ! ( "{}" , ev) ;
212+ }
213+ }
214+ }
215+ true
216+ } ) ;
101217
102- std:: thread:: spawn ( move || {
103- // let mut header = [0u8; 3];
104218 let mut recv_buf = Vec :: < u8 > :: with_capacity ( dlen) ;
105219 unsafe {
106220 recv_buf. set_len ( dlen) ;
@@ -122,16 +236,15 @@ fn draw(app: app::App, host: String, pwd: String) {
122236 }
123237 Err ( _) => { }
124238 }
239+ frame. redraw ( ) ;
125240
126241 // 接收图像
127242 loop {
128243 if let Err ( _) = conn. read_exact ( & mut header) {
129- app:: quit ( ) ;
130244 return ;
131245 }
132246 let recv_len = depack ( & header) ;
133247 if let Err ( _) = conn. read_exact ( & mut recv_buf[ ..recv_len] ) {
134- app:: quit ( ) ;
135248 return ;
136249 }
137250 dscom:: decompress ( & recv_buf[ ..recv_len] , & mut depres_data) ;
@@ -145,128 +258,9 @@ fn draw(app: app::App, host: String, pwd: String) {
145258 }
146259 Err ( _) => { }
147260 }
261+ frame. redraw ( ) ;
148262 }
149263 } ) ;
150- // 开始绘制wind2窗口
151- let ( sw, sh) = app:: screen_size ( ) ;
152- let mut wind_screen = Window :: default ( ) . with_size ( ( sw/2.0 ) as i32 , ( sh/2.0 ) as i32 ) ;
153- let mut frame = Frame :: default ( ) . size_of ( & wind_screen) ;
154- wind_screen. make_resizable ( true ) ;
155- wind_screen. end ( ) ;
156- wind_screen. show ( ) ;
264+ app. run ( ) . unwrap ( ) ;
157265
158- frame. draw ( move |f| match arc_data2. read ( ) {
159- Ok ( data) => {
160- let d = & data;
161- if let Ok ( mut image) = image:: RgbImage :: new ( d, w, h, enums:: ColorDepth :: Rgb8 ) {
162- image. scale ( f. width ( ) , f. height ( ) , false , true ) ;
163- image. draw ( f. x ( ) , f. y ( ) , f. width ( ) , f. height ( ) ) ;
164- }
165- }
166- Err ( _) => { }
167- } ) ;
168- let hooked = Rc :: new ( RefCell :: new ( false ) ) ;
169- let press_record = Rc :: new ( RefCell :: new ( bitmap:: Bitmap :: new ( ) ) ) ;
170- frame. handle ( move |f, ev| {
171- let mut hk = hooked. borrow_mut ( ) ;
172- let mut bmap = press_record. borrow_mut ( ) ;
173- match ev {
174- Event :: Enter => {
175- // 进入窗口
176- * hk = true ;
177- }
178- Event :: Leave => {
179- // 离开窗口
180- * hk = false ;
181- }
182- Event :: KeyDown if * hk => {
183- // 按键按下
184- let key = ( app:: event_key ( ) . bits ( ) & 0xff ) as u8 ;
185- if bmap. push ( key) {
186- txc. write_all ( & [ dscom:: KEY_DOWN , key] ) . unwrap ( ) ;
187- }
188- }
189- Event :: Shortcut if * hk => {
190- // 按键按下
191- let key = ( app:: event_key ( ) . bits ( ) & 0xff ) as u8 ;
192- if bmap. push ( key) {
193- txc. write_all ( & [ dscom:: KEY_DOWN , key] ) . unwrap ( ) ;
194- }
195- }
196- Event :: KeyUp if * hk => {
197- // 按键放开
198- let key = ( app:: event_key ( ) . bits ( ) & 0xff ) as u8 ;
199- bmap. remove ( key) ;
200- txc. write_all ( & [ dscom:: KEY_UP , key] )
201- . unwrap ( ) ;
202- }
203- Event :: Move if * hk => {
204- // 鼠标移动
205- let relx = ( w * app:: event_x ( ) / f. width ( ) ) as u16 ;
206- let rely = ( h * app:: event_y ( ) / f. height ( ) ) as u16 ;
207- // MOVE xu xd yu yd
208- txc. write_all ( & [
209- dscom:: MOVE ,
210- ( relx >> 8 ) as u8 ,
211- ( relx & 0xff ) as u8 ,
212- ( rely >> 8 ) as u8 ,
213- ( rely & 0xff ) as u8 ,
214- ] )
215- . unwrap ( ) ;
216- }
217- Event :: Push if * hk => {
218- // 鼠标按下
219- txc. write_all ( & [
220- dscom:: MOUSE_KEY_DOWN ,
221- ( app:: event_key ( ) . bits ( ) & 0xff ) as u8 ,
222- ] )
223- . unwrap ( ) ;
224- }
225- Event :: Released if * hk => {
226- // 鼠标释放
227- txc. write_all ( & [ dscom:: MOUSE_KEY_UP , ( app:: event_key ( ) . bits ( ) & 0xff ) as u8 ] )
228- . unwrap ( ) ;
229- }
230- Event :: Drag if * hk => {
231- // 鼠标按下移动
232- let relx = ( w * app:: event_x ( ) / f. width ( ) ) as u16 ;
233- let rely = ( h * app:: event_y ( ) / f. height ( ) ) as u16 ;
234- // MOVE xu xd yu yd
235- txc. write_all ( & [
236- dscom:: MOVE ,
237- ( relx >> 8 ) as u8 ,
238- ( relx & 0xff ) as u8 ,
239- ( rely >> 8 ) as u8 ,
240- ( rely & 0xff ) as u8 ,
241- ] )
242- . unwrap ( ) ;
243- }
244- Event :: MouseWheel if * hk => {
245- // app::MouseWheel::Down;
246- match app:: event_dy ( ) {
247- app:: MouseWheel :: Down => {
248- // 滚轮下滚
249- txc. write_all ( & [ dscom:: MOUSE_WHEEL_DOWN ] ) . unwrap ( ) ;
250- }
251- app:: MouseWheel :: Up => {
252- // 滚轮上滚
253- txc. write_all ( & [ dscom:: MOUSE_WHEEL_UP ] ) . unwrap ( ) ;
254- }
255- _ => { }
256- }
257- }
258- _ => {
259- if * hk {
260- println ! ( "{}" , ev) ;
261- }
262- }
263- }
264- true
265- } ) ;
266- let dura = 1.0 / ( dscom:: FPS as f64 ) ;
267- while app. wait ( ) {
268- frame. redraw ( ) ;
269- // 30fps
270- app:: sleep ( dura) ;
271- }
272266}
0 commit comments