4848 register : u16 ,
4949 num_bits : u8 ,
5050 decode_state : DecodeState ,
51- handle_ctrl : HandleControlPlusLetter ,
51+ handle_ctrl : HandleControl ,
5252 modifiers : Modifiers ,
5353 _layout : PhantomData < T > ,
5454 _set : PhantomData < S > ,
@@ -194,9 +194,16 @@ pub enum KeyState {
194194 Down ,
195195}
196196
197+ /// Options for how we can handle what happens when the Ctrl key is held down
198+ /// and a letter is pressed.
197199#[ derive( Debug , PartialEq , Eq , Copy , Clone ) ]
198- pub enum HandleControlPlusLetter {
199- MapToUnicode ,
200+ pub enum HandleControl {
201+ /// If either Ctrl key is held down, convert the letters A through Z into
202+ /// Unicode chars U+0001 through U+001A. If the Ctrl keys are not held
203+ /// down, letters go through normally.
204+ MapLettersToUnicode ,
205+ /// Don't do anything special - send through the Ctrl key up/down events,
206+ /// and leave the letters as letters.
200207 Ignore ,
201208}
202209
@@ -208,9 +215,13 @@ pub struct KeyEvent {
208215
209216pub trait KeyboardLayout {
210217 /// Convert a `KeyCode` enum to a Unicode character, if possible.
211- /// KeyCode::A maps to `Some('a')` (or `Some('A')` if shifted), while
212- /// KeyCode::AltLeft returns `None`
213- fn map_keycode ( keycode : KeyCode , modifiers : & Modifiers , handle_ctrl : HandleControlPlusLetter ) -> DecodedKey ;
218+ /// `KeyCode::A` maps to `Some('a')` (or `Some('A')` if shifted), while
219+ /// `KeyCode::AltLeft` returns `None`
220+ fn map_keycode (
221+ keycode : KeyCode ,
222+ modifiers : & Modifiers ,
223+ handle_ctrl : HandleControl ,
224+ ) -> DecodedKey ;
214225}
215226
216227pub trait ScancodeSet {
@@ -286,7 +297,7 @@ where
286297 S : ScancodeSet ,
287298{
288299 /// Make a new Keyboard object with the given layout.
289- pub fn new ( _layout : T , _set : S , handle_ctrl : HandleControlPlusLetter ) -> Keyboard < T , S > {
300+ pub fn new ( _layout : T , _set : S , handle_ctrl : HandleControl ) -> Keyboard < T , S > {
290301 Keyboard {
291302 register : 0 ,
292303 num_bits : 0 ,
@@ -306,6 +317,16 @@ where
306317 }
307318 }
308319
320+ /// Change the Ctrl key mapping.
321+ pub fn set_ctrl_handling ( & mut self , new_value : HandleControl ) {
322+ self . handle_ctrl = new_value;
323+ }
324+
325+ /// Get the current Ctrl key mapping.
326+ pub fn get_ctrl_handling ( & self ) -> HandleControl {
327+ self . handle_ctrl
328+ }
329+
309330 /// Clears the bit register.
310331 ///
311332 /// Call this when there is a timeout reading data from the keyboard.
@@ -527,7 +548,11 @@ mod test {
527548
528549 #[ test]
529550 fn test_f9 ( ) {
530- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
551+ let mut k = Keyboard :: new (
552+ layouts:: Us104Key ,
553+ ScancodeSet2 ,
554+ HandleControl :: MapLettersToUnicode ,
555+ ) ;
531556 // start
532557 assert_eq ! ( k. add_bit( false ) , Ok ( None ) ) ;
533558 // 8 data bits (LSB first)
@@ -550,7 +575,11 @@ mod test {
550575
551576 #[ test]
552577 fn test_f9_word ( ) {
553- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
578+ let mut k = Keyboard :: new (
579+ layouts:: Us104Key ,
580+ ScancodeSet2 ,
581+ HandleControl :: MapLettersToUnicode ,
582+ ) ;
554583 assert_eq ! (
555584 k. add_word( 0x0402 ) ,
556585 Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -559,7 +588,11 @@ mod test {
559588
560589 #[ test]
561590 fn test_f9_byte ( ) {
562- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
591+ let mut k = Keyboard :: new (
592+ layouts:: Us104Key ,
593+ ScancodeSet2 ,
594+ HandleControl :: MapLettersToUnicode ,
595+ ) ;
563596 assert_eq ! (
564597 k. add_byte( 0x01 ) ,
565598 Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -568,7 +601,11 @@ mod test {
568601
569602 #[ test]
570603 fn test_keyup_keydown ( ) {
571- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
604+ let mut k = Keyboard :: new (
605+ layouts:: Us104Key ,
606+ ScancodeSet2 ,
607+ HandleControl :: MapLettersToUnicode ,
608+ ) ;
572609 assert_eq ! (
573610 k. add_byte( 0x01 ) ,
574611 Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -586,7 +623,11 @@ mod test {
586623
587624 #[ test]
588625 fn test_f5 ( ) {
589- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
626+ let mut k = Keyboard :: new (
627+ layouts:: Us104Key ,
628+ ScancodeSet2 ,
629+ HandleControl :: MapLettersToUnicode ,
630+ ) ;
590631 // start
591632 assert_eq ! ( k. add_bit( false ) , Ok ( None ) ) ;
592633 // 8 data bits (LSB first)
@@ -609,7 +650,11 @@ mod test {
609650
610651 #[ test]
611652 fn test_f5_up ( ) {
612- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
653+ let mut k = Keyboard :: new (
654+ layouts:: Us104Key ,
655+ ScancodeSet2 ,
656+ HandleControl :: MapLettersToUnicode ,
657+ ) ;
613658 // Send F0
614659
615660 // start
@@ -652,7 +697,11 @@ mod test {
652697
653698 #[ test]
654699 fn test_shift ( ) {
655- let mut k = Keyboard :: new ( layouts:: Uk105Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
700+ let mut k = Keyboard :: new (
701+ layouts:: Uk105Key ,
702+ ScancodeSet2 ,
703+ HandleControl :: MapLettersToUnicode ,
704+ ) ;
656705 // A with left shift held
657706 assert_eq ! (
658707 k. process_keyevent( KeyEvent :: new( KeyCode :: ShiftLeft , KeyState :: Down ) ) ,
@@ -736,11 +785,86 @@ mod test {
736785 k. process_keyevent( KeyEvent :: new( KeyCode :: ShiftRight , KeyState :: Up ) ) ,
737786 None
738787 ) ;
788+
789+ // Numbers are not shifted
790+ assert_eq ! (
791+ k. process_keyevent( KeyEvent :: new( KeyCode :: Key1 , KeyState :: Down ) ) ,
792+ Some ( DecodedKey :: Unicode ( '1' ) )
793+ ) ;
794+ assert_eq ! (
795+ k. process_keyevent( KeyEvent :: new( KeyCode :: Key1 , KeyState :: Up ) ) ,
796+ None
797+ ) ;
798+ }
799+
800+ #[ test]
801+ fn test_ctrl ( ) {
802+ let mut k = Keyboard :: new (
803+ layouts:: Us104Key ,
804+ ScancodeSet2 ,
805+ HandleControl :: MapLettersToUnicode ,
806+ ) ;
807+ // Normal
808+ assert_eq ! (
809+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) ,
810+ Some ( DecodedKey :: Unicode ( 'a' ) )
811+ ) ;
812+ assert_eq ! (
813+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Up ) ) ,
814+ None
815+ ) ;
816+ // Left Control
817+ assert_eq ! (
818+ k. process_keyevent( KeyEvent :: new( KeyCode :: ControlLeft , KeyState :: Down ) ) ,
819+ None
820+ ) ;
821+ assert_eq ! (
822+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) ,
823+ Some ( DecodedKey :: Unicode ( '\u{0001}' ) )
824+ ) ;
825+ assert_eq ! (
826+ k. process_keyevent( KeyEvent :: new( KeyCode :: ControlLeft , KeyState :: Up ) ) ,
827+ None
828+ ) ;
829+ assert_eq ! (
830+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Up ) ) ,
831+ None
832+ ) ;
833+ // Normal
834+ assert_eq ! (
835+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) ,
836+ Some ( DecodedKey :: Unicode ( 'a' ) )
837+ ) ;
838+ assert_eq ! (
839+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Up ) ) ,
840+ None
841+ ) ;
842+ // Right Control
843+ assert_eq ! (
844+ k. process_keyevent( KeyEvent :: new( KeyCode :: ControlRight , KeyState :: Down ) ) ,
845+ None
846+ ) ;
847+ assert_eq ! (
848+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) ,
849+ Some ( DecodedKey :: Unicode ( '\u{0001}' ) )
850+ ) ;
851+ assert_eq ! (
852+ k. process_keyevent( KeyEvent :: new( KeyCode :: ControlRight , KeyState :: Up ) ) ,
853+ None
854+ ) ;
855+ assert_eq ! (
856+ k. process_keyevent( KeyEvent :: new( KeyCode :: A , KeyState :: Up ) ) ,
857+ None
858+ ) ;
739859 }
740860
741861 #[ test]
742862 fn test_numlock ( ) {
743- let mut k = Keyboard :: new ( layouts:: Uk105Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
863+ let mut k = Keyboard :: new (
864+ layouts:: Uk105Key ,
865+ ScancodeSet2 ,
866+ HandleControl :: MapLettersToUnicode ,
867+ ) ;
744868
745869 // Numlock ON by default
746870 assert_eq ! (
@@ -806,7 +930,11 @@ mod test {
806930
807931 #[ test]
808932 fn test_set_1_down_up_down ( ) {
809- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet1 , HandleControlPlusLetter :: MapToUnicode ) ;
933+ let mut k = Keyboard :: new (
934+ layouts:: Us104Key ,
935+ ScancodeSet1 ,
936+ HandleControl :: MapLettersToUnicode ,
937+ ) ;
810938 assert_eq ! (
811939 k. add_byte( 0x1e ) ,
812940 Ok ( Some ( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) )
@@ -823,7 +951,11 @@ mod test {
823951
824952 #[ test]
825953 fn test_set_1_ext_down_up_down ( ) {
826- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet1 , HandleControlPlusLetter :: MapToUnicode ) ;
954+ let mut k = Keyboard :: new (
955+ layouts:: Us104Key ,
956+ ScancodeSet1 ,
957+ HandleControl :: MapLettersToUnicode ,
958+ ) ;
827959 assert_eq ! ( k. add_byte( 0xe0 ) , Ok ( None ) ) ;
828960 assert_eq ! (
829961 k. add_byte( 0x1c ) ,
@@ -838,7 +970,11 @@ mod test {
838970
839971 #[ test]
840972 fn test_set_2_down_up ( ) {
841- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
973+ let mut k = Keyboard :: new (
974+ layouts:: Us104Key ,
975+ ScancodeSet2 ,
976+ HandleControl :: MapLettersToUnicode ,
977+ ) ;
842978 assert_eq ! (
843979 k. add_byte( 0x29 ) ,
844980 Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Down ) ) )
@@ -870,7 +1006,11 @@ mod test {
8701006
8711007 #[ test]
8721008 fn test_set_2_ext_down_up ( ) {
873- let mut k = Keyboard :: new ( layouts:: Us104Key , ScancodeSet2 , HandleControlPlusLetter :: MapToUnicode ) ;
1009+ let mut k = Keyboard :: new (
1010+ layouts:: Us104Key ,
1011+ ScancodeSet2 ,
1012+ HandleControl :: MapLettersToUnicode ,
1013+ ) ;
8741014 assert_eq ! ( k. add_byte( 0xE0 ) , Ok ( None ) ) ;
8751015 assert_eq ! (
8761016 k. add_byte( 0x6C ) ,
0 commit comments