48
48
register : u16 ,
49
49
num_bits : u8 ,
50
50
decode_state : DecodeState ,
51
- handle_ctrl : HandleControlPlusLetter ,
51
+ handle_ctrl : HandleControl ,
52
52
modifiers : Modifiers ,
53
53
_layout : PhantomData < T > ,
54
54
_set : PhantomData < S > ,
@@ -194,9 +194,16 @@ pub enum KeyState {
194
194
Down ,
195
195
}
196
196
197
+ /// Options for how we can handle what happens when the Ctrl key is held down
198
+ /// and a letter is pressed.
197
199
#[ 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.
200
207
Ignore ,
201
208
}
202
209
@@ -208,9 +215,13 @@ pub struct KeyEvent {
208
215
209
216
pub trait KeyboardLayout {
210
217
/// 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 ;
214
225
}
215
226
216
227
pub trait ScancodeSet {
@@ -286,7 +297,7 @@ where
286
297
S : ScancodeSet ,
287
298
{
288
299
/// 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 > {
290
301
Keyboard {
291
302
register : 0 ,
292
303
num_bits : 0 ,
@@ -306,6 +317,16 @@ where
306
317
}
307
318
}
308
319
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
+
309
330
/// Clears the bit register.
310
331
///
311
332
/// Call this when there is a timeout reading data from the keyboard.
@@ -527,7 +548,11 @@ mod test {
527
548
528
549
#[ test]
529
550
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
+ ) ;
531
556
// start
532
557
assert_eq ! ( k. add_bit( false ) , Ok ( None ) ) ;
533
558
// 8 data bits (LSB first)
@@ -550,7 +575,11 @@ mod test {
550
575
551
576
#[ test]
552
577
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
+ ) ;
554
583
assert_eq ! (
555
584
k. add_word( 0x0402 ) ,
556
585
Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -559,7 +588,11 @@ mod test {
559
588
560
589
#[ test]
561
590
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
+ ) ;
563
596
assert_eq ! (
564
597
k. add_byte( 0x01 ) ,
565
598
Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -568,7 +601,11 @@ mod test {
568
601
569
602
#[ test]
570
603
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
+ ) ;
572
609
assert_eq ! (
573
610
k. add_byte( 0x01 ) ,
574
611
Ok ( Some ( KeyEvent :: new( KeyCode :: F9 , KeyState :: Down ) ) )
@@ -586,7 +623,11 @@ mod test {
586
623
587
624
#[ test]
588
625
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
+ ) ;
590
631
// start
591
632
assert_eq ! ( k. add_bit( false ) , Ok ( None ) ) ;
592
633
// 8 data bits (LSB first)
@@ -609,7 +650,11 @@ mod test {
609
650
610
651
#[ test]
611
652
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
+ ) ;
613
658
// Send F0
614
659
615
660
// start
@@ -652,7 +697,11 @@ mod test {
652
697
653
698
#[ test]
654
699
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
+ ) ;
656
705
// A with left shift held
657
706
assert_eq ! (
658
707
k. process_keyevent( KeyEvent :: new( KeyCode :: ShiftLeft , KeyState :: Down ) ) ,
@@ -736,11 +785,86 @@ mod test {
736
785
k. process_keyevent( KeyEvent :: new( KeyCode :: ShiftRight , KeyState :: Up ) ) ,
737
786
None
738
787
) ;
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
+ ) ;
739
859
}
740
860
741
861
#[ test]
742
862
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
+ ) ;
744
868
745
869
// Numlock ON by default
746
870
assert_eq ! (
@@ -806,7 +930,11 @@ mod test {
806
930
807
931
#[ test]
808
932
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
+ ) ;
810
938
assert_eq ! (
811
939
k. add_byte( 0x1e ) ,
812
940
Ok ( Some ( KeyEvent :: new( KeyCode :: A , KeyState :: Down ) ) )
@@ -823,7 +951,11 @@ mod test {
823
951
824
952
#[ test]
825
953
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
+ ) ;
827
959
assert_eq ! ( k. add_byte( 0xe0 ) , Ok ( None ) ) ;
828
960
assert_eq ! (
829
961
k. add_byte( 0x1c ) ,
@@ -838,7 +970,11 @@ mod test {
838
970
839
971
#[ test]
840
972
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
+ ) ;
842
978
assert_eq ! (
843
979
k. add_byte( 0x29 ) ,
844
980
Ok ( Some ( KeyEvent :: new( KeyCode :: Spacebar , KeyState :: Down ) ) )
@@ -870,7 +1006,11 @@ mod test {
870
1006
871
1007
#[ test]
872
1008
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
+ ) ;
874
1014
assert_eq ! ( k. add_byte( 0xE0 ) , Ok ( None ) ) ;
875
1015
assert_eq ! (
876
1016
k. add_byte( 0x6C ) ,
0 commit comments