@@ -16,6 +16,11 @@ use v4l::video::capture::Parameters;
16
16
use v4l:: video:: Capture ;
17
17
use v4l:: { Format , FourCC } ;
18
18
19
+ use winit:: application:: ApplicationHandler ;
20
+ use winit:: event:: WindowEvent ;
21
+ use winit:: event_loop:: ActiveEventLoop ;
22
+ use winit:: window:: WindowId ;
23
+
19
24
#[ derive( Debug , Clone , Copy ) ]
20
25
enum UserEvent {
21
26
WakeUp ,
@@ -157,58 +162,75 @@ fn main() -> io::Result<()> {
157
162
}
158
163
} ) ;
159
164
160
- event_loop
161
- . run ( move |event, elwt| {
162
- let t0 = Instant :: now ( ) ;
163
- let data = rx. recv ( ) . unwrap ( ) ;
164
- let t1 = Instant :: now ( ) ;
165
-
166
- let image = glium:: texture:: RawImage2d :: from_raw_rgb_reversed (
167
- & data,
168
- ( format. width , format. height ) ,
169
- ) ;
170
- let opengl_texture = glium:: texture:: Texture2d :: new ( & display, image) . unwrap ( ) ;
171
-
172
- // building the uniforms
173
- let uniforms = uniform ! {
174
- matrix: [
175
- [ 1.0 , 0.0 , 0.0 , 0.0 ] ,
176
- [ 0.0 , 1.0 , 0.0 , 0.0 ] ,
177
- [ 0.0 , 0.0 , 1.0 , 0.0 ] ,
178
- [ 0.0 , 0.0 , 0.0 , 1.0f32 ]
179
- ] ,
180
- tex: & opengl_texture
181
- } ;
165
+ struct LoopHandler < F > {
166
+ user_event : F ,
167
+ }
182
168
183
- // drawing a frame
184
-
185
- let mut target = display. draw ( ) ;
186
- target. clear_color ( 0.0 , 0.0 , 0.0 , 0.0 ) ;
187
- target
188
- . draw (
189
- & vertex_buffer,
190
- & index_buffer,
191
- & program,
192
- & uniforms,
193
- & Default :: default ( ) ,
194
- )
195
- . unwrap ( ) ;
196
- target. finish ( ) . unwrap ( ) ;
169
+ impl < F : Fn ( UserEvent ) > ApplicationHandler < UserEvent > for LoopHandler < F > {
170
+ fn resumed ( & mut self , _event_loop : & ActiveEventLoop ) { }
197
171
172
+ fn window_event (
173
+ & mut self ,
174
+ event_loop : & ActiveEventLoop ,
175
+ _window_id : WindowId ,
176
+ event : WindowEvent ,
177
+ ) {
198
178
// polling and handling the events received by the window
199
- if let winit:: event:: Event :: WindowEvent {
200
- event : winit:: event:: WindowEvent :: CloseRequested ,
201
- ..
202
- } = event
203
- {
204
- elwt. exit ( ) ;
179
+ if let winit:: event:: WindowEvent :: CloseRequested = event {
180
+ event_loop. exit ( ) ;
205
181
}
182
+ }
206
183
207
- print ! (
208
- "\r ms: {}\t (buffer) + {}\t (UI)" ,
209
- t1. duration_since( t0) . as_millis( ) ,
210
- t1. elapsed( ) . as_millis( ) ,
211
- ) ;
184
+ fn user_event ( & mut self , _event_loop : & ActiveEventLoop , event : UserEvent ) {
185
+ ( self . user_event ) ( event)
186
+ }
187
+ }
188
+
189
+ event_loop
190
+ . run_app ( & mut LoopHandler {
191
+ user_event : move |_event| {
192
+ let t0 = Instant :: now ( ) ;
193
+ let data = rx. recv ( ) . unwrap ( ) ;
194
+ let t1 = Instant :: now ( ) ;
195
+
196
+ let image = glium:: texture:: RawImage2d :: from_raw_rgb_reversed (
197
+ & data,
198
+ ( format. width , format. height ) ,
199
+ ) ;
200
+ let opengl_texture = glium:: texture:: Texture2d :: new ( & display, image) . unwrap ( ) ;
201
+
202
+ // building the uniforms
203
+ let uniforms = uniform ! {
204
+ matrix: [
205
+ [ 1.0 , 0.0 , 0.0 , 0.0 ] ,
206
+ [ 0.0 , 1.0 , 0.0 , 0.0 ] ,
207
+ [ 0.0 , 0.0 , 1.0 , 0.0 ] ,
208
+ [ 0.0 , 0.0 , 0.0 , 1.0f32 ]
209
+ ] ,
210
+ tex: & opengl_texture
211
+ } ;
212
+
213
+ // drawing a frame
214
+
215
+ let mut target = display. draw ( ) ;
216
+ target. clear_color ( 0.0 , 0.0 , 0.0 , 0.0 ) ;
217
+ target
218
+ . draw (
219
+ & vertex_buffer,
220
+ & index_buffer,
221
+ & program,
222
+ & uniforms,
223
+ & Default :: default ( ) ,
224
+ )
225
+ . unwrap ( ) ;
226
+ target. finish ( ) . unwrap ( ) ;
227
+
228
+ print ! (
229
+ "\r ms: {}\t (buffer) + {}\t (UI)" ,
230
+ t1. duration_since( t0) . as_millis( ) ,
231
+ t1. elapsed( ) . as_millis( ) ,
232
+ ) ;
233
+ } ,
212
234
} )
213
235
. map_err ( io:: Error :: other)
214
236
}
0 commit comments