minicrossterm/src/cursor/winapi_cursor.rs
2018-07-26 16:25:20 +00:00

70 lines
1.9 KiB
Rust

//! This is an WINAPI specific implementation for cursor related action.
//! This module is used for windows terminals that do not support ANSI escape codes.
//! Note that the cursor position is 0 based. This means that we start counting at 0 when setting the cursor position ect.
use super::super::manager::{IScreenManager, ScreenManager, WinApiScreenManager};
use super::ITerminalCursor;
use kernel::windows_kernel::{cursor, kernel};
use std::rc::Rc;
use std::sync::Mutex;
/// This struct is an windows implementation for cursor related actions.
pub struct WinApiCursor {
screen_manager: Rc<Mutex<ScreenManager>>,
}
impl WinApiCursor {
pub fn new(screen_manager: Rc<Mutex<ScreenManager>>) -> Box<WinApiCursor> {
Box::from(WinApiCursor { screen_manager })
}
}
impl ITerminalCursor for WinApiCursor {
fn goto(&self, x: u16, y: u16) {
cursor::set_console_cursor_position(x as i16, y as i16, &self.screen_manager);
}
fn pos(&self) -> (u16, u16) {
cursor::pos(&self.screen_manager)
}
fn move_up(&self, count: u16) {
let (xpos, ypos) = self.pos();
self.goto(xpos, ypos - count);
}
fn move_right(&self, count: u16) {
let (xpos, ypos) = self.pos();
self.goto(xpos + count, ypos);
}
fn move_down(&self, count: u16) {
let (xpos, ypos) = self.pos();
self.goto(xpos, ypos + count);
}
fn move_left(&self, count: u16) {
let (xpos, ypos) = self.pos();
self.goto(xpos - count, ypos);
}
fn save_position(&self) {
cursor::save_cursor_pos(&self.screen_manager);
}
fn reset_position(&self) {
cursor::reset_to_saved_position(&self.screen_manager);
}
fn hide(&self) {
cursor::cursor_visibility(false, &self.screen_manager);
}
fn show(&self) {
cursor::cursor_visibility(true, &self.screen_manager);
}
fn blink(&self, blink: bool) {}
}