@@ -10,7 +10,7 @@ pub struct Cap {
1010 w : usize ,
1111 h : usize ,
1212 org_len : usize ,
13- capturer : Capturer ,
13+ capturer : Option < Capturer > ,
1414 sleep : Duration ,
1515}
1616impl Cap {
@@ -22,42 +22,69 @@ impl Cap {
2222 w,
2323 h,
2424 org_len : w * h * 4 ,
25- capturer,
25+ capturer : Some ( capturer ) ,
2626 sleep : Duration :: new ( 1 , 0 ) / 60 ,
2727 }
2828 }
29+ fn reload ( & mut self ) {
30+ println ! ( "Reload capturer" ) ;
31+ drop ( self . capturer . take ( ) ) ;
32+ let display = match Display :: primary ( ) {
33+ Ok ( display) => display,
34+ Err ( e) => {
35+ println ! ( "{}" , e) ;
36+ return ;
37+ }
38+ } ;
39+
40+ let capturer = match Capturer :: new ( display) {
41+ Ok ( capturer) => capturer,
42+ Err ( _) => return ,
43+ } ;
44+ self . capturer = Some ( capturer) ;
45+ }
2946 pub fn wh ( & self ) -> ( usize , usize ) {
3047 return ( self . w , self . h ) ;
3148 }
3249 pub fn cap ( & mut self , cap_buf : & mut [ u8 ] ) {
3350 loop {
34- // Wait until there's a frame.
35- let cp = & self . capturer . frame ( ) ;
36- let buffer = match cp {
37- Ok ( buffer) => buffer,
38- Err ( error) => {
39- std:: thread:: sleep ( self . sleep ) ;
40- if error. kind ( ) == WouldBlock {
41- // Keep spinning.
42- continue ;
43- } else {
44- println ! ( "cap error: {}" , error) ;
45- continue ;
51+ match & mut self . capturer {
52+ Some ( capturer) => {
53+ // Wait until there's a frame.
54+ let cp = capturer. frame ( ) ;
55+ let buffer = match cp {
56+ Ok ( buffer) => buffer,
57+ Err ( error) => {
58+ std:: thread:: sleep ( self . sleep ) ;
59+ if error. kind ( ) == WouldBlock {
60+ // Keep spinning.
61+ continue ;
62+ } else {
63+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 200 ) ) ;
64+ self . reload ( ) ;
65+ continue ;
66+ }
67+ }
68+ } ;
69+
70+ // 转换成rgb图像数组
71+ let mut k = 0 ;
72+ let mut n = 0 ;
73+ while n < self . org_len {
74+ cap_buf[ k] = buffer[ n + 2 ] & dscom:: BIT_SAVE ;
75+ cap_buf[ k + 1 ] = buffer[ n + 1 ] & dscom:: BIT_SAVE ;
76+ cap_buf[ k + 2 ] = buffer[ n] & dscom:: BIT_SAVE ;
77+ k += 3 ;
78+ n += 4 ;
4679 }
80+ break ;
81+ }
82+ None => {
83+ std:: thread:: sleep ( std:: time:: Duration :: from_millis ( 200 ) ) ;
84+ self . reload ( ) ;
85+ continue ;
4786 }
4887 } ;
49-
50- // 转换成rgb图像数组
51- let mut k = 0 ;
52- let mut n = 0 ;
53- while n < self . org_len {
54- cap_buf[ k] = buffer[ n + 2 ] & dscom:: BIT_SAVE ;
55- cap_buf[ k + 1 ] = buffer[ n + 1 ] & dscom:: BIT_SAVE ;
56- cap_buf[ k + 2 ] = buffer[ n] & dscom:: BIT_SAVE ;
57- k += 3 ;
58- n += 4 ;
59- }
60- break ;
6188 }
6289 }
6390}
0 commit comments