1 extern crate sdl2;
2 
3 use sdl2::event::Event;
4 use sdl2::keyboard::Keycode;
5 use std::collections::HashSet;
6 use std::time::Duration;
7 
main() -> Result<(), String>8 pub fn main() -> Result<(), String> {
9     let sdl_context = sdl2::init()?;
10     let video_subsystem = sdl_context.video()?;
11 
12     let _window = video_subsystem.window("Keyboard", 800, 600)
13         .position_centered()
14         .build()
15         .map_err(|e| e.to_string())?;
16 
17     let mut events = sdl_context.event_pump()?;
18 
19     let mut prev_keys = HashSet::new();
20 
21     'running: loop {
22         for event in events.poll_iter() {
23             if let Event::Quit {..} = event {
24                 break 'running;
25             };
26         }
27 
28         // Create a set of pressed Keys.
29         let keys = events.keyboard_state().pressed_scancodes().filter_map(Keycode::from_scancode).collect();
30 
31         // Get the difference between the new and old sets.
32         let new_keys = &keys - &prev_keys;
33         let old_keys = &prev_keys - &keys;
34 
35         if !new_keys.is_empty() || !old_keys.is_empty() {
36             println!("new_keys: {:?}\told_keys:{:?}", new_keys, old_keys);
37         }
38 
39         prev_keys = keys;
40 
41         std::thread::sleep(Duration::from_millis(100));
42     }
43 
44     Ok(())
45 }
46