pc_keyboard/
lib.rs

1//! Driver for a PS/2 PC keyboard.
2//!
3//! Supports PS/2 Scan Code Set 1 and 2, on a variety of keyboard layouts. See
4//! [the OSDev Wiki](https://wiki.osdev.org/PS/2_Keyboard).
5//!
6//! There are three basic steps to handling keyboard input. Your application may bypass some of these.
7//!
8//! * [`Ps2Decoder`] - converts 11-bit PS/2 words into bytes, removing the start/stop
9//!   bits and checking the parity bits. Only needed if you talk to the PS/2
10//!   keyboard over GPIO pins and not required if you talk to the i8042 PC keyboard
11//!   controller.
12//! * [`ScancodeSet`] - converts from Scancode Set 1 (i8042 PC keyboard controller) or
13//!   Scancode Set 2 (raw PS/2 keyboard output) into a symbolic [`KeyCode`] and an
14//!   up/down [`KeyState`].
15//! * [`EventDecoder`] - converts symbolic [`KeyCode`] and [`KeyState`] into a Unicode
16//!   characters (where possible) according to the currently selected `KeyboardLayout`.
17//!
18//! There is also [`Keyboard`] which combines the above three functions into a single object.
19
20#![cfg_attr(not(test), no_std)]
21
22// ****************************************************************************
23//
24// Modules
25//
26// ****************************************************************************
27
28pub mod layouts;
29
30mod scancodes;
31pub use crate::scancodes::{ScancodeSet1, ScancodeSet2};
32
33// ****************************************************************************
34//
35// Public Types
36//
37// ****************************************************************************
38
39/// Encapsulates decode/sampling logic, and handles state transitions and key events.
40#[derive(Debug)]
41pub struct Keyboard<L, S>
42where
43    S: ScancodeSet,
44    L: KeyboardLayout,
45{
46    ps2_decoder: Ps2Decoder,
47    scancode_set: S,
48    event_decoder: EventDecoder<L>,
49}
50
51/// Handles decoding of IBM PS/2 Keyboard (and IBM PC/AT Keyboard) bit-streams.
52#[derive(Debug)]
53pub struct Ps2Decoder {
54    register: u16,
55    num_bits: u8,
56}
57
58/// Converts KeyEvents into Unicode, according to the current Keyboard Layout
59#[derive(Debug)]
60pub struct EventDecoder<L>
61where
62    L: KeyboardLayout,
63{
64    handle_ctrl: HandleControl,
65    modifiers: Modifiers,
66    layout: L,
67}
68
69/// Indicates different error conditions.
70#[derive(Debug, PartialEq, Eq, Copy, Clone)]
71#[non_exhaustive]
72pub enum Error {
73    BadStartBit,
74    BadStopBit,
75    ParityError,
76    UnknownKeyCode,
77}
78
79/// Keycodes that can be generated by a keyboard.
80///
81/// We use this enum to abstract over Scan Code Set 1 and Scan Code Set 2.
82///
83/// See <https://kbdlayout.info/kbduk/shiftstates+virtualkeys/base>
84#[derive(Debug, PartialEq, Eq, Copy, Clone, PartialOrd, Ord)]
85#[repr(u8)]
86pub enum KeyCode {
87    // ========= Row 1 (the F-keys) =========
88    /// Top Left of the Keyboard
89    Escape,
90    /// Function Key F1
91    F1,
92    /// Function Key F2
93    F2,
94    /// Function Key F3
95    F3,
96    /// Function Key F4
97    F4,
98    /// Function Key F5
99    F5,
100    /// Function Key F6
101    F6,
102    /// Function Key F7
103    F7,
104    /// Function Key F8
105    F8,
106    /// Function Key F9
107    F9,
108    /// Function Key F10
109    F10,
110    /// Function Key F11
111    F11,
112    /// Function Key F12
113    F12,
114
115    /// The Print Screen Key
116    PrintScreen,
117    /// The Sys Req key (you get this keycode with Alt + PrintScreen)
118    SysRq,
119    /// The Scroll Lock key
120    ScrollLock,
121    /// The Pause/Break key
122    PauseBreak,
123
124    // ========= Row 2 (the numbers) =========
125    /// Symbol key to the left of `Key1`
126    Oem8,
127    /// Number Line, Digit 1
128    Key1,
129    /// Number Line, Digit 2
130    Key2,
131    /// Number Line, Digit 3
132    Key3,
133    /// Number Line, Digit 4
134    Key4,
135    /// Number Line, Digit 5
136    Key5,
137    /// Number Line, Digit 6
138    Key6,
139    /// Number Line, Digit 7
140    Key7,
141    /// Number Line, Digit 8
142    Key8,
143    /// Number Line, Digit 9
144    Key9,
145    /// Number Line, Digit 0
146    Key0,
147    /// US Minus/Underscore Key (right of 'Key0')
148    OemMinus,
149    /// US Equals/Plus Key (right of 'OemMinus')
150    OemPlus,
151    /// Backspace
152    Backspace,
153
154    /// Top Left of the Extended Block
155    Insert,
156    /// Top Middle of the Extended Block
157    Home,
158    /// Top Right of the Extended Block
159    PageUp,
160
161    /// The Num Lock key
162    NumpadLock,
163    /// The Numpad Divide (or Slash) key
164    NumpadDivide,
165    /// The Numpad Multiple (or Star) key
166    NumpadMultiply,
167    /// The Numpad Subtract (or Minus) key
168    NumpadSubtract,
169
170    // ========= Row 3 (QWERTY) =========
171    /// The Tab Key
172    Tab,
173    /// Letters, Top Row #1
174    Q,
175    /// Letters, Top Row #2
176    W,
177    /// Letters, Top Row #3
178    E,
179    /// Letters, Top Row #4
180    R,
181    /// Letters, Top Row #5
182    T,
183    /// Letters, Top Row #6
184    Y,
185    /// Letters, Top Row #7
186    U,
187    /// Letters, Top Row #8
188    I,
189    /// Letters, Top Row #9
190    O,
191    /// Letters, Top Row #10
192    P,
193    /// US ANSI Left-Square-Bracket key
194    Oem4,
195    /// US ANSI Right-Square-Bracket key
196    Oem6,
197    /// US ANSI Backslash Key / UK ISO Backslash Key
198    Oem5,
199    /// The UK/ISO Hash/Tilde key (ISO layout only)
200    Oem7,
201
202    /// The Delete key - bottom Left of the Extended Block
203    Delete,
204    /// The End key - bottom Middle of the Extended Block
205    End,
206    /// The Page Down key - -bottom Right of the Extended Block
207    PageDown,
208
209    /// The Numpad 7/Home key
210    Numpad7,
211    /// The Numpad 8/Up Arrow key
212    Numpad8,
213    /// The Numpad 9/Page Up key
214    Numpad9,
215    /// The Numpad Add/Plus key
216    NumpadAdd,
217
218    // ========= Row 4 (ASDF) =========
219    /// Caps Lock
220    CapsLock,
221    /// Letters, Middle Row #1
222    A,
223    /// Letters, Middle Row #2
224    S,
225    /// Letters, Middle Row #3
226    D,
227    /// Letters, Middle Row #4
228    F,
229    /// Letters, Middle Row #5
230    G,
231    /// Letters, Middle Row #6
232    H,
233    /// Letters, Middle Row #7
234    J,
235    /// Letters, Middle Row #8
236    K,
237    /// Letters, Middle Row #9
238    L,
239    /// The US ANSI Semicolon/Colon key
240    Oem1,
241    /// The US ANSI Single-Quote/At key
242    Oem3,
243
244    /// The Return Key
245    Return,
246
247    /// The Numpad 4/Left Arrow key
248    Numpad4,
249    /// The Numpad 5 Key
250    Numpad5,
251    /// The Numpad 6/Right Arrow key
252    Numpad6,
253
254    // ========= Row 5 (ZXCV) =========
255    /// Left Shift
256    LShift,
257    /// Letters, Bottom Row #1
258    Z,
259    /// Letters, Bottom Row #2
260    X,
261    /// Letters, Bottom Row #3
262    C,
263    /// Letters, Bottom Row #4
264    V,
265    /// Letters, Bottom Row #5
266    B,
267    /// Letters, Bottom Row #6
268    N,
269    /// Letters, Bottom Row #7
270    M,
271    /// US ANSI `,<` key
272    OemComma,
273    /// US ANSI `.>` Key
274    OemPeriod,
275    /// US ANSI `/?` Key
276    Oem2,
277    /// Right Shift
278    RShift,
279
280    /// The up-arrow in the inverted-T
281    ArrowUp,
282
283    /// Numpad 1/End Key
284    Numpad1,
285    /// Numpad 2/Arrow Down Key
286    Numpad2,
287    /// Numpad 3/Page Down Key
288    Numpad3,
289    /// Numpad Enter
290    NumpadEnter,
291
292    // ========= Row 6 (modifers and space bar) =========
293    /// The left-hand Control key
294    LControl,
295    /// The left-hand 'Windows' key
296    LWin,
297    /// The left-hand Alt key
298    LAlt,
299    /// The Space Bar
300    Spacebar,
301    /// The right-hand AltGr key
302    RAltGr,
303    /// The right-hand Win key
304    RWin,
305    /// The 'Apps' key (aka 'Menu' or 'Right-Click')
306    Apps,
307    /// The right-hand Control key
308    RControl,
309
310    /// The left-arrow in the inverted-T
311    ArrowLeft,
312    /// The down-arrow in the inverted-T
313    ArrowDown,
314    /// The right-arrow in the inverted-T
315    ArrowRight,
316
317    /// The Numpad 0/Insert Key
318    Numpad0,
319    /// The Numppad Period/Delete Key
320    NumpadPeriod,
321
322    // ========= JIS 109-key extra keys =========
323    /// Extra JIS key (0x7B)
324    Oem9,
325    /// Extra JIS key (0x79)
326    Oem10,
327    /// Extra JIS key (0x70)
328    Oem11,
329    /// Extra JIS symbol key (0x73)
330    Oem12,
331    /// Extra JIS symbol key (0x7D)
332    Oem13,
333
334    // ========= Extra Keys =========
335    /// Multi-media keys - Previous Track
336    PrevTrack,
337    /// Multi-media keys - Next Track
338    NextTrack,
339    /// Multi-media keys - Volume Mute Toggle
340    Mute,
341    /// Multi-media keys - Open Calculator
342    Calculator,
343    /// Multi-media keys - Play
344    Play,
345    /// Multi-media keys - Stop
346    Stop,
347    /// Multi-media keys - Increase Volume
348    VolumeDown,
349    /// Multi-media keys - Decrease Volume
350    VolumeUp,
351    /// Multi-media keys - Open Browser
352    WWWHome,
353    /// Sent when the keyboard boots
354    PowerOnTestOk,
355    /// Sent by the keyboard when too many keys are pressed
356    TooManyKeys,
357    /// Used as a 'hidden' Right Control Key (Pause = RControl2 + Num Lock)
358    RControl2,
359    /// Used as a 'hidden' Right Alt Key (Print Screen = RAlt2 + PrntScr)
360    RAlt2,
361}
362
363/// The new state for a key, as part of a key event.
364#[derive(Debug, PartialEq, Eq, Copy, Clone)]
365pub enum KeyState {
366    /// Key has just been released
367    Up,
368    /// Key has just been pressed
369    Down,
370    /// Key was pressed and then released as an atomic action. Or it's like a
371    /// PowerOnSelfTest event which doesn't have an 'Up' or a 'Down'.
372    SingleShot,
373}
374
375/// Options for how we can handle what happens when the Ctrl key is held down
376/// and a letter is pressed.
377#[derive(Debug, PartialEq, Eq, Copy, Clone)]
378pub enum HandleControl {
379    /// If either Ctrl key is held down, convert the letters A through Z into
380    /// Unicode chars U+0001 through U+001A. If the Ctrl keys are not held
381    /// down, letters go through normally.
382    MapLettersToUnicode,
383    /// Don't do anything special - send through the Ctrl key up/down events,
384    /// and leave the letters as letters.
385    Ignore,
386}
387
388/// A event describing something happen to a key on your keyboard.
389#[derive(Debug, PartialEq, Eq, Clone)]
390pub struct KeyEvent {
391    /// Which key this event is for
392    pub code: KeyCode,
393    /// The new state for the key
394    pub state: KeyState,
395}
396
397/// Describes a Keyboard Layout.
398///
399/// Layouts might include "en_US", or "en_GB", or "de_GR".
400pub trait KeyboardLayout {
401    /// Convert a `KeyCode` enum to a Unicode character, if possible.
402    /// `KeyCode::A` maps to `DecodedKey::Unicode('a')` (or
403    /// `DecodedKey::Unicode('A')` if shifted), while `KeyCode::LAlt` becomes
404    /// `DecodedKey::RawKey(KeyCode::LAlt)` because there's no Unicode equivalent.
405    fn map_keycode(
406        &self,
407        keycode: KeyCode,
408        modifiers: &Modifiers,
409        handle_ctrl: HandleControl,
410    ) -> DecodedKey;
411}
412
413/// A mechanism to convert bytes from a Keyboard into [`KeyCode`] values.
414///
415/// This conversion is stateful.
416pub trait ScancodeSet {
417    /// Handles the state logic for the decoding of scan codes into key events.
418    fn advance_state(&mut self, code: u8) -> Result<Option<KeyEvent>, Error>;
419}
420
421/// The set of modifier keys you have on a keyboard.
422#[derive(Debug, Default, Clone, Eq, PartialEq, Hash)]
423pub struct Modifiers {
424    /// The left shift key is down
425    pub lshift: bool,
426    /// The right shift key is down
427    pub rshift: bool,
428    /// The left control key is down
429    pub lctrl: bool,
430    /// The right control key is down
431    pub rctrl: bool,
432    /// The Num Lock toggle is on
433    pub numlock: bool,
434    /// The caps lock toggle is on
435    pub capslock: bool,
436    /// The left alt key is down
437    pub lalt: bool,
438    /// The right alt key is down
439    pub ralt: bool,
440    /// Special 'hidden' control key is down (used when you press Pause)
441    pub rctrl2: bool,
442}
443
444/// Contains either a Unicode character, or a raw key code.
445#[derive(Debug, PartialEq, Eq, Copy, Clone)]
446pub enum DecodedKey {
447    RawKey(KeyCode),
448    Unicode(char),
449}
450
451// ****************************************************************************
452//
453// Public Data
454//
455// ****************************************************************************
456
457// None
458
459// ****************************************************************************
460//
461// Private Types
462//
463// ****************************************************************************
464
465/// Tracls
466#[derive(Debug, Copy, Clone, Eq, PartialEq)]
467enum DecodeState {
468    Start,
469    Extended,
470    Release,
471    ExtendedRelease,
472    Extended2,
473    Extended2Release,
474}
475
476// ****************************************************************************
477//
478// Private Data
479//
480// ****************************************************************************
481
482const KEYCODE_BITS: u8 = 11;
483const EXTENDED_KEY_CODE: u8 = 0xE0;
484const EXTENDED2_KEY_CODE: u8 = 0xE1;
485const KEY_RELEASE_CODE: u8 = 0xF0;
486
487// ****************************************************************************
488//
489// Public Functions and Implementation
490//
491// ****************************************************************************
492
493impl<L, S> Keyboard<L, S>
494where
495    L: KeyboardLayout,
496    S: ScancodeSet,
497{
498    /// Make a new Keyboard object with the given layout.
499    pub const fn new(scancode_set: S, layout: L, handle_ctrl: HandleControl) -> Keyboard<L, S> {
500        Keyboard {
501            ps2_decoder: Ps2Decoder::new(),
502            scancode_set,
503            event_decoder: EventDecoder::new(layout, handle_ctrl),
504        }
505    }
506
507    /// Get the current key modifier states.
508    pub const fn get_modifiers(&self) -> &Modifiers {
509        &self.event_decoder.modifiers
510    }
511
512    /// Change the Ctrl key mapping.
513    pub fn set_ctrl_handling(&mut self, new_value: HandleControl) {
514        self.event_decoder.set_ctrl_handling(new_value);
515    }
516
517    /// Get the current Ctrl key mapping.
518    pub const fn get_ctrl_handling(&self) -> HandleControl {
519        self.event_decoder.get_ctrl_handling()
520    }
521
522    /// Clears the bit register.
523    ///
524    /// Call this when there is a timeout reading data from the keyboard.
525    pub fn clear(&mut self) {
526        self.ps2_decoder.clear();
527    }
528
529    /// Processes a 16-bit word from the keyboard.
530    ///
531    /// * The start bit (0) must be in bit 0.
532    /// * The data octet must be in bits 1..8, with the LSB in bit 1 and the
533    ///   MSB in bit 8.
534    /// * The parity bit must be in bit 9.
535    /// * The stop bit (1) must be in bit 10.
536    pub fn add_word(&mut self, word: u16) -> Result<Option<KeyEvent>, Error> {
537        let byte = self.ps2_decoder.add_word(word)?;
538        self.add_byte(byte)
539    }
540
541    /// Processes an 8-bit byte from the keyboard.
542    ///
543    /// We assume the start, stop and parity bits have been processed and
544    /// verified.
545    pub fn add_byte(&mut self, byte: u8) -> Result<Option<KeyEvent>, Error> {
546        self.scancode_set.advance_state(byte)
547    }
548
549    /// Shift a bit into the register.
550    ///
551    /// Call this /or/ call `add_word` - don't call both.
552    /// Until the last bit is added you get Ok(None) returned.
553    pub fn add_bit(&mut self, bit: bool) -> Result<Option<KeyEvent>, Error> {
554        if let Some(byte) = self.ps2_decoder.add_bit(bit)? {
555            self.scancode_set.advance_state(byte)
556        } else {
557            Ok(None)
558        }
559    }
560
561    /// Processes a `KeyEvent` returned from `add_bit`, `add_byte` or `add_word`
562    /// and produces a decoded key.
563    ///
564    /// For example, the KeyEvent for pressing the '5' key on your keyboard
565    /// gives a DecodedKey of unicode character '5', unless the shift key is
566    /// held in which case you get the unicode character '%'.
567    pub fn process_keyevent(&mut self, ev: KeyEvent) -> Option<DecodedKey> {
568        self.event_decoder.process_keyevent(ev)
569    }
570}
571
572impl Ps2Decoder {
573    /// Build a new PS/2 protocol decoder.
574    pub const fn new() -> Ps2Decoder {
575        Ps2Decoder {
576            register: 0,
577            num_bits: 0,
578        }
579    }
580
581    /// Clears the bit register.
582    ///
583    /// Call this when there is a timeout reading data from the keyboard.
584    pub fn clear(&mut self) {
585        self.register = 0;
586        self.num_bits = 0;
587    }
588
589    /// Shift a bit into the register.
590    ///
591    /// Until the last bit is added you get Ok(None) returned.
592    pub fn add_bit(&mut self, bit: bool) -> Result<Option<u8>, Error> {
593        self.register |= (bit as u16) << self.num_bits;
594        self.num_bits += 1;
595        if self.num_bits == KEYCODE_BITS {
596            let word = self.register;
597            self.register = 0;
598            self.num_bits = 0;
599            let byte = Self::check_word(word)?;
600            Ok(Some(byte))
601        } else {
602            Ok(None)
603        }
604    }
605
606    /// Process an entire 11-bit word.
607    ///
608    /// Must be packed into the bottom 11-bits of the 16-bit value.
609    pub fn add_word(&self, word: u16) -> Result<u8, Error> {
610        Self::check_word(word)
611    }
612
613    /// Check 11-bit word has 1 start bit, 1 stop bit and an odd parity bit.
614    const fn check_word(word: u16) -> Result<u8, Error> {
615        let start_bit = Self::get_bit(word, 0);
616        let parity_bit = Self::get_bit(word, 9);
617        let stop_bit = Self::get_bit(word, 10);
618        let data = ((word >> 1) & 0xFF) as u8;
619
620        if start_bit {
621            return Err(Error::BadStartBit);
622        }
623
624        if !stop_bit {
625            return Err(Error::BadStopBit);
626        }
627
628        // We have odd parity, so if there are an even number of 1 bits, we need
629        // the parity bit set to make it odd.
630        let need_parity = Self::has_even_number_bits(data);
631
632        if need_parity != parity_bit {
633            return Err(Error::ParityError);
634        }
635
636        Ok(data)
637    }
638
639    const fn get_bit(word: u16, offset: usize) -> bool {
640        ((word >> offset) & 0x0001) != 0
641    }
642
643    const fn has_even_number_bits(data: u8) -> bool {
644        (data.count_ones() % 2) == 0
645    }
646}
647
648impl Default for Ps2Decoder {
649    fn default() -> Self {
650        Ps2Decoder::new()
651    }
652}
653
654impl<L> EventDecoder<L>
655where
656    L: KeyboardLayout,
657{
658    /// Construct a new event decoder.
659    pub const fn new(layout: L, handle_ctrl: HandleControl) -> EventDecoder<L> {
660        EventDecoder {
661            handle_ctrl,
662            modifiers: Modifiers {
663                lshift: false,
664                rshift: false,
665                lctrl: false,
666                rctrl: false,
667                numlock: true,
668                capslock: false,
669                lalt: false,
670                ralt: false,
671                rctrl2: false,
672            },
673            layout,
674        }
675    }
676
677    /// Change the Ctrl key mapping.
678    pub fn set_ctrl_handling(&mut self, new_value: HandleControl) {
679        self.handle_ctrl = new_value;
680    }
681
682    /// Get the current Ctrl key mapping.
683    pub const fn get_ctrl_handling(&self) -> HandleControl {
684        self.handle_ctrl
685    }
686
687    /// Processes a `KeyEvent` returned from `add_bit`, `add_byte` or `add_word`
688    /// and produces a decoded key.
689    ///
690    /// For example, the KeyEvent for pressing the '5' key on your keyboard
691    /// gives a DecodedKey of unicode character '5', unless the shift key is
692    /// held in which case you get the unicode character '%'.
693    pub fn process_keyevent(&mut self, ev: KeyEvent) -> Option<DecodedKey> {
694        match ev {
695            KeyEvent {
696                code: KeyCode::LShift,
697                state: KeyState::Down,
698            } => {
699                self.modifiers.lshift = true;
700                Some(DecodedKey::RawKey(KeyCode::LShift))
701            }
702            KeyEvent {
703                code: KeyCode::RShift,
704                state: KeyState::Down,
705            } => {
706                self.modifiers.rshift = true;
707                Some(DecodedKey::RawKey(KeyCode::RShift))
708            }
709            KeyEvent {
710                code: KeyCode::LShift,
711                state: KeyState::Up,
712            } => {
713                self.modifiers.lshift = false;
714                None
715            }
716            KeyEvent {
717                code: KeyCode::RShift,
718                state: KeyState::Up,
719            } => {
720                self.modifiers.rshift = false;
721                None
722            }
723            KeyEvent {
724                code: KeyCode::CapsLock,
725                state: KeyState::Down,
726            } => {
727                self.modifiers.capslock = !self.modifiers.capslock;
728                Some(DecodedKey::RawKey(KeyCode::CapsLock))
729            }
730            KeyEvent {
731                code: KeyCode::NumpadLock,
732                state: KeyState::Down,
733            } => {
734                if self.modifiers.rctrl2 {
735                    // It's a Pause key because we got the 'hidden' rctrl2
736                    // sequence first.
737                    Some(DecodedKey::RawKey(KeyCode::PauseBreak))
738                } else {
739                    // It's a numlock toggle
740                    self.modifiers.numlock = !self.modifiers.numlock;
741                    Some(DecodedKey::RawKey(KeyCode::NumpadLock))
742                }
743            }
744            KeyEvent {
745                code: KeyCode::LControl,
746                state: KeyState::Down,
747            } => {
748                self.modifiers.lctrl = true;
749                Some(DecodedKey::RawKey(KeyCode::LControl))
750            }
751            KeyEvent {
752                code: KeyCode::LControl,
753                state: KeyState::Up,
754            } => {
755                self.modifiers.lctrl = false;
756                None
757            }
758            KeyEvent {
759                code: KeyCode::RControl,
760                state: KeyState::Down,
761            } => {
762                self.modifiers.rctrl = true;
763                Some(DecodedKey::RawKey(KeyCode::RControl))
764            }
765            KeyEvent {
766                code: KeyCode::RControl,
767                state: KeyState::Up,
768            } => {
769                self.modifiers.rctrl = false;
770                None
771            }
772            KeyEvent {
773                code: KeyCode::LAlt,
774                state: KeyState::Down,
775            } => {
776                self.modifiers.lalt = true;
777                Some(DecodedKey::RawKey(KeyCode::LAlt))
778            }
779            KeyEvent {
780                code: KeyCode::LAlt,
781                state: KeyState::Up,
782            } => {
783                self.modifiers.lalt = false;
784                None
785            }
786            KeyEvent {
787                code: KeyCode::RAltGr,
788                state: KeyState::Down,
789            } => {
790                self.modifiers.ralt = true;
791                Some(DecodedKey::RawKey(KeyCode::RAltGr))
792            }
793            KeyEvent {
794                code: KeyCode::RAltGr,
795                state: KeyState::Up,
796            } => {
797                self.modifiers.ralt = false;
798                None
799            }
800            KeyEvent {
801                code: KeyCode::RControl2,
802                state: KeyState::Down,
803            } => {
804                self.modifiers.rctrl2 = true;
805                Some(DecodedKey::RawKey(KeyCode::RControl2))
806            }
807            KeyEvent {
808                code: KeyCode::RControl2,
809                state: KeyState::Up,
810            } => {
811                self.modifiers.rctrl2 = false;
812                None
813            }
814            KeyEvent {
815                code: c,
816                state: KeyState::Down,
817            } => Some(
818                self.layout
819                    .map_keycode(c, &self.modifiers, self.handle_ctrl),
820            ),
821            _ => None,
822        }
823    }
824
825    /// Change the keyboard layout.
826    ///
827    /// Only useful with [`layouts::AnyLayout`], otherwise you can only change a
828    /// layout for exactly the same layout.
829    pub fn change_layout(&mut self, new_layout: L) {
830        self.layout = new_layout;
831    }
832}
833
834impl KeyEvent {
835    pub const fn new(code: KeyCode, state: KeyState) -> KeyEvent {
836        KeyEvent { code, state }
837    }
838}
839
840// ****************************************************************************
841//
842// Keyboard Layouts
843//
844// ****************************************************************************
845
846impl Modifiers {
847    pub const fn is_shifted(&self) -> bool {
848        self.lshift | self.rshift
849    }
850
851    pub const fn is_ctrl(&self) -> bool {
852        self.lctrl | self.rctrl
853    }
854
855    pub const fn is_alt(&self) -> bool {
856        self.lalt | self.ralt
857    }
858
859    pub const fn is_altgr(&self) -> bool {
860        self.ralt | (self.lalt & self.is_ctrl())
861    }
862
863    pub const fn is_caps(&self) -> bool {
864        self.is_shifted() ^ self.capslock
865    }
866}
867
868// ****************************************************************************
869//
870// Tests
871//
872// ****************************************************************************
873
874#[cfg(test)]
875mod test {
876    use super::*;
877
878    fn add_bytes<L, S>(keyboard: &mut Keyboard<L, S>, test_sequence: &[(u8, Option<KeyEvent>)])
879    where
880        L: KeyboardLayout,
881        S: ScancodeSet,
882    {
883        for (byte, expected_key) in test_sequence.iter().cloned() {
884            let result = keyboard.add_byte(byte);
885            assert_eq!(
886                result,
887                Ok(expected_key.clone()),
888                "0x{:02x} should have given {:?} not {:?}",
889                byte,
890                expected_key,
891                result
892            );
893        }
894    }
895
896    fn process_keyevents<L, S>(
897        keyboard: &mut Keyboard<L, S>,
898        test_sequence: &[(KeyEvent, Option<DecodedKey>)],
899    ) where
900        L: KeyboardLayout,
901        S: ScancodeSet,
902    {
903        for (idx, (event, expected_decode)) in test_sequence.iter().cloned().enumerate() {
904            let result = keyboard.process_keyevent(event.clone());
905            assert_eq!(
906                result,
907                expected_decode.clone(),
908                "Entry {} {:?} should have given {:?} not {:?}",
909                idx,
910                event,
911                expected_decode,
912                result
913            );
914        }
915    }
916
917    #[test]
918    fn test_f9() {
919        let mut k = Keyboard::new(
920            ScancodeSet2::new(),
921            layouts::Us104Key,
922            HandleControl::MapLettersToUnicode,
923        );
924        // start
925        assert_eq!(k.add_bit(false), Ok(None));
926        // 8 data bits (LSB first)
927        assert_eq!(k.add_bit(true), Ok(None));
928        assert_eq!(k.add_bit(false), Ok(None));
929        assert_eq!(k.add_bit(false), Ok(None));
930        assert_eq!(k.add_bit(false), Ok(None));
931        assert_eq!(k.add_bit(false), Ok(None));
932        assert_eq!(k.add_bit(false), Ok(None));
933        assert_eq!(k.add_bit(false), Ok(None));
934        assert_eq!(k.add_bit(false), Ok(None));
935        // parity
936        assert_eq!(k.add_bit(false), Ok(None));
937        // stop
938        assert_eq!(
939            k.add_bit(true),
940            Ok(Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))
941        );
942    }
943
944    #[test]
945    fn test_f9_word() {
946        let mut k = Keyboard::new(
947            ScancodeSet2::new(),
948            layouts::Us104Key,
949            HandleControl::MapLettersToUnicode,
950        );
951        assert_eq!(
952            k.add_word(0x0402),
953            Ok(Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))
954        );
955    }
956
957    #[test]
958    fn test_f9_byte() {
959        let mut k = Keyboard::new(
960            ScancodeSet2::new(),
961            layouts::Us104Key,
962            HandleControl::MapLettersToUnicode,
963        );
964
965        let test_sequence = [(0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down)))];
966        add_bytes(&mut k, &test_sequence);
967    }
968
969    #[test]
970    fn test_keyup_keydown() {
971        let mut k = Keyboard::new(
972            ScancodeSet2::new(),
973            layouts::Us104Key,
974            HandleControl::MapLettersToUnicode,
975        );
976        let test_sequence = [
977            (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down))),
978            (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Down))),
979            (0xF0, None),
980            (0x01, Some(KeyEvent::new(KeyCode::F9, KeyState::Up))),
981        ];
982        add_bytes(&mut k, &test_sequence);
983    }
984
985    #[test]
986    fn test_f5() {
987        let mut k = Keyboard::new(
988            ScancodeSet2::new(),
989            layouts::Us104Key,
990            HandleControl::MapLettersToUnicode,
991        );
992        // start
993        assert_eq!(k.add_bit(false), Ok(None));
994        // 8 data bits (LSB first)
995        assert_eq!(k.add_bit(true), Ok(None));
996        assert_eq!(k.add_bit(true), Ok(None));
997        assert_eq!(k.add_bit(false), Ok(None));
998        assert_eq!(k.add_bit(false), Ok(None));
999        assert_eq!(k.add_bit(false), Ok(None));
1000        assert_eq!(k.add_bit(false), Ok(None));
1001        assert_eq!(k.add_bit(false), Ok(None));
1002        assert_eq!(k.add_bit(false), Ok(None));
1003        // parity
1004        assert_eq!(k.add_bit(true), Ok(None));
1005        // stop
1006        assert_eq!(
1007            k.add_bit(true),
1008            Ok(Some(KeyEvent::new(KeyCode::F5, KeyState::Down)))
1009        );
1010    }
1011
1012    #[test]
1013    fn test_f5_up() {
1014        let mut k = Keyboard::new(
1015            ScancodeSet2::new(),
1016            layouts::Us104Key,
1017            HandleControl::MapLettersToUnicode,
1018        );
1019        // Send F0
1020
1021        // start
1022        assert_eq!(k.add_bit(false), Ok(None));
1023        // 8 data bits (LSB first)
1024        assert_eq!(k.add_bit(false), Ok(None));
1025        assert_eq!(k.add_bit(false), Ok(None));
1026        assert_eq!(k.add_bit(false), Ok(None));
1027        assert_eq!(k.add_bit(false), Ok(None));
1028        assert_eq!(k.add_bit(true), Ok(None));
1029        assert_eq!(k.add_bit(true), Ok(None));
1030        assert_eq!(k.add_bit(true), Ok(None));
1031        assert_eq!(k.add_bit(true), Ok(None));
1032        // parity
1033        assert_eq!(k.add_bit(true), Ok(None));
1034        // stop
1035        assert_eq!(k.add_bit(true), Ok(None));
1036
1037        // Send 03
1038
1039        // start
1040        assert_eq!(k.add_bit(false), Ok(None));
1041        // 8 data bits (LSB first)
1042        assert_eq!(k.add_bit(true), Ok(None));
1043        assert_eq!(k.add_bit(true), Ok(None));
1044        assert_eq!(k.add_bit(false), Ok(None));
1045        assert_eq!(k.add_bit(false), Ok(None));
1046        assert_eq!(k.add_bit(false), Ok(None));
1047        assert_eq!(k.add_bit(false), Ok(None));
1048        assert_eq!(k.add_bit(false), Ok(None));
1049        assert_eq!(k.add_bit(false), Ok(None));
1050        // parity
1051        assert_eq!(k.add_bit(true), Ok(None));
1052        // stop
1053        assert_eq!(
1054            k.add_bit(true),
1055            Ok(Some(KeyEvent::new(KeyCode::F5, KeyState::Up)))
1056        );
1057    }
1058
1059    #[test]
1060    fn test_shift() {
1061        let mut k = Keyboard::new(
1062            ScancodeSet2::new(),
1063            layouts::Uk105Key,
1064            HandleControl::MapLettersToUnicode,
1065        );
1066        let test_sequence = [
1067            // A with left shift held
1068            (
1069                KeyEvent::new(KeyCode::LShift, KeyState::Down),
1070                Some(DecodedKey::RawKey(KeyCode::LShift)),
1071            ),
1072            (
1073                KeyEvent::new(KeyCode::A, KeyState::Down),
1074                Some(DecodedKey::Unicode('A')),
1075            ),
1076            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1077            (KeyEvent::new(KeyCode::LShift, KeyState::Up), None),
1078            // A with no shift
1079            (
1080                KeyEvent::new(KeyCode::A, KeyState::Down),
1081                Some(DecodedKey::Unicode('a')),
1082            ),
1083            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1084            // A with right shift held
1085            (
1086                KeyEvent::new(KeyCode::RShift, KeyState::Down),
1087                Some(DecodedKey::RawKey(KeyCode::RShift)),
1088            ),
1089            (
1090                KeyEvent::new(KeyCode::A, KeyState::Down),
1091                Some(DecodedKey::Unicode('A')),
1092            ),
1093            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1094            (KeyEvent::new(KeyCode::RShift, KeyState::Up), None),
1095            // Caps lock ON
1096            (
1097                KeyEvent::new(KeyCode::CapsLock, KeyState::Down),
1098                Some(DecodedKey::RawKey(KeyCode::CapsLock)),
1099            ),
1100            (KeyEvent::new(KeyCode::CapsLock, KeyState::Up), None),
1101            // Letters are now caps
1102            (
1103                KeyEvent::new(KeyCode::X, KeyState::Down),
1104                Some(DecodedKey::Unicode('X')),
1105            ),
1106            (KeyEvent::new(KeyCode::X, KeyState::Up), None),
1107            // Unless you press shift
1108            (
1109                KeyEvent::new(KeyCode::RShift, KeyState::Down),
1110                Some(DecodedKey::RawKey(KeyCode::RShift)),
1111            ),
1112            (
1113                KeyEvent::new(KeyCode::A, KeyState::Down),
1114                Some(DecodedKey::Unicode('a')),
1115            ),
1116            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1117            (KeyEvent::new(KeyCode::RShift, KeyState::Up), None),
1118            // Numbers are not shifted
1119            (
1120                KeyEvent::new(KeyCode::Key1, KeyState::Down),
1121                Some(DecodedKey::Unicode('1')),
1122            ),
1123            (KeyEvent::new(KeyCode::Key1, KeyState::Up), None),
1124        ];
1125
1126        process_keyevents(&mut k, &test_sequence);
1127    }
1128
1129    #[test]
1130    fn test_ctrl() {
1131        let mut k = Keyboard::new(
1132            ScancodeSet2::new(),
1133            layouts::Us104Key,
1134            HandleControl::MapLettersToUnicode,
1135        );
1136        let test_sequence = [
1137            // Normal
1138            (
1139                KeyEvent::new(KeyCode::A, KeyState::Down),
1140                Some(DecodedKey::Unicode('a')),
1141            ),
1142            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1143            // Left Control
1144            (
1145                KeyEvent::new(KeyCode::LControl, KeyState::Down),
1146                Some(DecodedKey::RawKey(KeyCode::LControl)),
1147            ),
1148            (
1149                KeyEvent::new(KeyCode::A, KeyState::Down),
1150                Some(DecodedKey::Unicode('\u{0001}')),
1151            ),
1152            (KeyEvent::new(KeyCode::LControl, KeyState::Up), None),
1153            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1154            // Normal
1155            (
1156                KeyEvent::new(KeyCode::A, KeyState::Down),
1157                Some(DecodedKey::Unicode('a')),
1158            ),
1159            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1160            // Right Control
1161            (
1162                KeyEvent::new(KeyCode::RControl, KeyState::Down),
1163                Some(DecodedKey::RawKey(KeyCode::RControl)),
1164            ),
1165            (
1166                KeyEvent::new(KeyCode::A, KeyState::Down),
1167                Some(DecodedKey::Unicode('\u{0001}')),
1168            ),
1169            (KeyEvent::new(KeyCode::RControl, KeyState::Up), None),
1170            (KeyEvent::new(KeyCode::A, KeyState::Up), None),
1171        ];
1172        process_keyevents(&mut k, &test_sequence);
1173    }
1174
1175    #[test]
1176    fn test_numlock() {
1177        let mut k = Keyboard::new(
1178            ScancodeSet2::new(),
1179            layouts::Uk105Key,
1180            HandleControl::MapLettersToUnicode,
1181        );
1182
1183        let test_sequence = [
1184            // Numlock ON by default so we get digits
1185            (
1186                KeyEvent::new(KeyCode::Numpad0, KeyState::Down),
1187                Some(DecodedKey::Unicode('0')),
1188            ),
1189            (KeyEvent::new(KeyCode::Numpad0, KeyState::Up), None),
1190            // Numlock OFF
1191            (
1192                KeyEvent::new(KeyCode::NumpadLock, KeyState::Down),
1193                Some(DecodedKey::RawKey(KeyCode::NumpadLock)),
1194            ),
1195            (KeyEvent::new(KeyCode::NumpadLock, KeyState::Up), None),
1196            // Now KP_0 produces INSERT
1197            (
1198                KeyEvent::new(KeyCode::Numpad0, KeyState::Down),
1199                Some(DecodedKey::RawKey(KeyCode::Insert)),
1200            ),
1201            (KeyEvent::new(KeyCode::Numpad0, KeyState::Up), None),
1202        ];
1203        process_keyevents(&mut k, &test_sequence);
1204    }
1205
1206    #[test]
1207    fn test_set_1_down_up_down() {
1208        let mut k = Keyboard::new(
1209            ScancodeSet1::new(),
1210            layouts::Us104Key,
1211            HandleControl::MapLettersToUnicode,
1212        );
1213        let test_sequence = [
1214            (0x1e, Some(KeyEvent::new(KeyCode::A, KeyState::Down))),
1215            (0x9e, Some(KeyEvent::new(KeyCode::A, KeyState::Up))),
1216            (0x1f, Some(KeyEvent::new(KeyCode::S, KeyState::Down))),
1217        ];
1218
1219        add_bytes(&mut k, &test_sequence);
1220    }
1221
1222    #[test]
1223    fn test_set_1_ext_down_up_down() {
1224        let mut k = Keyboard::new(
1225            ScancodeSet1::new(),
1226            layouts::Us104Key,
1227            HandleControl::MapLettersToUnicode,
1228        );
1229        let test_sequence = [
1230            (0xe0, None),
1231            (
1232                0x1c,
1233                Some(KeyEvent::new(KeyCode::NumpadEnter, KeyState::Down)),
1234            ),
1235            (0xe0, None),
1236            (
1237                0x9c,
1238                Some(KeyEvent::new(KeyCode::NumpadEnter, KeyState::Up)),
1239            ),
1240        ];
1241        add_bytes(&mut k, &test_sequence);
1242    }
1243
1244    #[test]
1245    fn test_set_2_poweron() {
1246        let mut k = Keyboard::new(
1247            ScancodeSet2::new(),
1248            layouts::Us104Key,
1249            HandleControl::MapLettersToUnicode,
1250        );
1251        let test_sequence = [(
1252            0xAA,
1253            Some(KeyEvent::new(KeyCode::PowerOnTestOk, KeyState::SingleShot)),
1254        )];
1255        add_bytes(&mut k, &test_sequence);
1256    }
1257
1258    #[test]
1259    fn test_set_2_toomanykeys() {
1260        let mut k = Keyboard::new(
1261            ScancodeSet2::new(),
1262            layouts::Us104Key,
1263            HandleControl::MapLettersToUnicode,
1264        );
1265        let test_sequence = [(
1266            0x00,
1267            Some(KeyEvent::new(KeyCode::TooManyKeys, KeyState::SingleShot)),
1268        )];
1269        add_bytes(&mut k, &test_sequence);
1270    }
1271
1272    #[test]
1273    fn test_set_2_down_up() {
1274        let mut k = Keyboard::new(
1275            ScancodeSet2::new(),
1276            layouts::Us104Key,
1277            HandleControl::MapLettersToUnicode,
1278        );
1279        let test_sequence = [
1280            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1281            (0xF0, None),
1282            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1283            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1284            (0xF0, None),
1285            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1286            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Down))),
1287            (0xF0, None),
1288            (0x29, Some(KeyEvent::new(KeyCode::Spacebar, KeyState::Up))),
1289        ];
1290        add_bytes(&mut k, &test_sequence);
1291    }
1292
1293    #[test]
1294    fn test_set_2_ext_down_up() {
1295        let mut k = Keyboard::new(
1296            ScancodeSet2::new(),
1297            layouts::Us104Key,
1298            HandleControl::MapLettersToUnicode,
1299        );
1300        let test_sequence = [
1301            (0xE0, None),
1302            (0x6C, Some(KeyEvent::new(KeyCode::Home, KeyState::Down))),
1303            (0xE0, None),
1304            (0xF0, None),
1305            (0x6C, Some(KeyEvent::new(KeyCode::Home, KeyState::Up))),
1306        ];
1307        add_bytes(&mut k, &test_sequence);
1308    }
1309
1310    #[test]
1311    fn test_pause_set1() {
1312        let mut k = Keyboard::new(
1313            ScancodeSet1::new(),
1314            layouts::Uk105Key,
1315            HandleControl::MapLettersToUnicode,
1316        );
1317
1318        // A Pause keypress generates this sequence all in one go. There is no
1319        // 'Break' code for this key.
1320        let test_sequence = [
1321            // rctrl2
1322            (0xE1, None),
1323            (
1324                0x1D,
1325                Some(KeyEvent {
1326                    code: KeyCode::RControl2,
1327                    state: KeyState::Down,
1328                }),
1329            ),
1330            // Numlock
1331            (
1332                0x45,
1333                Some(KeyEvent {
1334                    code: KeyCode::NumpadLock,
1335                    state: KeyState::Down,
1336                }),
1337            ),
1338            // Release rctrl2
1339            (0xE1, None),
1340            (
1341                0x9D,
1342                Some(KeyEvent {
1343                    code: KeyCode::RControl2,
1344                    state: KeyState::Up,
1345                }),
1346            ),
1347            // Release Numlock
1348            (
1349                0xC5,
1350                Some(KeyEvent {
1351                    code: KeyCode::NumpadLock,
1352                    state: KeyState::Up,
1353                }),
1354            ),
1355        ];
1356
1357        add_bytes(&mut k, &test_sequence);
1358    }
1359
1360    #[test]
1361    fn test_pause_set2() {
1362        let mut k = Keyboard::new(
1363            ScancodeSet2::new(),
1364            layouts::Uk105Key,
1365            HandleControl::MapLettersToUnicode,
1366        );
1367
1368        // A Pause keypress generates this sequence all in one go. There is no
1369        // 'Break' code for this key.
1370        let test_sequence = [
1371            // rctrl2
1372            (0xE1, None),
1373            (
1374                0x14,
1375                Some(KeyEvent {
1376                    code: KeyCode::RControl2,
1377                    state: KeyState::Down,
1378                }),
1379            ),
1380            // Numlock
1381            (
1382                0x77,
1383                Some(KeyEvent {
1384                    code: KeyCode::NumpadLock,
1385                    state: KeyState::Down,
1386                }),
1387            ),
1388            // Release rctrl2
1389            (0xE1, None),
1390            (0xF0, None),
1391            (
1392                0x14,
1393                Some(KeyEvent {
1394                    code: KeyCode::RControl2,
1395                    state: KeyState::Up,
1396                }),
1397            ),
1398            // Release Numlock
1399            (0xF0, None),
1400            (
1401                0x77,
1402                Some(KeyEvent {
1403                    code: KeyCode::NumpadLock,
1404                    state: KeyState::Up,
1405                }),
1406            ),
1407        ];
1408        add_bytes(&mut k, &test_sequence);
1409    }
1410
1411    #[test]
1412    fn test_pause_events() {
1413        let mut k = Keyboard::new(
1414            ScancodeSet2::new(),
1415            layouts::Uk105Key,
1416            HandleControl::MapLettersToUnicode,
1417        );
1418
1419        // A Pause keypress generates this sequence all in one go. There is no
1420        // 'Break' code for this key.
1421        let test_sequence = [
1422            // rctrl2
1423            (
1424                KeyEvent {
1425                    code: KeyCode::RControl2,
1426                    state: KeyState::Down,
1427                },
1428                Some(DecodedKey::RawKey(KeyCode::RControl2)),
1429            ),
1430            // Numlock
1431            (
1432                KeyEvent {
1433                    code: KeyCode::NumpadLock,
1434                    state: KeyState::Down,
1435                },
1436                Some(DecodedKey::RawKey(KeyCode::PauseBreak)),
1437            ),
1438            // Release rctrl2
1439            (
1440                KeyEvent {
1441                    code: KeyCode::RControl2,
1442                    state: KeyState::Up,
1443                },
1444                None,
1445            ),
1446            // Release Numlock
1447            (
1448                KeyEvent {
1449                    code: KeyCode::NumpadLock,
1450                    state: KeyState::Up,
1451                },
1452                None,
1453            ),
1454        ];
1455        process_keyevents(&mut k, &test_sequence);
1456    }
1457
1458    #[test]
1459    fn test_print_screen_set1() {
1460        let mut k = Keyboard::new(
1461            ScancodeSet1::new(),
1462            layouts::Uk105Key,
1463            HandleControl::MapLettersToUnicode,
1464        );
1465
1466        // A Print Screen keypress generates this sequence on make and break.
1467        let test_sequence = [
1468            // ralt2
1469            (0xE0, None),
1470            (
1471                0x2A,
1472                Some(KeyEvent {
1473                    code: KeyCode::RAlt2,
1474                    state: KeyState::Down,
1475                }),
1476            ),
1477            // Print Screen
1478            (0xE0, None),
1479            (
1480                0x37,
1481                Some(KeyEvent {
1482                    code: KeyCode::PrintScreen,
1483                    state: KeyState::Down,
1484                }),
1485            ),
1486            // Release Print Screen
1487            (0xE0, None),
1488            (
1489                0xB7,
1490                Some(KeyEvent {
1491                    code: KeyCode::PrintScreen,
1492                    state: KeyState::Up,
1493                }),
1494            ),
1495            // Release ralt2
1496            (0xE0, None),
1497            (
1498                0xAA,
1499                Some(KeyEvent {
1500                    code: KeyCode::RAlt2,
1501                    state: KeyState::Up,
1502                }),
1503            ),
1504        ];
1505        add_bytes(&mut k, &test_sequence);
1506    }
1507
1508    #[test]
1509    fn test_print_screen_set2() {
1510        let mut k = Keyboard::new(
1511            ScancodeSet2::new(),
1512            layouts::Uk105Key,
1513            HandleControl::MapLettersToUnicode,
1514        );
1515
1516        // A Print Screen keypress generates this sequence on make and break.
1517        let test_sequence = [
1518            // ralt2
1519            (0xE0, None),
1520            (
1521                0x12,
1522                Some(KeyEvent {
1523                    code: KeyCode::RAlt2,
1524                    state: KeyState::Down,
1525                }),
1526            ),
1527            // Print Screen
1528            (0xE0, None),
1529            (
1530                0x7C,
1531                Some(KeyEvent {
1532                    code: KeyCode::PrintScreen,
1533                    state: KeyState::Down,
1534                }),
1535            ),
1536            // Release Print Screen
1537            (0xE0, None),
1538            (0xF0, None),
1539            (
1540                0x7C,
1541                Some(KeyEvent {
1542                    code: KeyCode::PrintScreen,
1543                    state: KeyState::Up,
1544                }),
1545            ),
1546            // Release ralt2
1547            (0xE0, None),
1548            (0xF0, None),
1549            (
1550                0x12,
1551                Some(KeyEvent {
1552                    code: KeyCode::RAlt2,
1553                    state: KeyState::Up,
1554                }),
1555            ),
1556        ];
1557
1558        add_bytes(&mut k, &test_sequence);
1559    }
1560
1561    #[test]
1562    fn test_print_screen_events() {
1563        let mut k = Keyboard::new(
1564            ScancodeSet2::new(),
1565            layouts::Uk105Key,
1566            HandleControl::MapLettersToUnicode,
1567        );
1568
1569        // A Print Screen keypress generates this sequence on make and break.
1570        let test_sequence = [
1571            // ralt2
1572            (
1573                KeyEvent {
1574                    code: KeyCode::RAlt2,
1575                    state: KeyState::Down,
1576                },
1577                Some(DecodedKey::RawKey(KeyCode::RAlt2)),
1578            ),
1579            // Print Screen
1580            (
1581                KeyEvent {
1582                    code: KeyCode::PrintScreen,
1583                    state: KeyState::Down,
1584                },
1585                Some(DecodedKey::RawKey(KeyCode::PrintScreen)),
1586            ),
1587            // Release Print Screen
1588            (
1589                KeyEvent {
1590                    code: KeyCode::PrintScreen,
1591                    state: KeyState::Up,
1592                },
1593                None,
1594            ),
1595            // Release ralt2
1596            (
1597                KeyEvent {
1598                    code: KeyCode::RAlt2,
1599                    state: KeyState::Up,
1600                },
1601                None,
1602            ),
1603        ];
1604
1605        process_keyevents(&mut k, &test_sequence);
1606    }
1607
1608    #[test]
1609    fn test_modifier_state_shift() {
1610        let mut k = Keyboard::new(
1611            ScancodeSet2::new(),
1612            layouts::Uk105Key,
1613            HandleControl::MapLettersToUnicode,
1614        );
1615        assert!(!k.get_modifiers().lshift);
1616
1617        k.process_keyevent(KeyEvent {
1618            code: KeyCode::LShift,
1619            state: KeyState::Down,
1620        });
1621        assert!(k.get_modifiers().lshift);
1622
1623        k.process_keyevent(KeyEvent {
1624            code: KeyCode::LShift,
1625            state: KeyState::Up,
1626        });
1627        assert!(!k.get_modifiers().lshift);
1628    }
1629}
1630
1631// ****************************************************************************
1632//
1633// End Of File
1634//
1635// ****************************************************************************