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,
}