@@ -5,13 +5,11 @@ use fltk::input::Input;
5
5
use fltk:: input:: SecretInput ;
6
6
use fltk:: prelude:: InputExt ;
7
7
use fltk:: window:: Window ;
8
- use std:: cell:: RefCell ;
9
8
use std:: collections:: hash_map:: DefaultHasher ;
10
9
use std:: hash:: Hasher ;
11
10
use std:: io:: Read ;
12
11
use std:: io:: Write ;
13
12
use std:: net:: TcpStream ;
14
- use std:: rc:: Rc ;
15
13
use std:: sync:: Arc ;
16
14
use std:: sync:: RwLock ;
17
15
@@ -55,52 +53,168 @@ pub fn app_run() {
55
53
}
56
54
57
55
fn 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 ;
89
96
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
+ } ;
95
102
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
+ } ) ;
101
217
102
- std:: thread:: spawn ( move || {
103
- // let mut header = [0u8; 3];
104
218
let mut recv_buf = Vec :: < u8 > :: with_capacity ( dlen) ;
105
219
unsafe {
106
220
recv_buf. set_len ( dlen) ;
@@ -122,16 +236,15 @@ fn draw(app: app::App, host: String, pwd: String) {
122
236
}
123
237
Err ( _) => { }
124
238
}
239
+ frame. redraw ( ) ;
125
240
126
241
// 接收图像
127
242
loop {
128
243
if let Err ( _) = conn. read_exact ( & mut header) {
129
- app:: quit ( ) ;
130
244
return ;
131
245
}
132
246
let recv_len = depack ( & header) ;
133
247
if let Err ( _) = conn. read_exact ( & mut recv_buf[ ..recv_len] ) {
134
- app:: quit ( ) ;
135
248
return ;
136
249
}
137
250
dscom:: decompress ( & recv_buf[ ..recv_len] , & mut depres_data) ;
@@ -145,128 +258,9 @@ fn draw(app: app::App, host: String, pwd: String) {
145
258
}
146
259
Err ( _) => { }
147
260
}
261
+ frame. redraw ( ) ;
148
262
}
149
263
} ) ;
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 ( ) ;
157
265
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
- }
272
266
}
0 commit comments