on 2158366 help sign in
helix/helix-view/src/keyboard.rs
156 lines 4.8 kB history raw
1use bitflags::bitflags;
3bitflags! {
4 /// Represents key modifiers (shift, control, alt).
5 #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
6 pub struct KeyModifiers: u8 {
7 const SHIFT = 0b0000_0001;
8 const CONTROL = 0b0000_0010;
9 const ALT = 0b0000_0100;
10 const NONE = 0b0000_0000;
11 }
14#[cfg(feature = "term")]
15impl From<KeyModifiers> for crossterm::event::KeyModifiers {
16 fn from(key_modifiers: KeyModifiers) -> Self {
17 use crossterm::event::KeyModifiers as CKeyModifiers;
19 let mut result = CKeyModifiers::NONE;
21 if key_modifiers.contains(KeyModifiers::SHIFT) {
22 result.insert(CKeyModifiers::SHIFT);
23 }
24 if key_modifiers.contains(KeyModifiers::CONTROL) {
25 result.insert(CKeyModifiers::CONTROL);
26 }
27 if key_modifiers.contains(KeyModifiers::ALT) {
28 result.insert(CKeyModifiers::ALT);
29 }
31 result
32 }
35#[cfg(feature = "term")]
36impl From<crossterm::event::KeyModifiers> for KeyModifiers {
37 fn from(val: crossterm::event::KeyModifiers) -> Self {
38 use crossterm::event::KeyModifiers as CKeyModifiers;
40 let mut result = KeyModifiers::NONE;
42 if val.contains(CKeyModifiers::SHIFT) {
43 result.insert(KeyModifiers::SHIFT);
44 }
45 if val.contains(CKeyModifiers::CONTROL) {
46 result.insert(KeyModifiers::CONTROL);
47 }
48 if val.contains(CKeyModifiers::ALT) {
49 result.insert(KeyModifiers::ALT);
50 }
52 result
53 }
56/// Represents a key.
57#[derive(Debug, PartialOrd, PartialEq, Eq, Clone, Copy, Hash)]
58#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59pub enum KeyCode {
60 /// Backspace key.
61 Backspace,
62 /// Enter key.
63 Enter,
64 /// Left arrow key.
65 Left,
66 /// Right arrow key.
67 Right,
68 /// Up arrow key.
69 Up,
70 /// Down arrow key.
71 Down,
72 /// Home key.
73 Home,
74 /// End key.
75 End,
76 /// Page up key.
77 PageUp,
78 /// Page down key.
79 PageDown,
80 /// Tab key.
81 Tab,
82 /// Shift + Tab key.
83 BackTab,
84 /// Delete key.
85 Delete,
86 /// Insert key.
87 Insert,
88 /// F key.
89 ///
90 /// `KeyCode::F(1)` represents F1 key, etc.
91 F(u8),
92 /// A character.
93 ///
94 /// `KeyCode::Char('c')` represents `c` character, etc.
95 Char(char),
96 /// Null.
97 Null,
98 /// Escape key.
99 Esc,
102#[cfg(feature = "term")]
103impl From<KeyCode> for crossterm::event::KeyCode {
104 fn from(key_code: KeyCode) -> Self {
105 use crossterm::event::KeyCode as CKeyCode;
107 match key_code {
108 KeyCode::Backspace => CKeyCode::Backspace,
109 KeyCode::Enter => CKeyCode::Enter,
110 KeyCode::Left => CKeyCode::Left,
111 KeyCode::Right => CKeyCode::Right,
112 KeyCode::Up => CKeyCode::Up,
113 KeyCode::Down => CKeyCode::Down,
114 KeyCode::Home => CKeyCode::Home,
115 KeyCode::End => CKeyCode::End,
116 KeyCode::PageUp => CKeyCode::PageUp,
117 KeyCode::PageDown => CKeyCode::PageDown,
118 KeyCode::Tab => CKeyCode::Tab,
119 KeyCode::BackTab => CKeyCode::BackTab,
120 KeyCode::Delete => CKeyCode::Delete,
121 KeyCode::Insert => CKeyCode::Insert,
122 KeyCode::F(f_number) => CKeyCode::F(f_number),
123 KeyCode::Char(character) => CKeyCode::Char(character),
124 KeyCode::Null => CKeyCode::Null,
125 KeyCode::Esc => CKeyCode::Esc,
126 }
127 }
130#[cfg(feature = "term")]
131impl From<crossterm::event::KeyCode> for KeyCode {
132 fn from(val: crossterm::event::KeyCode) -> Self {
133 use crossterm::event::KeyCode as CKeyCode;
135 match val {
136 CKeyCode::Backspace => KeyCode::Backspace,
137 CKeyCode::Enter => KeyCode::Enter,
138 CKeyCode::Left => KeyCode::Left,
139 CKeyCode::Right => KeyCode::Right,
140 CKeyCode::Up => KeyCode::Up,
141 CKeyCode::Down => KeyCode::Down,
142 CKeyCode::Home => KeyCode::Home,
143 CKeyCode::End => KeyCode::End,
144 CKeyCode::PageUp => KeyCode::PageUp,
145 CKeyCode::PageDown => KeyCode::PageDown,
146 CKeyCode::Tab => KeyCode::Tab,
147 CKeyCode::BackTab => KeyCode::BackTab,
148 CKeyCode::Delete => KeyCode::Delete,
149 CKeyCode::Insert => KeyCode::Insert,
150 CKeyCode::F(f_number) => KeyCode::F(f_number),
151 CKeyCode::Char(character) => KeyCode::Char(character),
152 CKeyCode::Null => KeyCode::Null,
153 CKeyCode::Esc => KeyCode::Esc,
154 }
155 }