Fix erasing the old cursor
This commit is contained in:
parent
7612fba1e4
commit
cce162bd72
35
src/main.rs
35
src/main.rs
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
use core::str;
|
use core::str;
|
||||||
use std::{
|
use std::{
|
||||||
borrow::Cow, collections::HashMap, fmt::{self, Write}, os::mikros::{address_space::ACTIVE_SPACE, ipc, syscalls}
|
borrow::Cow, collections::HashMap, fmt::{self, Write}, os::mikros::{address_space::ACTIVE_SPACE, ipc, syscalls}, usize
|
||||||
};
|
};
|
||||||
|
|
||||||
use fontdue::{layout::{CoordinateSystem, GlyphRasterConfig, Layout, LayoutSettings, TextStyle, WrapStyle}, Font, FontSettings};
|
use fontdue::{layout::{CoordinateSystem, GlyphRasterConfig, Layout, LayoutSettings, TextStyle, WrapStyle}, Font, FontSettings};
|
||||||
@ -162,7 +162,8 @@ pub struct FramebufferWriter {
|
|||||||
layout: Layout,
|
layout: Layout,
|
||||||
next_line_y: usize,
|
next_line_y: usize,
|
||||||
glyph_cache: HashMap<GlyphRasterConfig, Vec<u8>>,
|
glyph_cache: HashMap<GlyphRasterConfig, Vec<u8>>,
|
||||||
cursor_height: usize,
|
cursor_top: usize,
|
||||||
|
cursor_bot: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FramebufferWriter {
|
impl FramebufferWriter {
|
||||||
@ -180,7 +181,8 @@ impl FramebufferWriter {
|
|||||||
layout,
|
layout,
|
||||||
next_line_y: 0,
|
next_line_y: 0,
|
||||||
glyph_cache: HashMap::new(),
|
glyph_cache: HashMap::new(),
|
||||||
cursor_height: 0,
|
cursor_top: 0,
|
||||||
|
cursor_bot: 0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,6 +192,10 @@ impl FramebufferWriter {
|
|||||||
let text_height = self.layout.height();
|
let text_height = self.layout.height();
|
||||||
self.layout.append(&[&self.font], &TextStyle::new("\u{2588}", 12.0, 0));
|
self.layout.append(&[&self.font], &TextStyle::new("\u{2588}", 12.0, 0));
|
||||||
|
|
||||||
|
for row in self.cursor_top..self.cursor_bot {
|
||||||
|
fbuf.clear_row(row);
|
||||||
|
}
|
||||||
|
|
||||||
if (self.next_line_y + self.layout.height() as usize) > fbuf.yres {
|
if (self.next_line_y + self.layout.height() as usize) > fbuf.yres {
|
||||||
let excess_y =
|
let excess_y =
|
||||||
self.layout.height() as usize - (fbuf.yres - self.next_line_y);
|
self.layout.height() as usize - (fbuf.yres - self.next_line_y);
|
||||||
@ -197,25 +203,13 @@ impl FramebufferWriter {
|
|||||||
self.next_line_y -= excess_y;
|
self.next_line_y -= excess_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
for row in 0..usize::max(self.cursor_height+5,text_height as usize) {
|
|
||||||
fbuf.clear_row(self.next_line_y + row);
|
|
||||||
}
|
|
||||||
|
|
||||||
//for row in 0..(fbuf.yres - self.next_line_y) {
|
|
||||||
// fbuf.clear_row(self.next_line_y + row);
|
|
||||||
//}
|
|
||||||
|
|
||||||
self.cursor_height = (self.layout.height() - text_height) as usize;
|
|
||||||
|
|
||||||
let glyphs = self.layout.glyphs();
|
let glyphs = self.layout.glyphs();
|
||||||
|
let lines = self.layout.lines().unwrap();
|
||||||
|
|
||||||
let mut first_line_top_offset = None;
|
let first_line = lines[0];
|
||||||
|
let first_line_top_offset = (first_line.baseline_y - first_line.max_ascent) as usize;
|
||||||
|
|
||||||
for line in self.layout.lines().unwrap() {
|
for line in self.layout.lines().unwrap() {
|
||||||
if first_line_top_offset.is_none() {
|
|
||||||
first_line_top_offset = Some((line.baseline_y - line.max_ascent) as usize);
|
|
||||||
}
|
|
||||||
let first_line_top_offset = first_line_top_offset.unwrap();
|
|
||||||
for glyph_pos in &glyphs[line.glyph_start..=line.glyph_end] {
|
for glyph_pos in &glyphs[line.glyph_start..=line.glyph_end] {
|
||||||
if glyph_pos.width == 0 || glyph_pos.height == 0 {
|
if glyph_pos.width == 0 || glyph_pos.height == 0 {
|
||||||
continue;
|
continue;
|
||||||
@ -239,6 +233,11 @@ impl FramebufferWriter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let cursor_glyph = glyphs.last().unwrap();
|
||||||
|
|
||||||
|
self.cursor_top = cursor_glyph.y as usize - first_line_top_offset + self.next_line_y;
|
||||||
|
self.cursor_bot = cursor_glyph.y as usize - first_line_top_offset + self.next_line_y + cursor_glyph.height;
|
||||||
|
|
||||||
let last_line = self.layout.lines().unwrap().last().unwrap();
|
let last_line = self.layout.lines().unwrap().last().unwrap();
|
||||||
fbuf.update_screen();
|
fbuf.update_screen();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user