From a1fc824fcc3bd4c2e267d8c0e9e3866fc7310bba Mon Sep 17 00:00:00 2001 From: LoGin Date: Tue, 6 Aug 2024 19:51:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E9=94=AE=E7=9B=98?= =?UTF-8?q?=E7=A0=81=E8=A7=A3=E6=9E=90=E5=99=A8=E6=B2=A1=E8=83=BD=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E5=A4=84=E7=90=86=E7=B1=BB=E4=BC=BCctrl=20C=E7=9A=84?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=AD=97=E7=AC=A6=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#877)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复键盘码解析器没能正确处理类似ctrl C的控制字符的问题 * fix: 解决ntty潜在的panic问题 --- kernel/src/driver/tty/tty_ldisc/ntty.rs | 4 ++-- kernel/src/libs/keyboard_parser.rs | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/kernel/src/driver/tty/tty_ldisc/ntty.rs b/kernel/src/driver/tty/tty_ldisc/ntty.rs index e5b63422..4f295806 100644 --- a/kernel/src/driver/tty/tty_ldisc/ntty.rs +++ b/kernel/src/driver/tty/tty_ldisc/ntty.rs @@ -388,9 +388,9 @@ impl NTtyData { continue; } - if self.char_map.get(c as usize).unwrap() { + if ((c as usize) < self.char_map.size()) && self.char_map.get(c as usize).unwrap() { // 特殊字符 - self.receive_special_char(c, tty.clone(), lookahead_done) + self.receive_special_char(c, tty.clone(), lookahead_done); } else { self.receive_char(c, tty.clone()); } diff --git a/kernel/src/libs/keyboard_parser.rs b/kernel/src/libs/keyboard_parser.rs index 4cbe3e00..2cfe57b3 100644 --- a/kernel/src/libs/keyboard_parser.rs +++ b/kernel/src/libs/keyboard_parser.rs @@ -313,7 +313,8 @@ impl TypeOneFSMState { } // shift被按下 - if scancode_status.shift_l || scancode_status.shift_r { + let shift = scancode_status.shift_l || scancode_status.shift_r; + if shift { col = true; } @@ -327,9 +328,8 @@ impl TypeOneFSMState { let mut ch = TYPE1_KEY_CODE_MAPTABLE[col as usize + 2 * index as usize]; if key != KeyFlag::NoneFlag { - // debug!("EMIT: ch is '{}', keyflag is {:?}\n", ch as char, key); if scancode_status.ctrl_l || scancode_status.ctrl_r { - ch = Self::to_ctrl(ch); + ch = Self::to_ctrl(ch, shift); } Self::emit(ch); } @@ -337,10 +337,16 @@ impl TypeOneFSMState { } #[inline] - fn to_ctrl(ch: u8) -> u8 { + fn to_ctrl(ch: u8, shift: bool) -> u8 { return match ch as char { - 'a'..='z' => ch - 0x40, - 'A'..='Z' => ch - 0x40, + 'a'..='z' => ch - 0x60, + 'A'..='Z' => { + if shift { + ch + } else { + ch - 0x40 + } + } '@'..='_' => ch - 0x40, _ => ch, };