Skip to main content

watchexec_events/
keyboard.rs

1#[derive(Debug, Clone, PartialEq, Eq)]
2#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
4#[non_exhaustive]
5/// A keyboard input.
6pub enum Keyboard {
7	/// Event representing an 'end of file' on stdin
8	Eof,
9
10	/// A key press in interactive mode
11	Key {
12		/// The key that was pressed.
13		key: KeyCode,
14
15		/// Modifier keys held during the press.
16		#[cfg_attr(
17			feature = "serde",
18			serde(default, skip_serializing_if = "Modifiers::is_empty")
19		)]
20		modifiers: Modifiers,
21	},
22}
23
24/// A key code.
25#[derive(Debug, Clone, PartialEq, Eq)]
26#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
27#[cfg_attr(feature = "serde", serde(rename_all = "kebab-case"))]
28#[non_exhaustive]
29pub enum KeyCode {
30	/// A unicode character (letter, digit, symbol, space).
31	Char(char),
32	/// Enter / Return.
33	Enter,
34	/// Escape.
35	Escape,
36}
37
38/// Modifier key flags.
39#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
41pub struct Modifiers {
42	/// Ctrl / Control was held.
43	#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
44	pub ctrl: bool,
45	/// Alt / Option was held.
46	#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
47	pub alt: bool,
48	/// Shift was held.
49	#[cfg_attr(feature = "serde", serde(default, skip_serializing_if = "is_false"))]
50	pub shift: bool,
51}
52
53#[cfg(feature = "serde")]
54fn is_false(b: &bool) -> bool {
55	!b
56}
57
58impl Modifiers {
59	/// Returns true if no modifier keys are set.
60	#[must_use]
61	pub fn is_empty(&self) -> bool {
62		!self.ctrl && !self.alt && !self.shift
63	}
64}