diff --git a/examples/Crossterm 0.3.0/bin.rs b/examples/Crossterm 0.3.0/bin.rs index 29396da..b4ca060 100644 --- a/examples/Crossterm 0.3.0/bin.rs +++ b/examples/Crossterm 0.3.0/bin.rs @@ -10,12 +10,15 @@ //! ``` //! //! - Run program with: `cargo run` -extern crate crossterm; +//extern crate crossterm; -mod color; -mod cursor; -mod terminal; +// mod terminal; +// mod color; +// mod cursor; +// mod crossterm_type; -fn main() { - // some code to try out the examples. +fn main() +{ } + + diff --git a/examples/Crossterm 0.3.0/color/mod.rs b/examples/Crossterm 0.3.0/color/mod.rs index 227e470..548c9ec 100644 --- a/examples/Crossterm 0.3.0/color/mod.rs +++ b/examples/Crossterm 0.3.0/color/mod.rs @@ -11,7 +11,7 @@ use self::crossterm::Context; /// print some red font | demonstration. pub fn paint_foreground() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); // Pass an string to the `paint()` method with you want to paint. // This will give you an object back wits can be styled and displayed. @@ -28,7 +28,7 @@ pub fn paint_foreground() { /// print some font on red background | demonstration. pub fn paint_background() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); // Pass an string to the `paint()` method with you want to paint. // This will give you an object back wits can be styled and displayed. @@ -45,7 +45,7 @@ pub fn paint_background() { /// print font with fore- background color | demonstration. pub fn paint_foreground_and_background() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); // Pass an string to the `paint()` method with you want to paint. // This will give you an object back wits can be styled and displayed. @@ -76,7 +76,7 @@ pub fn paint_foreground_and_background() { /// Print all available foreground colors | demonstration. pub fn print_all_foreground_colors() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); println!("Black : \t {}", terminal.paint("■").with(Color::Black)); println!("Red : \t\t {}", terminal.paint("■").with(Color::Red)); @@ -119,7 +119,7 @@ pub fn print_all_foreground_colors() { /// Print all available foreground colors | demonstration. pub fn print_all_background_colors() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); println!("Black : \t {}", terminal.paint(" ").on(Color::Black)); println!("Red : \t\t {}", terminal.paint(" ").on(Color::Red)); @@ -171,7 +171,7 @@ pub fn print_all_background_colors() { #[cfg(unix)] pub fn print_font_with_attributes() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); println!("{}", terminal.paint("Normal text")); println!("{}", terminal.paint("Bold text").bold()); @@ -189,9 +189,9 @@ pub fn print_font_with_attributes() { #[cfg(unix)] pub fn print_supported_colors() { let context = Context::new(); - let terminal = terminal::terminal(context.clone()); + let terminal = terminal::terminal(&context); - let count = crossterm::style::color(context.clone()) + let count = crossterm::style::color(&context) .get_available_color_count() .unwrap(); diff --git a/examples/Crossterm 0.3.0/cursor/mod.rs b/examples/Crossterm 0.3.0/cursor/mod.rs index e904cb8..2345778 100644 --- a/examples/Crossterm 0.3.0/cursor/mod.rs +++ b/examples/Crossterm 0.3.0/cursor/mod.rs @@ -11,7 +11,7 @@ pub fn goto() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Set the cursor to position X: 10, Y: 5 in the terminal cursor.goto(10, 5); } @@ -21,7 +21,7 @@ pub fn pos() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // get the cursor position. let (x, y) = cursor.pos(); } @@ -31,9 +31,10 @@ pub fn move_up() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); + // Move the cursor to position 3 times to the up in the terminal - cursor.move_up(3); + cursor.move_up(10); } /// Move the cursor 3 to the right | demonstration. @@ -41,7 +42,7 @@ pub fn move_right() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Move the cursor to position 3 times to the right in the terminal cursor.move_right(3); } @@ -51,7 +52,7 @@ pub fn move_down() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Move the cursor to position 3 times to the down in the terminal cursor.move_down(3); } @@ -61,7 +62,7 @@ pub fn move_left() { let context = Context::new(); // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Move the cursor to position 3 times to the left in the terminal cursor.move_left(3); } @@ -73,7 +74,7 @@ pub fn print() { // To print an some displayable content on an certain position. // Get the cursor - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Set the cursor to position X: 10, Y: 5 in the terminal cursor.goto(10, 5); // Print the @ symbol at position X: 10, Y: 5 in the terminal @@ -96,7 +97,7 @@ pub fn print() { pub fn safe_and_reset_position() { let context = Context::new(); - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); // Goto X: 5 Y: 5 cursor.goto(5, 5); @@ -118,7 +119,7 @@ pub fn safe_and_reset_position() { pub fn hide_cursor() { let context = Context::new(); - let cursor = cursor(context.clone()); + let cursor = cursor(&context); cursor.hide(); } @@ -126,7 +127,7 @@ pub fn hide_cursor() { pub fn show_cursor() { let context = Context::new(); - let cursor = cursor(context.clone()); + let cursor = cursor(&context); cursor.show(); } @@ -134,7 +135,7 @@ pub fn show_cursor() { pub fn blink_cursor() { let context = Context::new(); - let cursor = cursor(context.clone()); + let cursor = cursor(&context); cursor.blink(false); cursor.blink(false); } diff --git a/examples/Crossterm 0.3.0/terminal/alternate_screen.rs b/examples/Crossterm 0.3.0/terminal/alternate_screen.rs index 45d2932..d935be7 100644 --- a/examples/Crossterm 0.3.0/terminal/alternate_screen.rs +++ b/examples/Crossterm 0.3.0/terminal/alternate_screen.rs @@ -11,10 +11,10 @@ use std::rc::Rc; use std::{thread, time}; fn print_wait_screen(context: Rc) { - let mut terminal = terminal::terminal(context.clone()); + let mut terminal = terminal::terminal(&context); terminal.clear(ClearType::All); - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); cursor.goto(0, 0); cursor.hide(); @@ -56,7 +56,7 @@ pub fn print_wait_screen_on_alternate_window(context: Rc) { /// some stress test switch from and to alternate screen. pub fn switch_between_main_and_alternate_screen() { let context = Context::new(); - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); { // create new alternate screen instance and switch to the alternate screen. diff --git a/examples/Crossterm 0.3.0/terminal/mod.rs b/examples/Crossterm 0.3.0/terminal/mod.rs index 7eacb19..c6adf4b 100644 --- a/examples/Crossterm 0.3.0/terminal/mod.rs +++ b/examples/Crossterm 0.3.0/terminal/mod.rs @@ -1,10 +1,8 @@ /// Examples of actions that could be performed on the alternatescreen. -/// !! Note that alternate screen only works on Unix and windows 10 systems. I am working on windows 7 support. !! pub mod alternate_screen; /// Examples of actions that could be performed on the terminal. pub mod terminal; -/// Alternate screen is only supported for unix systems. Windows support will come later :). -#[cfg(target_os = "unix")] +// Raw screen pub mod raw_mode; diff --git a/examples/Crossterm 0.3.0/terminal/raw_mode.rs b/examples/Crossterm 0.3.0/terminal/raw_mode.rs index 6e202f1..2209d70 100644 --- a/examples/Crossterm 0.3.0/terminal/raw_mode.rs +++ b/examples/Crossterm 0.3.0/terminal/raw_mode.rs @@ -13,9 +13,9 @@ use crossterm::raw::IntoRawMode; // raw screen is not working correctly currently fn print_wait_screen(context: Rc) { - terminal::terminal(context.clone()).clear(ClearType::All); + terminal::terminal(&context).clear(ClearType::All); - let mut cursor = cursor(context.clone()); + let mut cursor = cursor(&context); cursor.goto(0, 0).print("Welcome to the wait screen."); cursor .goto(0, 1) @@ -44,7 +44,7 @@ pub fn print_wait_screen_on_alternate_window() { // then convert the output of the program to raw mode. // then print the wait screen on the alternate screen in raw mode. let mut screen = AlternateScreen::from(context.clone()); - let alternate_screen = screen.into_raw_mode(context.clone()); + let raw_screen = screen.into_raw_mode(context.clone()); // Print the wait screen. print_wait_screen(context.clone()); diff --git a/examples/Crossterm 0.3.0/terminal/terminal.rs b/examples/Crossterm 0.3.0/terminal/terminal.rs index bfa3d4c..97afe3c 100644 --- a/examples/Crossterm 0.3.0/terminal/terminal.rs +++ b/examples/Crossterm 0.3.0/terminal/terminal.rs @@ -19,7 +19,7 @@ pub fn clear_all_lines() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context); + let mut terminal = terminal(&context); print_test_data(); @@ -32,12 +32,12 @@ pub fn clear_from_cursor_down() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); print_test_data(); // Set terminal cursor position (see example for more info). - cursor::cursor(context.clone()).goto(4, 8); + cursor::cursor(&context).goto(4, 8); // Clear all cells from current cursor position down. terminal.clear(ClearType::FromCursorDown); @@ -48,12 +48,12 @@ pub fn clear_from_cursor_up() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); print_test_data(); // Set terminal cursor position (see example for more info). - cursor::cursor(context.clone()).goto(4, 4); + cursor::cursor(&context).goto(4, 4); // Clear all cells from current cursor position down. terminal.clear(ClearType::FromCursorUp); @@ -64,12 +64,12 @@ pub fn clear_current_line() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); print_test_data(); // Set terminal cursor position (see example for more info). - cursor::cursor(context.clone()).goto(4, 4); + cursor::cursor(&context).goto(4, 4); // Clear current line cells. terminal.clear(ClearType::CurrentLine); @@ -80,12 +80,12 @@ pub fn clear_until_new_line() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); print_test_data(); // Set terminal cursor position (see example for more info). - cursor::cursor(context.clone()).goto(4, 20); + cursor::cursor(&context).goto(4, 20); // Clear all the cells until next line. terminal.clear(ClearType::UntilNewLine); @@ -96,7 +96,7 @@ pub fn print_terminal_size() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); // Get terminal size let terminal_size = terminal.terminal_size(); // Print results @@ -107,7 +107,7 @@ pub fn print_terminal_size() { pub fn set_terminal_size() { let context = Context::new(); - let mut terminal = terminal(context); + let mut terminal = terminal(&context); terminal.set_size(10, 10); } @@ -117,8 +117,11 @@ pub fn scroll_down() { let context = Context::new(); print_test_data(); + + + // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); // Scroll down 10 lines. terminal.scroll_down(10); } @@ -130,9 +133,9 @@ pub fn scroll_up() { print_test_data(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); // Scroll up 10 lines. - terminal.scroll_up(10); + terminal.scroll_up(5); } /// Resize the terminal to X: 10, Y: 10 | demonstration. @@ -140,7 +143,8 @@ pub fn resize_terminal() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); + // Get terminal size terminal.set_size(10, 10); } @@ -150,7 +154,7 @@ pub fn exit() { let context = Context::new(); // Get terminal - let mut terminal = terminal(context.clone()); + let mut terminal = terminal(&context); // Get terminal size terminal.exit(); } diff --git a/src/kernel/windows_kernel/kernel.rs b/src/kernel/windows_kernel/kernel.rs index 575fc2b..ae411f5 100644 --- a/src/kernel/windows_kernel/kernel.rs +++ b/src/kernel/windows_kernel/kernel.rs @@ -104,7 +104,7 @@ pub fn get_console_screen_buffer_info( let mut csbi = CONSOLE_SCREEN_BUFFER_INFO::empty(); let success; - unsafe { success = GetConsoleScreenBufferInfo(get_output_handle(), &mut csbi) } + unsafe { success = GetConsoleScreenBufferInfo(get_current_handle(screen_manager), &mut csbi) } if success == 0 { panic!("Cannot get console screen buffer info"); diff --git a/src/shared/functions.rs b/src/shared/functions.rs index e73a75e..e392332 100644 --- a/src/shared/functions.rs +++ b/src/shared/functions.rs @@ -54,8 +54,9 @@ pub fn get_module(winapi_impl: T, unix_impl: T) -> Option { use kernel::windows_kernel::ansi_support::try_enable_ansi_support; // Try to enable ansi on windows if not than use WINAPI. - does_support = try_enable_ansi_support(); +// does_support = try_enable_ansi_support(); + does_support = false; if !does_support { term = Some(winapi_impl); } diff --git a/src/terminal/ansi_terminal.rs b/src/terminal/ansi_terminal.rs index 98774d0..9b4e304 100644 --- a/src/terminal/ansi_terminal.rs +++ b/src/terminal/ansi_terminal.rs @@ -48,6 +48,7 @@ impl ITerminal for AnsiTerminal { fn scroll_up(&self, count: i16) { let mut screen = self.context.screen_manager.lock().unwrap(); { + panic!(); screen.write_string(format!(csi!("{}S"), count)); } } diff --git a/src/terminal/winapi_terminal.rs b/src/terminal/winapi_terminal.rs index 27b320c..c49d811 100644 --- a/src/terminal/winapi_terminal.rs +++ b/src/terminal/winapi_terminal.rs @@ -41,23 +41,39 @@ impl ITerminal for WinApiTerminal { } fn scroll_up(&self, count: i16) { - // yet to be implemented + let csbi = kernel::get_console_screen_buffer_info(&self.context.screen_manager); + + // Set srctWindow to the current window size and location. + let mut srct_window = csbi.srWindow; + + + // Check whether the window is too close to the screen buffer top + if srct_window.Top >= count { + srct_window.Top -= count; // move top down + srct_window.Bottom = count; // move bottom down + + let success = kernel::set_console_info(false, &mut srct_window, &self.context.screen_manager); + if success { + panic!("Something went wrong when scrolling down"); + } + } } fn scroll_down(&self, count: i16) { - let csbi = kernel::get_console_screen_buffer_info(&self.context.screen_manager); - let mut srct_window; + let csbi = kernel::get_console_screen_buffer_info(&self.context.screen_manager); // Set srctWindow to the current window size and location. - srct_window = csbi.srWindow; + let mut srct_window = csbi.srWindow; + + panic!("window top: {} , window bottom: {} | {}, {}", srct_window.Top, srct_window.Bottom, csbi.dwSize.Y, csbi.dwSize.X); // Check whether the window is too close to the screen buffer top if srct_window.Bottom < csbi.dwSize.Y - count { srct_window.Top += count; // move top down srct_window.Bottom += count; // move bottom down - let success = - kernel::set_console_info(true, &mut srct_window, &self.context.screen_manager); + let success = kernel::set_console_info(false, &mut srct_window, &self.context.screen_manager); + if success { panic!("Something went wrong when scrolling down"); }