//! Demonstrates how to block read events. //! //! cargo run --example event-read use std::io::stdout; use crossterm::event::{ poll, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, }; use crossterm::{ cursor::position, event::{ read, DisableBracketedPaste, DisableFocusChange, DisableMouseCapture, EnableBracketedPaste, EnableFocusChange, EnableMouseCapture, Event, KeyCode, }, execute, terminal::{disable_raw_mode, enable_raw_mode}, Result, }; use std::time::Duration; const HELP: &str = r#"Blocking read() - Keyboard, mouse, focus and terminal resize events enabled - Hit "c" to print current cursor position - Use Esc to quit "#; fn print_events() -> Result<()> { loop { // Blocking read let event = read()?; println!("Event: {:?}\r", event); if event == Event::Key(KeyCode::Char('c').into()) { println!("Cursor position: {:?}\r", position()); } if let Event::Resize(x, y) = event { let (original_size, new_size) = flush_resize_events((x, y)); println!("Resize from: {:?}, to: {:?}\r", original_size, new_size); } if event == Event::Key(KeyCode::Esc.into()) { break; } } Ok(()) } // Resize events can occur in batches. // With a simple loop they can be flushed. // This function will keep the first and last resize event. fn flush_resize_events(first_resize: (u16, u16)) -> ((u16, u16), (u16, u16)) { let mut last_resize = first_resize; while let Ok(true) = poll(Duration::from_millis(50)) { if let Ok(Event::Resize(x, y)) = read() { last_resize = (x, y); } } return (first_resize, last_resize); } fn main() -> Result<()> { println!("{}", HELP); enable_raw_mode()?; let mut stdout = stdout(); execute!( stdout, EnableBracketedPaste, EnableFocusChange, EnableMouseCapture PushKeyboardEnhancementFlags( KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES | KeyboardEnhancementFlags::REPORT_ALL_KEYS_AS_ESCAPE_CODES | KeyboardEnhancementFlags::REPORT_EVENT_TYPES ) )?; if let Err(e) = print_events() { println!("Error: {:?}\r", e); } execute!( stdout, DisableBracketedPaste, PopKeyboardEnhancementFlags, DisableFocusChange, DisableMouseCapture )?; disable_raw_mode() }