virtio_input_decoder/
key.rs1pub struct KeyDecoder();
2
3#[derive(Debug, PartialEq, Clone, Copy)]
4pub enum Key
5{
6 None,
7 ESC,
8 One,
9 Two,
10 Three,
11 Four,
12 Five,
13 Six,
14 Seven,
15 Eight,
16 Nine,
17 Zero,
18 Minus,
19 Equal,
20 BackSpace,
21 Tab,
22 Q,
23 W,
24 E,
25 R,
26 T,
27 Y,
28 U,
29 I,
30 O,
31 P,
32 LSB,
33 RSB,
34 Enter,
35 LCTRL,
36 A,
37 S,
38 D,
39 F,
40 G,
41 H,
42 J,
43 K,
44 L,
45 Colon,
46 SineglePoint,
47 Point,
48 LSHIFT,
49 BackSlash,
50 Z,
51 X,
52 C,
53 V,
54 B,
55 N,
56 M,
57 Comma,
58 Dot,
59 Slash,
60 RSHIFT,
61 DPSTAR,
62 LALT,
63 Space,
64 CAPS,
65 MouseScrollDown = 0x150,
66 MouseScrollUp,
67 MouseLeft = 272,
68 MouseRight,
69 MouseMid,
70}
71
72impl KeyDecoder {
73 pub fn decode(code : usize)->Result<Key, ()>{
74 let rt = match code {
75 1 => {Key::ESC}
76 2 => {Key::One}
77 3 => {Key::Two}
78 4 => {Key::Three}
79 5 => {Key::Four}
80 6 => {Key::Five}
81 7 => {Key::Six}
82 8 => {Key::Seven}
83 9 => {Key::Eight}
84 10 => {Key::Nine}
85 11 => {Key::Zero}
86 12 => {Key::Minus}
87 13 => {Key::Equal}
88 14 => {Key::BackSpace}
89 15 => {Key::Tab}
90 16 => {Key::Q}
91 17 => {Key::W}
92 18 => {Key::E}
93 19 => {Key::R}
94 20 => {Key::T}
95 21 => {Key::Y}
96 22 => {Key::U}
97 23 => {Key::I}
98 24 => {Key::O}
99 25 => {Key::P}
100 26 => {Key::LSB}
101 27 => {Key::RSB}
102 28 => {Key::Enter}
103 29 => {Key::LCTRL}
104 30 => {Key::A}
105 31 => {Key::S}
106 32 => {Key::D}
107 33 => {Key::F}
108 34 => {Key::G}
109 35 => {Key::H}
110 36 => {Key::J}
111 37 => {Key::K}
112 38 => {Key::L}
113 39 => {Key::Colon}
114 40 => {Key::SineglePoint}
115 41 => {Key::Point}
116 42 => {Key::LSHIFT}
117 43 => {Key::BackSlash}
118 44 => {Key::Z}
119 45 => {Key::X}
120 46 => {Key::C}
121 47 => {Key::V}
122 48 => {Key::B}
123 49 => {Key::N}
124 50 => {Key::M}
125 51 => {Key::Comma}
126 52 => {Key::Dot}
127 53 => {Key::Slash}
128 54 => {Key::RSHIFT}
129 55 => {Key::DPSTAR}
130 56 => {Key::LALT}
131 57 => {Key::Space}
132 58 => {Key::CAPS}
133 272 => {Key::MouseLeft}
134 273 => {Key::MouseRight}
135 274 => {Key::MouseMid}
136 _ => return Err(())
137 };
138 Ok(rt)
139 }
140
141 pub fn convert(key : Key)->Result<char, ()> {
142 match key {
143 Key::A => {Ok('a')}
144 Key::B => {Ok('b')}
145 Key::C => {Ok('c')}
146 Key::D => {Ok('d')}
147 Key::E => {Ok('e')}
148 Key::F => {Ok('f')}
149 Key::G => {Ok('g')}
150 Key::H => {Ok('h')}
151 Key::I => {Ok('i')}
152 Key::J => {Ok('j')}
153 Key::K => {Ok('k')}
154 Key::L => {Ok('l')}
155 Key::M => {Ok('m')}
156 Key::N => {Ok('n')}
157 Key::O => {Ok('o')}
158 Key::P => {Ok('p')}
159 Key::Q => {Ok('q')}
160 Key::R => {Ok('r')}
161 Key::S => {Ok('s')}
162 Key::T => {Ok('t')}
163 Key::U => {Ok('u')}
164 Key::V => {Ok('v')}
165 Key::W => {Ok('w')}
166 Key::X => {Ok('x')}
167 Key::Y => {Ok('y')}
168 Key::Z => {Ok('z')}
169 Key::Enter => {Ok('\r')}
170 Key::One => {Ok('1')}
171 Key::Two => {Ok('2')}
172 Key::Three => {Ok('3')}
173 Key::Four => {Ok('4')}
174 Key::Five => {Ok('5')}
175 Key::Six => {Ok('6')}
176 Key::Seven => {Ok('7')}
177 Key::Eight => {Ok('8')}
178 Key::Nine => {Ok('9')}
179 Key::Zero => {Ok('0')}
180 Key::Dot => {Ok('.')}
181 Key::Colon => {Ok(';')}
182 Key::SineglePoint => {Ok('\'')}
183 Key::BackSlash => {Ok('\\')}
184 Key::Comma => {Ok(',')}
185 Key::Slash => {Ok('/')}
186 Key::Space => {Ok(' ')}
187 Key::Minus => {Ok('-')}
188 Key::Equal => {Ok('=')}
189 Key::Tab => {Ok('\t')}
190 _ => {Err(())}
191 }
192 }
193
194 pub fn key_type(value : usize)->Result<KeyType, ()> {
195 match value {
196 1 => Ok(KeyType::Press),
197 0 => Ok(KeyType::Release),
198 _ => Err(())
199 }
200 }
201}
202
203impl Key {
204 pub fn from_code(code : usize)->Result<Key, ()> {
205 let rt = match code {
206 1 => {Key::ESC}
207 2 => {Key::One}
208 3 => {Key::Two}
209 4 => {Key::Three}
210 5 => {Key::Four}
211 6 => {Key::Five}
212 7 => {Key::Six}
213 8 => {Key::Seven}
214 9 => {Key::Eight}
215 10 => {Key::Nine}
216 11 => {Key::Zero}
217 12 => {Key::Minus}
218 13 => {Key::Equal}
219 14 => {Key::BackSpace}
220 15 => {Key::Tab}
221 16 => {Key::Q}
222 17 => {Key::W}
223 18 => {Key::E}
224 19 => {Key::R}
225 20 => {Key::T}
226 21 => {Key::Y}
227 22 => {Key::U}
228 23 => {Key::I}
229 24 => {Key::O}
230 25 => {Key::P}
231 26 => {Key::LSB}
232 27 => {Key::RSB}
233 28 => {Key::Enter}
234 29 => {Key::LCTRL}
235 30 => {Key::A}
236 31 => {Key::S}
237 32 => {Key::D}
238 33 => {Key::F}
239 34 => {Key::G}
240 35 => {Key::H}
241 36 => {Key::J}
242 37 => {Key::K}
243 38 => {Key::L}
244 39 => {Key::Colon}
245 40 => {Key::SineglePoint}
246 41 => {Key::Point}
247 42 => {Key::LSHIFT}
248 43 => {Key::BackSlash}
249 44 => {Key::Z}
250 45 => {Key::X}
251 46 => {Key::C}
252 47 => {Key::V}
253 48 => {Key::B}
254 49 => {Key::N}
255 50 => {Key::M}
256 51 => {Key::Comma}
257 52 => {Key::Dot}
258 53 => {Key::Slash}
259 54 => {Key::RSHIFT}
260 55 => {Key::DPSTAR}
261 56 => {Key::LALT}
262 57 => {Key::Space}
263 58 => {Key::CAPS}
264 272 => {Key::MouseLeft}
265 273 => {Key::MouseRight}
266 274 => {Key::MouseMid}
267 _ => return Err(())
268 };
269 Ok(rt)
270 }
271
272 pub fn to_char(&self)->Result<char, ()> {
273 match *self {
274 Key::A => {Ok('a')}
275 Key::B => {Ok('b')}
276 Key::C => {Ok('c')}
277 Key::D => {Ok('d')}
278 Key::E => {Ok('e')}
279 Key::F => {Ok('f')}
280 Key::G => {Ok('g')}
281 Key::H => {Ok('h')}
282 Key::I => {Ok('i')}
283 Key::J => {Ok('j')}
284 Key::K => {Ok('k')}
285 Key::L => {Ok('l')}
286 Key::M => {Ok('m')}
287 Key::N => {Ok('n')}
288 Key::O => {Ok('o')}
289 Key::P => {Ok('p')}
290 Key::Q => {Ok('q')}
291 Key::R => {Ok('r')}
292 Key::S => {Ok('s')}
293 Key::T => {Ok('t')}
294 Key::U => {Ok('u')}
295 Key::V => {Ok('v')}
296 Key::W => {Ok('w')}
297 Key::X => {Ok('x')}
298 Key::Y => {Ok('y')}
299 Key::Z => {Ok('z')}
300 Key::Enter => {Ok('\r')}
301 Key::One => {Ok('1')}
302 Key::Two => {Ok('2')}
303 Key::Three => {Ok('3')}
304 Key::Four => {Ok('4')}
305 Key::Five => {Ok('5')}
306 Key::Six => {Ok('6')}
307 Key::Seven => {Ok('7')}
308 Key::Eight => {Ok('8')}
309 Key::Nine => {Ok('9')}
310 Key::Zero => {Ok('0')}
311 Key::Dot => {Ok('.')}
312 Key::Colon => {Ok(';')}
313 Key::SineglePoint => {Ok('\'')}
314 Key::BackSlash => {Ok('\\')}
315 Key::Comma => {Ok(',')}
316 Key::Slash => {Ok('/')}
317 Key::Space => {Ok(' ')}
318 Key::Minus => {Ok('-')}
319 Key::Equal => {Ok('=')}
320 Key::Tab => {Ok('\t')}
321 _ => {Err(())}
322 }
323 }
324}
325
326#[derive(Debug, PartialEq, Clone, Copy)]
327pub enum KeyType {
328 Press,
329 Release,
330}