Patch keyboard capslock alt (#219)

* keyboard-alt-capslock

* 解决键盘输入'%'字符的时候无法回显的bug

---------

Co-authored-by: longjin <longjin@RinGoTek.cn>
This commit is contained in:
Gou Ngai
2023-03-31 18:23:58 +08:00
committed by GitHub
parent 20e3152e1e
commit d7b31a969f
3 changed files with 76 additions and 37 deletions

View File

@ -5,7 +5,7 @@ use thingbuf::mpsc::{
errors::{TryRecvError, TrySendError}, errors::{TryRecvError, TrySendError},
}; };
use crate::{libs::rwlock::RwLock, kdebug}; use crate::libs::rwlock::RwLock;
pub mod tty_device; pub mod tty_device;

View File

@ -9,10 +9,9 @@ use crate::{
devfs::{devfs_register, DevFS, DeviceINode}, devfs::{devfs_register, DevFS, DeviceINode},
vfs::{file::FileMode, FilePrivateData, FileType, IndexNode, Metadata, ROOT_INODE}, vfs::{file::FileMode, FilePrivateData, FileType, IndexNode, Metadata, ROOT_INODE},
}, },
include::bindings::bindings::{printk_color, textui_putchar, BLACK, WHITE}, include::bindings::bindings::{textui_putchar, BLACK, WHITE},
kdebug, kerror, kerror,
libs::rwlock::RwLock, libs::rwlock::RwLock,
print,
syscall::SystemError, syscall::SystemError,
}; };
@ -240,7 +239,7 @@ impl IndexNode for TtyDevice {
loop { loop {
let mut buf = [0u8; 512]; let mut buf = [0u8; 512];
let r: Result<usize, TtyError> = self.core.read_output(&mut buf[0..511], false); let r: Result<usize, TtyError> = self.core.output(&mut buf[0..511], false);
let len; let len;
match r { match r {
Ok(x) => { Ok(x) => {
@ -256,9 +255,11 @@ impl IndexNode for TtyDevice {
break; break;
} }
// 输出到屏幕 // 输出到屏幕
print!("{}", unsafe { unsafe {
core::str::from_utf8_unchecked(&buf[0..len]) for x in buf {
}); textui_putchar(x as u16, WHITE, BLACK);
}
}
} }
return Ok(()); return Ok(());
} }

View File

@ -296,21 +296,15 @@ impl TypeOneFSMState {
) -> TypeOneFSMState { ) -> TypeOneFSMState {
// 判断按键是被按下还是抬起 // 判断按键是被按下还是抬起
let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK as u8)) > 0 { let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK as u8)) > 0 {
false false //up
} else { } else {
true true //down
}; };
// 计算扫描码位于码表的第几行 // 计算扫描码位于码表的第几行
let mut col: usize = 0; let mut col: bool = false;
let index = scancode & 0x7f; let index = scancode & 0x7f;
// shift被按下
if scancode_status.shift_l || scancode_status.shift_r {
col = 1;
}
let ch = TYPE1_KEY_CODE_MAPTABLE[col + 2 * index as usize];
//kdebug!("in type3 ch is {:#x}\n",ch); //kdebug!("in type3 ch is {:#x}\n",ch);
let mut key = KeyFlag::OtherKey; // 可视字符 let mut key = KeyFlag::OtherKey; // 可视字符
@ -328,7 +322,17 @@ impl TypeOneFSMState {
key = KeyFlag::NoneFlag; key = KeyFlag::NoneFlag;
} }
0x38 => { 0x38 => {
scancode_status.ctrl_r = flag_make; scancode_status.alt_r = flag_make;
key = KeyFlag::NoneFlag;
}
0x3A => {
if scancode_status.caps_lock {
scancode_status.caps_lock = !flag_make;
}
//if caps_lock: true, flag_make: true => cap_lock: false
else {
scancode_status.caps_lock = flag_make;
} //else false => cap_lock: true
key = KeyFlag::NoneFlag; key = KeyFlag::NoneFlag;
} }
_ => { _ => {
@ -339,6 +343,23 @@ impl TypeOneFSMState {
} }
} }
// shift被按下
if scancode_status.shift_l || scancode_status.shift_r {
col = true;
}
if scancode_status.caps_lock {
if index >= 0x10 && index <= 0x19 {
col = !col;
} else if index >= 0x1e && index <= 0x26 {
col = !col;
} else if index >= 0x2c && index <= 0x32 {
col = !col;
}
}
let ch = TYPE1_KEY_CODE_MAPTABLE[col as usize + 2 * index as usize];
if key != KeyFlag::NoneFlag { if key != KeyFlag::NoneFlag {
Self::emit(tty, ch); Self::emit(tty, ch);
} }
@ -411,6 +432,7 @@ impl TypeOneFSMState {
/// 按键状态 /// 按键状态
#[derive(Debug)] #[derive(Debug)]
#[allow(dead_code)]
pub struct ScanCodeStatus { pub struct ScanCodeStatus {
// Shift 按键 // Shift 按键
shift_l: bool, shift_l: bool,
@ -441,6 +463,7 @@ pub struct ScanCodeStatus {
kp_forward_slash: bool, kp_forward_slash: bool,
// 回车 // 回车
kp_enter: bool, kp_enter: bool,
caps_lock: bool,
} }
impl ScanCodeStatus { impl ScanCodeStatus {
@ -467,6 +490,7 @@ impl ScanCodeStatus {
arrow_r: false, arrow_r: false,
kp_forward_slash: false, kp_forward_slash: false,
kp_enter: false, kp_enter: false,
caps_lock: false,
} }
} }
} }
@ -481,27 +505,41 @@ const TYPE1_KEY_CODE_MAPTABLE: [u8; 256] = [
/*0x0c*/ '-' as u8, '_' as u8, /*0x0d*/ '=' as u8, '+' as u8, /*0x0c*/ '-' as u8, '_' as u8, /*0x0d*/ '=' as u8, '+' as u8,
/*0x0e \b */ 8 as u8, 8 as u8, // BACKSPACE /*0x0e \b */ 8 as u8, 8 as u8, // BACKSPACE
/*0x0f*/ '\t' as u8, '\t' as u8, // TAB /*0x0f*/ '\t' as u8, '\t' as u8, // TAB
/*0x10*/ 'q' as u8, 'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8, ////////////////////////character///////////////////////////
/*0x12*/ 'e' as u8, 'E' as u8, /*0x13*/ 'r' as u8, 'R' as u8, /*0x10*/ 'q' as u8,
/*0x14*/ 't' as u8, 'T' as u8, /*0x15*/ 'y' as u8, 'Y' as u8, 'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8, /*0x12*/ 'e' as u8, 'E' as u8,
/*0x16*/ 'u' as u8, 'U' as u8, /*0x17*/ 'i' as u8, 'I' as u8, /*0x13*/ 'r' as u8, 'R' as u8, /*0x14*/ 't' as u8, 'T' as u8,
/*0x18*/ 'o' as u8, 'O' as u8, /*0x19*/ 'p' as u8, 'P' as u8, /*0x15*/ 'y' as u8, 'Y' as u8, /*0x16*/ 'u' as u8, 'U' as u8,
/*0x1a*/ '[' as u8, '{' as u8, /*0x1b*/ ']' as u8, '}' as u8, /*0x17*/ 'i' as u8, 'I' as u8, /*0x18*/ 'o' as u8, 'O' as u8,
/*0x1c*/ '\n' as u8, '\n' as u8, // ENTER /*0x19*/ 'p' as u8, 'P' as u8,
////////////////////////character///////////////////////////
/*0x1a*/ '[' as u8,
'{' as u8, /*0x1b*/ ']' as u8, '}' as u8, /*0x1c*/ '\n' as u8,
'\n' as u8, // ENTER
/*0x1d*/ 0x1d, 0x1d, // CTRL Left /*0x1d*/ 0x1d, 0x1d, // CTRL Left
/*0x1e*/ 'a' as u8, 'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8, ////////////////////////character///////////////////////////
/*0x20*/ 'd' as u8, 'D' as u8, /*0x21*/ 'f' as u8, 'F' as u8, /*0x1e*/ 'a' as u8,
/*0x22*/ 'g' as u8, 'G' as u8, /*0x23*/ 'h' as u8, 'H' as u8, 'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8, /*0x20*/ 'd' as u8, 'D' as u8,
/*0x24*/ 'j' as u8, 'J' as u8, /*0x25*/ 'k' as u8, 'K' as u8, /*0x21*/ 'f' as u8, 'F' as u8, /*0x22*/ 'g' as u8, 'G' as u8,
/*0x26*/ 'l' as u8, 'L' as u8, /*0x27*/ ';' as u8, ':' as u8, /*0x23*/ 'h' as u8, 'H' as u8, /*0x24*/ 'j' as u8, 'J' as u8,
/*0x28*/ '\'' as u8, '"' as u8, /*0x29*/ '`' as u8, '~' as u8, /*0x2a*/ 0x2a, /*0x25*/ 'k' as u8, 'K' as u8, /*0x26*/ 'l' as u8, 'L' as u8,
0x2a, // SHIFT Left ////////////////////////character///////////////////////////
/*0x2b*/ '\\' as u8, '|' as u8, /*0x2c*/ 'z' as u8, 'Z' as u8,
/*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8, /*0x27*/ ';' as u8,
':' as u8, /*0x28*/ '\'' as u8, '"' as u8, /*0x29*/ '`' as u8, '~' as u8,
/*0x2a*/ 0x2a, 0x2a, // SHIFT Left
/*0x2b*/ '\\' as u8, '|' as u8,
////////////////////////character///////////////////////////
/*0x2c*/ 'z' as u8,
'Z' as u8, /*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8,
/*0x2f*/ 'v' as u8, 'V' as u8, /*0x30*/ 'b' as u8, 'B' as u8, /*0x2f*/ 'v' as u8, 'V' as u8, /*0x30*/ 'b' as u8, 'B' as u8,
/*0x31*/ 'n' as u8, 'N' as u8, /*0x32*/ 'm' as u8, 'M' as u8, /*0x31*/ 'n' as u8, 'N' as u8, /*0x32*/ 'm' as u8, 'M' as u8,
/*0x33*/ ',' as u8, '<' as u8, /*0x34*/ '.' as u8, '>' as u8, ////////////////////////character///////////////////////////
/*0x35*/ '/' as u8, '?' as u8, /*0x36*/ 0x36, 0x36, // SHIFT Right
/*0x33*/ ',' as u8,
'<' as u8, /*0x34*/ '.' as u8, '>' as u8, /*0x35*/ '/' as u8, '?' as u8,
/*0x36*/ 0x36, 0x36, // SHIFT Right
/*0x37*/ '*' as u8, '*' as u8, /*0x38*/ 0x38, 0x38, // ALT Left /*0x37*/ '*' as u8, '*' as u8, /*0x38*/ 0x38, 0x38, // ALT Left
/*0x39*/ ' ' as u8, ' ' as u8, /*0x3a*/ 0, 0, // CAPS LOCK /*0x39*/ ' ' as u8, ' ' as u8, /*0x3a*/ 0, 0, // CAPS LOCK
/*0x3b*/ 0, 0, // F1 /*0x3b*/ 0, 0, // F1