fb: Added support for typing backspaces.
This commit is contained in:
@@ -64,13 +64,19 @@ impl Writer {
|
|||||||
self.font = font;
|
self.font = font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This is sent when the user types a backspace.
|
||||||
|
const BACKSPACE: u16 = 8;
|
||||||
|
|
||||||
pub fn write_glyph(&mut self, c: u16) {
|
pub fn write_glyph(&mut self, c: u16) {
|
||||||
if c as u8 == b'\n' {
|
if c == b'\n' as u16 {
|
||||||
self.newline();
|
self.newline();
|
||||||
return;
|
return;
|
||||||
|
} else if c == Self::BACKSPACE {
|
||||||
|
self.backspace();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the character data from the font array. -- each byte is a row of pixels
|
// Get the character data from the font array. -- each byte is a row of pixels
|
||||||
let data: &[u8] = &self.font.0[c as usize];
|
let data: &[u8] = &self.font.0[c as usize];
|
||||||
|
|
||||||
if let Some(writer) = FRAMEBUFFER_WRITER.lock().as_mut() {
|
if let Some(writer) = FRAMEBUFFER_WRITER.lock().as_mut() {
|
||||||
@@ -80,17 +86,17 @@ impl Writer {
|
|||||||
let pixel_y: u32 = self.text_line * FONT_HEIGHT + row as u32;
|
let pixel_y: u32 = self.text_line * FONT_HEIGHT + row as u32;
|
||||||
|
|
||||||
if line & (0x80 >> col) != 0 {
|
if line & (0x80 >> col) != 0 {
|
||||||
// write the foreground color
|
// Write the foreground color
|
||||||
writer.write_pixel(pixel_x as usize, pixel_y as usize, self.fg_color);
|
writer.write_pixel(pixel_x as usize, pixel_y as usize, self.fg_color);
|
||||||
} else {
|
} else {
|
||||||
// write the background color
|
// Write the background color
|
||||||
writer.write_pixel(pixel_x as usize, pixel_y as usize, self.bg_color);
|
writer.write_pixel(pixel_x as usize, pixel_y as usize, self.bg_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// go to next position
|
// Go to next position
|
||||||
if self.text_col + 1 >= self.screen_width {
|
if self.text_col + 1 >= self.screen_width {
|
||||||
self.newline();
|
self.newline();
|
||||||
} else {
|
} else {
|
||||||
@@ -121,6 +127,17 @@ impl Writer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Handles the backspace character. TODO: Implement VT-100 style terminal control
|
||||||
|
/// codes alongside a shell. Not simple.
|
||||||
|
pub fn backspace(&mut self) {
|
||||||
|
if self.text_col > 0 {
|
||||||
|
self.text_col -= 1;
|
||||||
|
// Blank out the previous char.
|
||||||
|
self.write_glyph(' ' as u16);
|
||||||
|
self.text_col -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn write_string(&mut self, s: &str) {
|
pub fn write_string(&mut self, s: &str) {
|
||||||
for c in s.chars() {
|
for c in s.chars() {
|
||||||
self.write_glyph(c as u16);
|
self.write_glyph(c as u16);
|
||||||
|
|||||||
@@ -11,9 +11,7 @@ use pc_keyboard::{
|
|||||||
};
|
};
|
||||||
use spin::{Lazy, Mutex, Once};
|
use spin::{Lazy, Mutex, Once};
|
||||||
|
|
||||||
use crate::println;
|
use crate::prelude::*;
|
||||||
|
|
||||||
use super::print;
|
|
||||||
|
|
||||||
static KBD_QUEUE: Once<ArrayQueue<u8>> = Once::new();
|
static KBD_QUEUE: Once<ArrayQueue<u8>> = Once::new();
|
||||||
static WAKER: AtomicWaker = AtomicWaker::new();
|
static WAKER: AtomicWaker = AtomicWaker::new();
|
||||||
@@ -21,6 +19,7 @@ static WAKER: AtomicWaker = AtomicWaker::new();
|
|||||||
pub static KEYBOARD: Lazy<Mutex<Keyboard<Uk105Key, ScancodeSet1>>> = Lazy::new(|| {
|
pub static KEYBOARD: Lazy<Mutex<Keyboard<Uk105Key, ScancodeSet1>>> = Lazy::new(|| {
|
||||||
Mutex::new(Keyboard::new(
|
Mutex::new(Keyboard::new(
|
||||||
ScancodeSet1::new(),
|
ScancodeSet1::new(),
|
||||||
|
// TODO: Expose an API to change the default KB layout.
|
||||||
layouts::Uk105Key,
|
layouts::Uk105Key,
|
||||||
HandleControl::Ignore,
|
HandleControl::Ignore,
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ pub mod resources;
|
|||||||
pub mod std;
|
pub mod std;
|
||||||
|
|
||||||
/// Re-exports most of the IO macros as well as standard allocation stuff
|
/// Re-exports most of the IO macros as well as standard allocation stuff
|
||||||
|
#[allow(unused)]
|
||||||
pub mod prelude {
|
pub mod prelude {
|
||||||
pub use crate::std::io::*;
|
pub use crate::std::io::*;
|
||||||
pub use alloc::{
|
pub use alloc::{
|
||||||
|
|||||||
Reference in New Issue
Block a user