From 4dd4856f933be0b4624c7f7ffa9e3d0c8c218873 Mon Sep 17 00:00:00 2001 From: LoGin Date: Sat, 26 Oct 2024 12:55:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(tty):=20=E4=BF=AE=E5=A4=8Dtty=E5=AF=B9tab?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E5=A4=84=E7=90=86=E6=97=B6=E4=BA=A7=E7=94=9F?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=B6=8A=E7=95=8Cpanic=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#1015)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: longjin --- .../tty/virtual_terminal/virtual_console.rs | 21 ++++++++----------- kernel/src/libs/font/mod.rs | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index da7cdcd5..773d99c4 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -1284,13 +1284,11 @@ impl VirtualConsoleData { // 水平制表符(Horizontal Tab) self.pos -= self.state.x; - let ret = self.tab_stop.next_index(self.state.x + 1); - - if let Some(x) = ret { - self.state.x = x; - } else { - self.state.x = self.cols - 1; - } + self.state.x = self + .tab_stop + .next_index(self.state.x + 1) + .unwrap_or(self.cols - 1); + self.state.x = core::cmp::min(self.state.x, self.cols - 1); self.pos += self.state.x; // TODO: notify @@ -1552,7 +1550,7 @@ impl VirtualConsoleData { } // 未找到 - if (!self.utf || self.display_ctrl || c < 128) && c & !charmask == 0 { + if (!self.utf || self.display_ctrl || c < 128) && (c & !charmask) == 0 { tc = c; } else { let tmp = self.unicode_to_index(0xfffd); @@ -1587,7 +1585,7 @@ impl VirtualConsoleData { // TODO: 处理unicode screen buf if himask != 0 { - tc = (if tc & 0x100 != 0 { himask as u32 } else { 0 }) | (tc & 0xff); + tc = (if (tc & 0x100) != 0 { himask as u32 } else { 0 }) | (tc & 0xff); } tc |= ((attr as u32) << 8) & (!himask as u32); @@ -1602,7 +1600,7 @@ impl VirtualConsoleData { // ); self.screen_buf[self.pos] = tc as u16; - if draw.x.is_none() { + if self.should_update() && draw.x.is_none() { // 设置draw参数 draw.x = Some(self.state.x as u32); draw.offset = self.pos; @@ -1619,7 +1617,7 @@ impl VirtualConsoleData { } width -= 1; - if width == 0 { + if width <= 0 { break; } let tmp = self.unicode_to_index(' ' as u32); @@ -1629,7 +1627,6 @@ impl VirtualConsoleData { if invert { self.flush(draw); } - true } diff --git a/kernel/src/libs/font/mod.rs b/kernel/src/libs/font/mod.rs index 90eeeb35..d059b0d9 100644 --- a/kernel/src/libs/font/mod.rs +++ b/kernel/src/libs/font/mod.rs @@ -40,7 +40,7 @@ impl FontDesc { } for (first, last) in Self::DOUBLE_WIDTH_RANGE { - if ch > *first && ch < *last { + if ch >= *first && ch < *last { return true; } }