mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 12:16:31 +00:00
Patch keyboard capslock alt (#219)
* keyboard-alt-capslock * 解决键盘输入'%'字符的时候无法回显的bug --------- Co-authored-by: longjin <longjin@RinGoTek.cn>
This commit is contained in:
@ -5,7 +5,7 @@ use thingbuf::mpsc::{
|
||||
errors::{TryRecvError, TrySendError},
|
||||
};
|
||||
|
||||
use crate::{libs::rwlock::RwLock, kdebug};
|
||||
use crate::libs::rwlock::RwLock;
|
||||
|
||||
pub mod tty_device;
|
||||
|
||||
@ -286,7 +286,7 @@ impl TtyCore {
|
||||
pub fn disable_echo(&self) {
|
||||
self.state.write().set(TtyCoreState::ECHO_ON, false);
|
||||
}
|
||||
|
||||
|
||||
/// @brief 判断当前tty核心,是否开启了输入回显
|
||||
///
|
||||
/// @return true 开启了输入回显
|
||||
|
@ -9,10 +9,9 @@ use crate::{
|
||||
devfs::{devfs_register, DevFS, DeviceINode},
|
||||
vfs::{file::FileMode, FilePrivateData, FileType, IndexNode, Metadata, ROOT_INODE},
|
||||
},
|
||||
include::bindings::bindings::{printk_color, textui_putchar, BLACK, WHITE},
|
||||
kdebug, kerror,
|
||||
include::bindings::bindings::{textui_putchar, BLACK, WHITE},
|
||||
kerror,
|
||||
libs::rwlock::RwLock,
|
||||
print,
|
||||
syscall::SystemError,
|
||||
};
|
||||
|
||||
@ -240,7 +239,7 @@ impl IndexNode for TtyDevice {
|
||||
|
||||
loop {
|
||||
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;
|
||||
match r {
|
||||
Ok(x) => {
|
||||
@ -256,9 +255,11 @@ impl IndexNode for TtyDevice {
|
||||
break;
|
||||
}
|
||||
// 输出到屏幕
|
||||
print!("{}", unsafe {
|
||||
core::str::from_utf8_unchecked(&buf[0..len])
|
||||
});
|
||||
unsafe {
|
||||
for x in buf {
|
||||
textui_putchar(x as u16, WHITE, BLACK);
|
||||
}
|
||||
}
|
||||
}
|
||||
return Ok(());
|
||||
}
|
||||
|
@ -296,21 +296,15 @@ impl TypeOneFSMState {
|
||||
) -> TypeOneFSMState {
|
||||
// 判断按键是被按下还是抬起
|
||||
let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK as u8)) > 0 {
|
||||
false
|
||||
false //up
|
||||
} else {
|
||||
true
|
||||
true //down
|
||||
};
|
||||
|
||||
// 计算扫描码位于码表的第几行
|
||||
let mut col: usize = 0;
|
||||
let mut col: bool = false;
|
||||
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);
|
||||
let mut key = KeyFlag::OtherKey; // 可视字符
|
||||
|
||||
@ -328,7 +322,17 @@ impl TypeOneFSMState {
|
||||
key = KeyFlag::NoneFlag;
|
||||
}
|
||||
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;
|
||||
}
|
||||
_ => {
|
||||
@ -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 {
|
||||
Self::emit(tty, ch);
|
||||
}
|
||||
@ -411,6 +432,7 @@ impl TypeOneFSMState {
|
||||
|
||||
/// 按键状态
|
||||
#[derive(Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct ScanCodeStatus {
|
||||
// Shift 按键
|
||||
shift_l: bool,
|
||||
@ -441,6 +463,7 @@ pub struct ScanCodeStatus {
|
||||
kp_forward_slash: bool,
|
||||
// 回车
|
||||
kp_enter: bool,
|
||||
caps_lock: bool,
|
||||
}
|
||||
|
||||
impl ScanCodeStatus {
|
||||
@ -467,6 +490,7 @@ impl ScanCodeStatus {
|
||||
arrow_r: false,
|
||||
kp_forward_slash: 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,
|
||||
/*0x0e \b */ 8 as u8, 8 as u8, // BACKSPACE
|
||||
/*0x0f*/ '\t' as u8, '\t' as u8, // TAB
|
||||
/*0x10*/ 'q' as u8, 'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8,
|
||||
/*0x12*/ 'e' as u8, 'E' as u8, /*0x13*/ 'r' as u8, 'R' as u8,
|
||||
/*0x14*/ 't' as u8, 'T' as u8, /*0x15*/ 'y' as u8, 'Y' as u8,
|
||||
/*0x16*/ 'u' as u8, 'U' as u8, /*0x17*/ 'i' as u8, 'I' as u8,
|
||||
/*0x18*/ 'o' as u8, 'O' as u8, /*0x19*/ 'p' as u8, 'P' as u8,
|
||||
/*0x1a*/ '[' as u8, '{' as u8, /*0x1b*/ ']' as u8, '}' as u8,
|
||||
/*0x1c*/ '\n' as u8, '\n' as u8, // ENTER
|
||||
////////////////////////character///////////////////////////
|
||||
/*0x10*/ 'q' as u8,
|
||||
'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8, /*0x12*/ 'e' as u8, 'E' as u8,
|
||||
/*0x13*/ 'r' as u8, 'R' as u8, /*0x14*/ 't' as u8, 'T' as u8,
|
||||
/*0x15*/ 'y' as u8, 'Y' as u8, /*0x16*/ 'u' as u8, 'U' as u8,
|
||||
/*0x17*/ 'i' as u8, 'I' as u8, /*0x18*/ 'o' as u8, 'O' as u8,
|
||||
/*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
|
||||
/*0x1e*/ 'a' as u8, 'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8,
|
||||
/*0x20*/ 'd' as u8, 'D' as u8, /*0x21*/ 'f' as u8, 'F' as u8,
|
||||
/*0x22*/ 'g' as u8, 'G' as u8, /*0x23*/ 'h' as u8, 'H' as u8,
|
||||
/*0x24*/ 'j' as u8, 'J' as u8, /*0x25*/ 'k' as u8, 'K' as u8,
|
||||
/*0x26*/ 'l' as u8, 'L' 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, /*0x2c*/ 'z' as u8, 'Z' as u8,
|
||||
/*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8,
|
||||
////////////////////////character///////////////////////////
|
||||
/*0x1e*/ 'a' as u8,
|
||||
'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8, /*0x20*/ 'd' as u8, 'D' as u8,
|
||||
/*0x21*/ 'f' as u8, 'F' as u8, /*0x22*/ 'g' as u8, 'G' as u8,
|
||||
/*0x23*/ 'h' as u8, 'H' as u8, /*0x24*/ 'j' as u8, 'J' as u8,
|
||||
/*0x25*/ 'k' as u8, 'K' as u8, /*0x26*/ 'l' as u8, 'L' as u8,
|
||||
////////////////////////character///////////////////////////
|
||||
|
||||
/*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,
|
||||
/*0x31*/ 'n' as u8, 'N' as u8, /*0x32*/ 'm' as u8, 'M' as u8,
|
||||
/*0x33*/ ',' as u8, '<' as u8, /*0x34*/ '.' as u8, '>' as u8,
|
||||
/*0x35*/ '/' as u8, '?' as u8, /*0x36*/ 0x36, 0x36, // SHIFT Right
|
||||
////////////////////////character///////////////////////////
|
||||
|
||||
/*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
|
||||
/*0x39*/ ' ' as u8, ' ' as u8, /*0x3a*/ 0, 0, // CAPS LOCK
|
||||
/*0x3b*/ 0, 0, // F1
|
||||
|
Reference in New Issue
Block a user