oxygengine_input_device_desktop/
keyboard.rs

1use backend::resource::DesktopAppEvents;
2use core::{ecs::Universe, Scalar};
3use glutin::event::{ElementState, WindowEvent};
4use input::device::InputDevice;
5use std::{any::Any, collections::HashSet};
6
7#[derive(Default)]
8pub struct DesktopKeyboardInputDevice {
9    keys: HashSet<String>,
10    text: String,
11}
12
13impl InputDevice for DesktopKeyboardInputDevice {
14    fn name(&self) -> &str {
15        "keyboard"
16    }
17
18    fn on_register(&mut self) {}
19
20    fn on_unregister(&mut self) {}
21
22    fn process(&mut self, universe: &mut Universe) {
23        let events = universe.query_resources::<&DesktopAppEvents>();
24        for event in events.iter() {
25            if let WindowEvent::KeyboardInput { input, .. } = event {
26                let key = input
27                    .virtual_keycode
28                    .as_ref()
29                    .map(|keycode| format!("{:?}", keycode))
30                    .unwrap_or_else(|| format!("#{}", input.scancode));
31                match input.state {
32                    ElementState::Pressed => {
33                        self.keys.insert(key);
34                    }
35                    ElementState::Released => {
36                        self.keys.remove(&key);
37                    }
38                }
39            }
40        }
41        self.text.clear();
42    }
43
44    fn query_axis(&self, name: &str) -> Option<Scalar> {
45        Some(if self.keys.contains(name) { 1.0 } else { 0.0 })
46    }
47
48    fn query_trigger(&self, name: &str) -> Option<bool> {
49        Some(self.keys.contains(name))
50    }
51
52    fn query_text(&self) -> Option<String> {
53        Some(self.text.to_owned())
54    }
55
56    fn as_any(&self) -> &dyn Any {
57        self
58    }
59}