1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use crate::*;

pub(crate) struct KeyboardState {
	scankeys: [bool; 300],
	vkeys: [bool; 300],
}

impl KeyboardState {
	pub fn modifiers(&self) -> KeyboardModifiers {
		KeyboardModifiers {
			shift: self.vkeys[VirtualKey::LeftShift as usize]
				|| self.vkeys[VirtualKey::RightShift as usize],
			ctrl: self.vkeys[VirtualKey::LeftControl as usize],
			alt: self.vkeys[VirtualKey::LeftAlt as usize]
				|| self.vkeys[VirtualKey::RightAlt as usize],
		}
	}

	pub fn key_down(&mut self, scancode: Scancode, vkey: Option<VirtualKey>) {
		self.scankeys[scancode as usize] = true;
		if let Some(vkey) = vkey {
			self.vkeys[vkey as usize] = true;
		}
	}

	pub fn key_up(&mut self, scancode: Scancode, vkey: Option<VirtualKey>) {
		self.scankeys[scancode as usize] = false;
		if let Some(vkey) = vkey {
			self.vkeys[vkey as usize] = false;
		}
	}

	pub fn is_key_down(&self, scancode: Scancode) -> bool {
		self.scankeys[scancode as usize]
	}

	pub fn is_vkey_down(&self, vkey: VirtualKey) -> bool {
		self.vkeys[vkey as usize]
	}
}

impl Default for KeyboardState {
	fn default() -> Self {
		KeyboardState {
			scankeys: [false; 300],
			vkeys: [false; 300],
		}
	}
}

/// A snapshot of which keyboard modifiers are currently pressed.
///
/// Mostly used to provide context for [`InputEvent`] keyboard events.
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct KeyboardModifiers {
	pub shift: bool,
	pub ctrl: bool,
	pub alt: bool,
}