From 43704e56f0b0d7be6beca470e92cd9d5298575ab Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 22 Nov 2022 12:15:53 -0700 Subject: [PATCH] ps2: Handle extended (prefixed with 0xE0) keycodes --- ps2d/src/state.rs | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/ps2d/src/state.rs b/ps2d/src/state.rs index 1e174a0e03..507de68cd3 100644 --- a/ps2d/src/state.rs +++ b/ps2d/src/state.rs @@ -28,6 +28,7 @@ pub struct Ps2d char> { input: File, width: u32, height: u32, + extended: bool, lshift: bool, rshift: bool, mouse_x: i32, @@ -57,6 +58,7 @@ impl char> Ps2d { input, width: 0, height: 0, + extended: false, lshift: false, rshift: false, mouse_x: 0, @@ -93,23 +95,32 @@ impl char> Ps2d { pub fn handle(&mut self, keyboard: bool, data: u8) { if keyboard { - let (scancode, pressed) = if data >= 0x80 { - (data - 0x80, false) + if data == 0xE0 { + self.extended = true; } else { - (data, true) - }; + let (mut scancode, pressed) = if data >= 0x80 { + (data - 0x80, false) + } else { + (data, true) + }; - if scancode == 0x2A { - self.lshift = pressed; - } else if scancode == 0x36 { - self.rshift = pressed; + if self.extended { + self.extended = false; + scancode += 0x80; + } + + if scancode == 0x2A { + self.lshift = pressed; + } else if scancode == 0x36 { + self.rshift = pressed; + } + + self.input.write(&KeyEvent { + character: (self.get_char)(scancode, self.lshift || self.rshift), + scancode: scancode, + pressed: pressed + }.to_event()).expect("ps2d: failed to write key event"); } - - self.input.write(&KeyEvent { - character: (self.get_char)(scancode, self.lshift || self.rshift), - scancode: scancode, - pressed: pressed - }.to_event()).expect("ps2d: failed to write key event"); } else if self.vmmouse { for _i in 0..256 { let (status, _, _, _, _, _) = unsafe { vm::cmd(vm::ABSPOINTER_STATUS, 0) };