Merge branch 'master' of github.com:crossterm-rs/crossterm
This commit is contained in:
		
						commit
						6d0590454f
					
				| @ -1,4 +1,4 @@ | |||||||
| use crossterm_winapi::ConsoleMode; | use crossterm_winapi::{ConsoleMode, Handle}; | ||||||
| use winapi::um::wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING; | use winapi::um::wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING; | ||||||
| 
 | 
 | ||||||
| use lazy_static::lazy_static; | use lazy_static::lazy_static; | ||||||
| @ -17,7 +17,7 @@ use crate::Result; | |||||||
| pub(crate) fn set_virtual_terminal_processing(yes: bool) -> Result<()> { | pub(crate) fn set_virtual_terminal_processing(yes: bool) -> Result<()> { | ||||||
|     let mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING; |     let mask = ENABLE_VIRTUAL_TERMINAL_PROCESSING; | ||||||
| 
 | 
 | ||||||
|     let console_mode = ConsoleMode::new()?; |     let console_mode = ConsoleMode::from(Handle::current_out_handle()?); | ||||||
|     let old_mode = console_mode.mode()?; |     let old_mode = console_mode.mode()?; | ||||||
| 
 | 
 | ||||||
|     let new_mode = if yes { |     let new_mode = if yes { | ||||||
|  | |||||||
| @ -90,13 +90,14 @@ impl Colored { | |||||||
|     /// This is the string that would appear within an `ESC [ <str> m` escape sequence, as found in
 |     /// This is the string that would appear within an `ESC [ <str> m` escape sequence, as found in
 | ||||||
|     /// various configuration files.
 |     /// various configuration files.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// For example: `38;5;0 -> ForegroundColor(Black)`,
 |     /// For example:
 | ||||||
|     ///              `38;5;26 -> ForegroundColor(AnsiValue(26))`
 |     /// * `38;5;0 -> ForegroundColor(Black)`,
 | ||||||
|     ///              `48;2;50;60;70 -> BackgroundColor(Rgb(50, 60, 70))`
 |     /// * `38;5;26 -> ForegroundColor(AnsiValue(26))`
 | ||||||
|     ///              `49 -> BackgroundColor(Reset)`
 |     /// * `48;2;50;60;70 -> BackgroundColor(Rgb(50, 60, 70))`
 | ||||||
|     /// Invalid sequences map to None.
 |     /// * `49 -> BackgroundColor(Reset)`
 | ||||||
|  |     /// Invalid sequences map to `None`.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// Currently, 3/4 bit color values aren't supported so return None.
 |     /// Currently, 3/4 bit color values aren't supported so return `None`.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// See also: [Color::parse_ansi](enum.Color.html#method.parse_ansi)
 |     /// See also: [Color::parse_ansi](enum.Color.html#method.parse_ansi)
 | ||||||
|     pub fn parse_ansi(ansi: &str) -> Option<Self> { |     pub fn parse_ansi(ansi: &str) -> Option<Self> { | ||||||
| @ -124,10 +125,13 @@ impl Colored { | |||||||
| 
 | 
 | ||||||
| impl<'a> Color { | impl<'a> Color { | ||||||
|     /// Parses an ANSI color sequence.
 |     /// Parses an ANSI color sequence.
 | ||||||
|     /// For example: `5;0 -> Black`, `5;26 -> AnsiValue(26)`, `2;50;60;70 -> Rgb(50, 60, 70)`.
 |     /// For example:
 | ||||||
|     /// Invalid sequences map to None.
 |     /// * `5;0 -> Black`,
 | ||||||
|  |     /// * `5;26 -> AnsiValue(26)`,
 | ||||||
|  |     /// * `2;50;60;70 -> Rgb(50, 60, 70)`.
 | ||||||
|  |     /// Invalid sequences map to `None`.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// Currently, 3/4 bit color values aren't supported so return None.
 |     /// Currently, 3/4 bit color values aren't supported so return `None`.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// See also: [Colored::parse_ansi](enum.Colored.html#method.parse_ansi)
 |     /// See also: [Colored::parse_ansi](enum.Colored.html#method.parse_ansi)
 | ||||||
|     pub fn parse_ansi(ansi: &str) -> Option<Self> { |     pub fn parse_ansi(ansi: &str) -> Option<Self> { | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| //! UNIX related logic for terminal manipulation.
 | //! UNIX related logic for terminal manipulation.
 | ||||||
| use std::{io, mem, process, sync::Mutex}; | use std::{io, mem, process, sync::Mutex}; | ||||||
| 
 | 
 | ||||||
| use crate::event::sys::unix::file_descriptor::FileDesc; | use crate::event::sys::unix::file_descriptor::{tty_fd, FileDesc}; | ||||||
| use lazy_static::lazy_static; | use lazy_static::lazy_static; | ||||||
| use libc::{ | use libc::{ | ||||||
|     cfmakeraw, ioctl, tcgetattr, tcsetattr, termios as Termios, winsize, STDIN_FILENO, |     cfmakeraw, ioctl, tcgetattr, tcsetattr, termios as Termios, winsize, STDOUT_FILENO, TCSANOW, | ||||||
|     STDOUT_FILENO, TCSANOW, TIOCGWINSZ, |     TIOCGWINSZ, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| use crate::error::{ErrorKind, Result}; | use crate::error::{ErrorKind, Result}; | ||||||
| use std::fs::File; | use std::fs::File; | ||||||
| use std::os::unix::io::IntoRawFd; | use std::os::unix::io::{IntoRawFd, RawFd}; | ||||||
| 
 | 
 | ||||||
| lazy_static! { | lazy_static! { | ||||||
|     // Some(Termios) -> we're in the raw mode and this is the previous mode
 |     // Some(Termios) -> we're in the raw mode and this is the previous mode
 | ||||||
| @ -54,11 +54,13 @@ pub(crate) fn enable_raw_mode() -> Result<()> { | |||||||
|         return Ok(()); |         return Ok(()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     let mut ios = get_terminal_attr()?; |     let tty = tty_fd()?; | ||||||
|  |     let fd = tty.raw_fd(); | ||||||
|  |     let mut ios = get_terminal_attr(fd)?; | ||||||
|     let original_mode_ios = ios; |     let original_mode_ios = ios; | ||||||
| 
 | 
 | ||||||
|     raw_terminal_attr(&mut ios); |     raw_terminal_attr(&mut ios); | ||||||
|     set_terminal_attr(&ios)?; |     set_terminal_attr(fd, &ios)?; | ||||||
| 
 | 
 | ||||||
|     // Keep it last - set the original mode only if we were able to switch to the raw mode
 |     // Keep it last - set the original mode only if we were able to switch to the raw mode
 | ||||||
|     *original_mode = Some(original_mode_ios); |     *original_mode = Some(original_mode_ios); | ||||||
| @ -70,7 +72,8 @@ pub(crate) fn disable_raw_mode() -> Result<()> { | |||||||
|     let mut original_mode = TERMINAL_MODE_PRIOR_RAW_MODE.lock().unwrap(); |     let mut original_mode = TERMINAL_MODE_PRIOR_RAW_MODE.lock().unwrap(); | ||||||
| 
 | 
 | ||||||
|     if let Some(original_mode_ios) = original_mode.as_ref() { |     if let Some(original_mode_ios) = original_mode.as_ref() { | ||||||
|         set_terminal_attr(original_mode_ios)?; |         let tty = tty_fd()?; | ||||||
|  |         set_terminal_attr(tty.raw_fd(), original_mode_ios)?; | ||||||
|         // Keep it last - remove the original mode only if we were able to switch back
 |         // Keep it last - remove the original mode only if we were able to switch back
 | ||||||
|         *original_mode = None; |         *original_mode = None; | ||||||
|     } |     } | ||||||
| @ -116,16 +119,16 @@ fn raw_terminal_attr(termios: &mut Termios) { | |||||||
|     unsafe { cfmakeraw(termios) } |     unsafe { cfmakeraw(termios) } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn get_terminal_attr() -> Result<Termios> { | fn get_terminal_attr(fd: RawFd) -> Result<Termios> { | ||||||
|     unsafe { |     unsafe { | ||||||
|         let mut termios = mem::zeroed(); |         let mut termios = mem::zeroed(); | ||||||
|         wrap_with_result(tcgetattr(STDIN_FILENO, &mut termios))?; |         wrap_with_result(tcgetattr(fd, &mut termios))?; | ||||||
|         Ok(termios) |         Ok(termios) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn set_terminal_attr(termios: &Termios) -> Result<bool> { | fn set_terminal_attr(fd: RawFd, termios: &Termios) -> Result<bool> { | ||||||
|     wrap_with_result(unsafe { tcsetattr(STDIN_FILENO, TCSANOW, termios) }) |     wrap_with_result(unsafe { tcsetattr(fd, TCSANOW, termios) }) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn wrap_with_result(result: i32) -> Result<bool> { | pub fn wrap_with_result(result: i32) -> Result<bool> { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user