Clear until nextline and currentline windows functionality added
This commit is contained in:
parent
3b4b6fb11a
commit
37670c7fbb
@ -21,21 +21,11 @@ fn main() {
|
|||||||
|
|
||||||
let mut curs = cursor::get();
|
let mut curs = cursor::get();
|
||||||
{
|
{
|
||||||
curs.goto(10, 10);
|
curs.goto(4, 1).print("@");
|
||||||
curs.print("@");
|
|
||||||
curs.move_up(1);
|
|
||||||
curs.print("1");
|
|
||||||
|
|
||||||
curs.move_right(1);
|
|
||||||
curs.print("2");
|
|
||||||
|
|
||||||
curs.move_down(1);
|
|
||||||
curs.print("3");
|
|
||||||
|
|
||||||
curs.move_left(2);
|
|
||||||
curs.print("4");
|
|
||||||
|
|
||||||
curs.goto(0, 30);
|
|
||||||
println!("{:?}", curs.pos());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
terminal::get().clear(ClearType::UntilNewLine);
|
||||||
|
|
||||||
|
cursor::get().goto(0,30);
|
||||||
}
|
}
|
||||||
|
@ -13,20 +13,20 @@ pub enum CursorDirection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Set the cursor position to an coordinate (x,y).
|
/// Set the cursor position to an coordinate (x,y).
|
||||||
pub fn set(x: u16, y: u16) {
|
pub fn set(x: i16, y: i16) {
|
||||||
set_cursor_pos(x as i16, y as i16);
|
set_cursor_pos(x as i16, y as i16);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the current cursor x position.
|
/// Get the current cursor x position.
|
||||||
pub fn xpos() -> u16 {
|
pub fn xpos() -> i16 {
|
||||||
let csbi = kernel::get_console_screen_buffer_info();
|
let csbi = kernel::get_console_screen_buffer_info();
|
||||||
csbi.dwCursorPosition.X as u16
|
csbi.dwCursorPosition.X
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the current cursor y position.
|
/// Get the current cursor y position.
|
||||||
pub fn ypos() -> u16 {
|
pub fn ypos() -> i16 {
|
||||||
let csbi = kernel::get_console_screen_buffer_info();
|
let csbi = kernel::get_console_screen_buffer_info();
|
||||||
csbi.dwCursorPosition.Y as u16
|
csbi.dwCursorPosition.Y
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn move_down(count: u16) {
|
pub fn move_down(count: u16) {
|
||||||
|
@ -44,7 +44,7 @@ pub fn clear_after_cursor() {
|
|||||||
let mut y = cursor::ypos() as i16;
|
let mut y = cursor::ypos() as i16;
|
||||||
|
|
||||||
// if cursor position is at the outer right position
|
// if cursor position is at the outer right position
|
||||||
if x > csbi.srWindow.Right
|
if x > csbi.dwSize.X
|
||||||
{
|
{
|
||||||
y += 1;
|
y += 1;
|
||||||
x = 0;
|
x = 0;
|
||||||
@ -52,22 +52,29 @@ pub fn clear_after_cursor() {
|
|||||||
|
|
||||||
// location where to start clearing
|
// location where to start clearing
|
||||||
let start_loaction = winapi::COORD { X: x, Y: y };
|
let start_loaction = winapi::COORD { X: x, Y: y };
|
||||||
clear(output_handle, csbi, start_loaction);
|
// get sum cells before cursor
|
||||||
|
let cells_to_write = csbi.dwSize.X as u32 * csbi.dwSize.Y as u32;
|
||||||
|
|
||||||
|
clear(output_handle, csbi, start_loaction,cells_to_write);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn before_after_cursor() {
|
pub fn clear_before_cursor() {
|
||||||
// let output_handle = handle::get_output_handle();
|
let output_handle = handle::get_output_handle();
|
||||||
// let csbi = kernel::get_console_screen_buffer_info();
|
let csbi = kernel::get_console_screen_buffer_info();
|
||||||
|
|
||||||
// // one cell after cursor position
|
// one cell after cursor position
|
||||||
// let x = cursor::xpos() as i16 - 1;
|
let x = 0;
|
||||||
// // one at row of cursor position
|
// one at row of cursor position
|
||||||
// let y = cursor::ypos() as i16;
|
let y = 0;
|
||||||
|
|
||||||
// // location where to start clearing
|
// location where to start clearing
|
||||||
// let start_loaction = winapi::COORD { X: x, Y: y };
|
let start_loaction = winapi::COORD { X: x, Y: y };
|
||||||
// clear(output_handle, csbi, start_loaction);
|
// get sum cells before cursor
|
||||||
// }
|
let cells_to_write = (csbi.dwSize.X as u32 * cursor::ypos() as u32) + (cursor::xpos() -1) as u32;
|
||||||
|
|
||||||
|
// println!("{:?}", (csbi.dwSize.X as u32 * (cursor::ypos() - 1) as u32));
|
||||||
|
clear(output_handle, csbi, start_loaction, cells_to_write);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn clear_entire_screen() {
|
pub fn clear_entire_screen() {
|
||||||
let output_handle = handle::get_output_handle();
|
let output_handle = handle::get_output_handle();
|
||||||
@ -80,28 +87,74 @@ pub fn clear_entire_screen() {
|
|||||||
|
|
||||||
// location where to start clearing
|
// location where to start clearing
|
||||||
let start_loaction = winapi::COORD { X: x, Y: y };
|
let start_loaction = winapi::COORD { X: x, Y: y };
|
||||||
|
// get sum cells before cursor
|
||||||
|
|
||||||
clear(output_handle, csbi, start_loaction);
|
let cells_to_write = csbi.dwSize.X as u32 * csbi.dwSize.Y as u32;
|
||||||
|
|
||||||
|
clear(output_handle, csbi, start_loaction, cells_to_write);
|
||||||
|
|
||||||
// put the cursor back at (0, 0)
|
// put the cursor back at (0, 0)
|
||||||
cursor::set(0, 0);
|
cursor::set(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn clear_current_line()
|
||||||
|
{
|
||||||
|
let output_handle = handle::get_output_handle();
|
||||||
|
let csbi = kernel::get_console_screen_buffer_info();
|
||||||
|
|
||||||
|
// position x at start
|
||||||
|
let x = 0;
|
||||||
|
// position y at start
|
||||||
|
let y = cursor::ypos();
|
||||||
|
|
||||||
|
// location where to start clearing
|
||||||
|
let start_loaction = winapi::COORD { X: x, Y: y };
|
||||||
|
// get sum cells before cursor
|
||||||
|
|
||||||
|
let cells_to_write = csbi.dwSize.X as u32;
|
||||||
|
|
||||||
|
clear(output_handle, csbi, start_loaction, cells_to_write);
|
||||||
|
|
||||||
|
// put the cursor back at (0, 0)
|
||||||
|
cursor::set(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear_until_line()
|
||||||
|
{
|
||||||
|
let output_handle = handle::get_output_handle();
|
||||||
|
let csbi = kernel::get_console_screen_buffer_info();
|
||||||
|
|
||||||
|
// position x at start
|
||||||
|
let x = cursor::xpos();
|
||||||
|
// position y at start
|
||||||
|
let y = cursor::ypos();
|
||||||
|
|
||||||
|
// location where to start clearing
|
||||||
|
let start_loaction = winapi::COORD { X: x -1, Y: y };
|
||||||
|
// get sum cells before cursor
|
||||||
|
let cells_to_write = (csbi.dwSize.X - x) as u32 - 1;
|
||||||
|
|
||||||
|
clear(output_handle, csbi, start_loaction, cells_to_write);
|
||||||
|
print!("{:?}",start_loaction);
|
||||||
|
// put the cursor back at (0, 0)
|
||||||
|
cursor::set(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
fn clear(
|
fn clear(
|
||||||
handle: winapi::HANDLE,
|
handle: winapi::HANDLE,
|
||||||
csbi: winapi::CONSOLE_SCREEN_BUFFER_INFO,
|
csbi: winapi::CONSOLE_SCREEN_BUFFER_INFO,
|
||||||
start_loaction: winapi::COORD,
|
start_loaction: winapi::COORD,
|
||||||
|
cells_to_write: u32
|
||||||
) {
|
) {
|
||||||
let console_size = (csbi.dwSize.X as u32 * csbi.dwSize.Y as u32) as u32;
|
|
||||||
let mut cells_written = 0;
|
let mut cells_written = 0;
|
||||||
let mut success;
|
let mut success;
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
// fill the entire screen with blanks
|
// fill the cetain cells in console with blanks
|
||||||
success = kernel32::FillConsoleOutputCharacterA(
|
success = kernel32::FillConsoleOutputCharacterA(
|
||||||
handle,
|
handle,
|
||||||
' ' as i8,
|
' ' as i8,
|
||||||
console_size,
|
cells_to_write,
|
||||||
start_loaction,
|
start_loaction,
|
||||||
&mut cells_written,
|
&mut cells_written,
|
||||||
);
|
);
|
||||||
@ -117,7 +170,7 @@ fn clear(
|
|||||||
success = kernel32::FillConsoleOutputAttribute(
|
success = kernel32::FillConsoleOutputAttribute(
|
||||||
handle,
|
handle,
|
||||||
csbi.wAttributes,
|
csbi.wAttributes,
|
||||||
console_size,
|
cells_to_write,
|
||||||
start_loaction,
|
start_loaction,
|
||||||
&mut cells_written,
|
&mut cells_written,
|
||||||
);
|
);
|
||||||
|
@ -18,10 +18,9 @@ impl ITerminal for WinApiTerminal {
|
|||||||
{
|
{
|
||||||
ClearType::All => terminal::clear_entire_screen(),
|
ClearType::All => terminal::clear_entire_screen(),
|
||||||
ClearType::AfterCursor => terminal::clear_after_cursor(),
|
ClearType::AfterCursor => terminal::clear_after_cursor(),
|
||||||
_ => print!("")
|
ClearType::BeforeCursor => terminal::clear_before_cursor(),
|
||||||
// ClearType::BeforeCursor => format!(csi!("1J")),
|
ClearType::CurrentLine => terminal::clear_current_line(),
|
||||||
// ClearType::CurrentLine => format!(csi!("2K")),
|
ClearType::UntilNewLine => terminal::clear_until_line(),
|
||||||
// ClearType::UntilNewLine => format!(csi!("K")),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ impl ITerminalCursor for AnsiCursor {
|
|||||||
format!(csi!("{};{}H"), x, y);
|
format!(csi!("{};{}H"), x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pos(&self) -> (u16, u16) {
|
fn pos(&self) -> (i16, i16) {
|
||||||
(0, 0)
|
(0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
pub trait ITerminalCursor {
|
pub trait ITerminalCursor {
|
||||||
/// Goto some location (x,y) in the terminal.
|
/// Goto some location (x,y) in the terminal.
|
||||||
fn goto(&self, x: u16, y: u16);
|
fn goto(&self, x: u16, y: u16);
|
||||||
fn pos(&self) -> (u16, u16);
|
fn pos(&self) -> (i16, i16);
|
||||||
fn move_up(&self, count: u16);
|
fn move_up(&self, count: u16);
|
||||||
fn move_right(&self, count: u16);
|
fn move_right(&self, count: u16);
|
||||||
fn move_down(&self, count: u16);
|
fn move_down(&self, count: u16);
|
||||||
|
@ -42,7 +42,7 @@ impl TerminalCursor {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pos(mut self) -> (u16, u16) {
|
pub fn pos(mut self) -> (i16, i16) {
|
||||||
&self.init();
|
&self.init();
|
||||||
if let Some(ref terminal_cursor) = self.terminal_cursor {
|
if let Some(ref terminal_cursor) = self.terminal_cursor {
|
||||||
terminal_cursor.pos()
|
terminal_cursor.pos()
|
||||||
|
@ -14,7 +14,7 @@ impl Construct for NoCursor {
|
|||||||
impl ITerminalCursor for NoCursor {
|
impl ITerminalCursor for NoCursor {
|
||||||
fn goto(&self, x: u16, y: u16) {}
|
fn goto(&self, x: u16, y: u16) {}
|
||||||
|
|
||||||
fn pos(&self) -> (u16, u16) {
|
fn pos(&self) -> (i16, i16) {
|
||||||
(0, 0)
|
(0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,10 +15,10 @@ impl Construct for WinApiCursor {
|
|||||||
|
|
||||||
impl ITerminalCursor for WinApiCursor {
|
impl ITerminalCursor for WinApiCursor {
|
||||||
fn goto(&self, x: u16, y: u16) {
|
fn goto(&self, x: u16, y: u16) {
|
||||||
cursor::set(x, y);
|
cursor::set(x as i16, y as i16);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pos(&self) -> (u16, u16) {
|
fn pos(&self) -> (i16, i16) {
|
||||||
(cursor::xpos(), cursor::ypos())
|
(cursor::xpos(), cursor::ypos())
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,27 +26,27 @@ impl ITerminalCursor for WinApiCursor {
|
|||||||
let xpos = cursor::xpos();
|
let xpos = cursor::xpos();
|
||||||
let ypos = cursor::ypos();
|
let ypos = cursor::ypos();
|
||||||
|
|
||||||
cursor::set(xpos, ypos - 1);
|
cursor::set(xpos, ypos - count as i16);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_right(&self, count: u16) {
|
fn move_right(&self, count: u16) {
|
||||||
let xpos = cursor::xpos();
|
let xpos = cursor::xpos();
|
||||||
let ypos = cursor::ypos();
|
let ypos = cursor::ypos();
|
||||||
|
|
||||||
cursor::set(xpos + 1, ypos);
|
cursor::set(xpos + count as i16, ypos);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_down(&self, count: u16) {
|
fn move_down(&self, count: u16) {
|
||||||
let xpos = cursor::xpos();
|
let xpos = cursor::xpos();
|
||||||
let ypos = cursor::ypos();
|
let ypos = cursor::ypos();
|
||||||
|
|
||||||
cursor::set(xpos, ypos + count);
|
cursor::set(xpos, ypos + count as i16);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_left(&self, count: u16) {
|
fn move_left(&self, count: u16) {
|
||||||
let xpos = cursor::xpos();
|
let xpos = cursor::xpos();
|
||||||
let ypos = cursor::ypos();
|
let ypos = cursor::ypos();
|
||||||
|
|
||||||
cursor::set(xpos - 1, ypos);
|
cursor::set(xpos - count as i16, ypos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user