oxygengine_input_device_desktop/
keyboard.rs1use 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}