jay_config/keyboard/
mods.rs

1//! Keyboard modifiers
2
3use {
4    crate::{keyboard::syms::KeySym, ModifiedKeySym},
5    serde::{Deserialize, Serialize},
6    std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign},
7};
8
9/// Zero or more keyboard modifiers
10#[derive(Serialize, Deserialize, Copy, Clone, Eq, PartialEq, Default, Hash, Debug)]
11pub struct Modifiers(pub u32);
12
13impl Modifiers {
14    /// No modifiers.
15    pub const NONE: Self = Modifiers(0);
16}
17
18/// The Shift modifier
19pub const SHIFT: Modifiers = Modifiers(1 << 0);
20/// The CapsLock modifier.
21pub const LOCK: Modifiers = Modifiers(1 << 1);
22/// The Ctrl modifier.
23pub const CTRL: Modifiers = Modifiers(1 << 2);
24/// The Mod1 modifier, i.e., Alt.
25pub const MOD1: Modifiers = Modifiers(1 << 3);
26/// The Mod2 modifier, i.e., NumLock.
27pub const MOD2: Modifiers = Modifiers(1 << 4);
28/// The Mod3 modifier.
29pub const MOD3: Modifiers = Modifiers(1 << 5);
30/// The Mod4 modifier, i.e., Logo.
31pub const MOD4: Modifiers = Modifiers(1 << 6);
32/// The Mod5 modifier.
33pub const MOD5: Modifiers = Modifiers(1 << 7);
34
35/// Alias for `LOCK`.
36pub const CAPS: Modifiers = LOCK;
37/// Alias for `MOD1`.
38pub const ALT: Modifiers = MOD1;
39/// Alias for `MOD2`.
40pub const NUM: Modifiers = MOD2;
41/// Alias for `MOD4`.
42pub const LOGO: Modifiers = MOD4;
43
44/// Synthetic modifier matching key release events.
45///
46/// This can be used to execute a callback on key release.
47pub const RELEASE: Modifiers = Modifiers(1 << 31);
48
49impl BitOr for Modifiers {
50    type Output = Self;
51
52    fn bitor(self, rhs: Self) -> Self::Output {
53        Self(self.0 | rhs.0)
54    }
55}
56
57impl BitOr<KeySym> for Modifiers {
58    type Output = ModifiedKeySym;
59
60    fn bitor(self, rhs: KeySym) -> Self::Output {
61        ModifiedKeySym {
62            mods: self,
63            sym: rhs,
64        }
65    }
66}
67
68impl BitAnd for Modifiers {
69    type Output = Self;
70
71    fn bitand(self, rhs: Self) -> Self::Output {
72        Self(self.0 & rhs.0)
73    }
74}
75
76impl BitOrAssign for Modifiers {
77    fn bitor_assign(&mut self, rhs: Self) {
78        self.0 |= rhs.0
79    }
80}
81
82impl BitAndAssign for Modifiers {
83    fn bitand_assign(&mut self, rhs: Self) {
84        self.0 &= rhs.0
85    }
86}