Added the ability to pause the terminal (#47)
This commit is contained in:
		
							parent
							
								
									f068ae69b1
								
							
						
					
					
						commit
						b82736912d
					
				@ -109,7 +109,7 @@ pub fn print_all_foreground_colors() {
 | 
				
			|||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #[cfg(unix)]
 | 
					    #[cfg(unix)]
 | 
				
			||||||
    println!("{}", style("RGB color (10,10,10) ")).with(Color::AnsiValue(50));
 | 
					    println!("{}", style("RGB color (10,10,10) ").with(Color::AnsiValue(50)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Print all available foreground colors | demonstration.
 | 
					/// Print all available foreground colors | demonstration.
 | 
				
			||||||
 | 
				
			|||||||
@ -14,4 +14,9 @@ mod input;
 | 
				
			|||||||
mod some_types;
 | 
					mod some_types;
 | 
				
			||||||
mod terminal;
 | 
					mod terminal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() {}
 | 
					use crossterm::input::{TerminalInput, KeyEvent};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					    println!("Press 'x' to quit...");
 | 
				
			||||||
 | 
					    TerminalInput::wait_until(KeyEvent::OnKeyPress(b'x'));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
extern crate crossterm;
 | 
					extern crate crossterm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use self::crossterm::input::input;
 | 
					use self::crossterm::input::{input, TerminalInput, KeyEvent};
 | 
				
			||||||
use self::crossterm::Screen;
 | 
					use self::crossterm::Screen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn read_char() {
 | 
					pub fn read_char() {
 | 
				
			||||||
@ -20,3 +20,8 @@ pub fn read_line() {
 | 
				
			|||||||
        Err(e) => println!("error: {}", e),
 | 
					        Err(e) => println!("error: {}", e),
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn pause_terminal() {
 | 
				
			||||||
 | 
					    println!("Press 'x' to quit...");
 | 
				
			||||||
 | 
					    TerminalInput::wait_until(KeyEvent::OnKeyPress(b'x'));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -3,6 +3,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use super::*;
 | 
					use super::*;
 | 
				
			||||||
use Screen;
 | 
					use Screen;
 | 
				
			||||||
 | 
					use std::{thread, time::Duration};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Struct that stores an specific platform implementation for input related actions.
 | 
					/// Struct that stores an specific platform implementation for input related actions.
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
@ -158,6 +159,43 @@ impl<'stdout> TerminalInput<'stdout> {
 | 
				
			|||||||
        self.terminal_input
 | 
					        self.terminal_input
 | 
				
			||||||
            .read_until_async(delimiter, &self.stdout)
 | 
					            .read_until_async(delimiter, &self.stdout)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// This will prevent the current thread from continuing until the passed `KeyEvent` has happened.
 | 
				
			||||||
 | 
					    ///
 | 
				
			||||||
 | 
					    /// ```
 | 
				
			||||||
 | 
					    /// use crossterm::input::{TerminalInput, KeyEvent};
 | 
				
			||||||
 | 
					    ///
 | 
				
			||||||
 | 
					    /// fn main() {
 | 
				
			||||||
 | 
					    ///     println!("Press 'x' to quit...");
 | 
				
			||||||
 | 
					    ///     TerminalInput::wait_until(KeyEvent::OnKeyPress(b'x'));
 | 
				
			||||||
 | 
					    /// }
 | 
				
			||||||
 | 
					    /// ```
 | 
				
			||||||
 | 
					    pub fn wait_until(key_event: KeyEvent) {
 | 
				
			||||||
 | 
					        let screen = Screen::new(true);
 | 
				
			||||||
 | 
					        let input = from_screen(&screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let mut stdin = input.read_async().bytes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        loop {
 | 
				
			||||||
 | 
					            let pressed_key: Option<Result<u8, Error>> = stdin.next();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            match pressed_key {
 | 
				
			||||||
 | 
					                Some(Ok(value)) => {
 | 
				
			||||||
 | 
					                    match key_event {
 | 
				
			||||||
 | 
					                        KeyEvent::OnKeyPress(ascii_code) => if value == ascii_code { break; },
 | 
				
			||||||
 | 
					                        KeyEvent::OnEnter => if value == b'\r' { break; },
 | 
				
			||||||
 | 
					                        KeyEvent::OnAnyKeyPress => {
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                _ => {}
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // some sleeping time so that we don't 'dos' our cpu.
 | 
				
			||||||
 | 
					            thread::sleep(Duration::from_millis(10));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Get an Terminal Input implementation whereon input related actions can be performed.
 | 
					/// Get an Terminal Input implementation whereon input related actions can be performed.
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,16 @@ pub struct AsyncReader {
 | 
				
			|||||||
    recv: mpsc::Receiver<io::Result<u8>>,
 | 
					    recv: mpsc::Receiver<io::Result<u8>>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This enum represents a key event that from the user.
 | 
				
			||||||
 | 
					pub enum KeyEvent {
 | 
				
			||||||
 | 
					    /// Represents a specific key press.
 | 
				
			||||||
 | 
					    OnKeyPress(u8),
 | 
				
			||||||
 | 
					    /// Represents a key press from any key.
 | 
				
			||||||
 | 
					    OnAnyKeyPress,
 | 
				
			||||||
 | 
					    /// Represents a key press from enter.
 | 
				
			||||||
 | 
					    OnEnter,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Read for AsyncReader {
 | 
					impl Read for AsyncReader {
 | 
				
			||||||
    /// Read from the byte stream.
 | 
					    /// Read from the byte stream.
 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user