Refactoring Unix routines for terminal info (#154)
This commit is contained in:
		
							parent
							
								
									e1b8da03ba
								
							
						
					
					
						commit
						0f1e275216
					
				@ -1,36 +1,25 @@
 | 
				
			|||||||
use libc::{c_ushort, ioctl, STDOUT_FILENO, TIOCGWINSZ};
 | 
					use libc::{ioctl, winsize, STDOUT_FILENO, TIOCGWINSZ};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn exit() {
 | 
					pub fn exit() {
 | 
				
			||||||
    ::std::process::exit(0);
 | 
					    ::std::process::exit(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// A representation of the size of the current terminal.
 | 
					 | 
				
			||||||
#[repr(C)]
 | 
					 | 
				
			||||||
#[derive(Debug)]
 | 
					 | 
				
			||||||
pub struct UnixSize {
 | 
					 | 
				
			||||||
    /// number of rows
 | 
					 | 
				
			||||||
    pub rows: c_ushort,
 | 
					 | 
				
			||||||
    /// number of columns
 | 
					 | 
				
			||||||
    pub cols: c_ushort,
 | 
					 | 
				
			||||||
    pub ws_xpixel: c_ushort,
 | 
					 | 
				
			||||||
    pub ws_ypixel: c_ushort,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// Get the current terminal size.
 | 
					/// Get the current terminal size.
 | 
				
			||||||
pub fn get_terminal_size() -> (u16, u16) {
 | 
					pub fn get_terminal_size() -> (u16, u16) {
 | 
				
			||||||
    // http://rosettacode.org/wiki/Terminal_control/Dimensions#Library:_BSD_libc
 | 
					    // http://rosettacode.org/wiki/Terminal_control/Dimensions#Library:_BSD_libc
 | 
				
			||||||
    let us = UnixSize {
 | 
					    let mut size = winsize {
 | 
				
			||||||
        rows: 0,
 | 
					        ws_row: 0,
 | 
				
			||||||
        cols: 0,
 | 
					        ws_col: 0,
 | 
				
			||||||
        ws_xpixel: 0,
 | 
					        ws_xpixel: 0,
 | 
				
			||||||
        ws_ypixel: 0,
 | 
					        ws_ypixel: 0,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					    let r = unsafe { ioctl(STDOUT_FILENO, TIOCGWINSZ.into(), &mut size) };
 | 
				
			||||||
    let r = unsafe { ioctl(STDOUT_FILENO, TIOCGWINSZ.into(), &us) };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if r == 0 {
 | 
					    if r == 0 {
 | 
				
			||||||
        // because crossterm works starts counting at 0 and unix terminal starts at cell 1 you have subtract one to get 0-based results.
 | 
					        // because crossterm works starts counting at 0
 | 
				
			||||||
        (us.cols - 1, us.rows - 1)
 | 
					        // and unix terminal starts at cell 1
 | 
				
			||||||
 | 
					        // you have subtract one to get 0-based results.
 | 
				
			||||||
 | 
					        (size.ws_col - 1, size.ws_row - 1)
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        (0, 0)
 | 
					        (0, 0)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user