Skip to content

Commit 3eeb0c6

Browse files
committed
More docs and tests.
1 parent 3716846 commit 3eeb0c6

File tree

3 files changed

+173
-25
lines changed

3 files changed

+173
-25
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ output directly).
1515
```rust
1616
extern crate pc_keyboard;
1717

18-
use pc_keyboard::{Keyboard, layouts, ScancodeSet2};
18+
use pc_keyboard::{Keyboard, layouts, ScancodeSet2, HandleControlPlusLetter};
1919

2020
fn main() {
21-
let mut kb = pc_keyboard::Keyboard::new(layouts::Us104Key, ScancodeSet2);
21+
let mut kb = pc_keyboard::Keyboard::new(layouts::Us104Key, ScancodeSet2, HandleControlPlusLetter::MapToUnicode);
2222
match kb.add_byte(0x20) {
2323
Ok(Some(event)) => {
2424
println!("Event {:?}", event);

src/layouts.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::{DecodedKey, KeyCode, KeyboardLayout, Modifiers, HandleControlPlusLetter};
1+
use super::{DecodedKey, HandleControl, KeyCode, KeyboardLayout, Modifiers};
22

33
/// A standard United States 101-key (or 104-key including Windows keys) keyboard.
44
/// Has a 1-row high Enter key, with Backslash above.
@@ -9,8 +9,12 @@ pub struct Us104Key;
99
pub struct Uk105Key;
1010

1111
impl KeyboardLayout for Us104Key {
12-
fn map_keycode(keycode: KeyCode, modifiers: &Modifiers, handle_ctrl: HandleControlPlusLetter) -> DecodedKey {
13-
let map_to_unicode = handle_ctrl == HandleControlPlusLetter::MapToUnicode;
12+
fn map_keycode(
13+
keycode: KeyCode,
14+
modifiers: &Modifiers,
15+
handle_ctrl: HandleControl,
16+
) -> DecodedKey {
17+
let map_to_unicode = handle_ctrl == HandleControl::MapLettersToUnicode;
1418
match keycode {
1519
KeyCode::BackTick => {
1620
if modifiers.is_shifted() {
@@ -482,7 +486,11 @@ impl KeyboardLayout for Us104Key {
482486
}
483487

484488
impl KeyboardLayout for Uk105Key {
485-
fn map_keycode(keycode: KeyCode, modifiers: &Modifiers, handle_ctrl: HandleControlPlusLetter) -> DecodedKey {
489+
fn map_keycode(
490+
keycode: KeyCode,
491+
modifiers: &Modifiers,
492+
handle_ctrl: HandleControl,
493+
) -> DecodedKey {
486494
match keycode {
487495
KeyCode::BackTick => {
488496
if modifiers.alt_gr {

src/lib.rs

+159-19
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ where
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

209216
pub 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

216227
pub 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

Comments
 (0)