//! Demonstrates how to block read events. //! //! cargo run --example event-read use std::io; use keyfork_crossterm::event::{ poll, KeyboardEnhancementFlags, PopKeyboardEnhancementFlags, PushKeyboardEnhancementFlags, }; use keyfork_crossterm::{ cursor::position, event::{ read, DisableBracketedPaste, DisableFocusChange, DisableMouseCapture, EnableBracketedPaste, EnableFocusChange, EnableMouseCapture, Event, KeyCode, }, execute, queue, terminal::{disable_raw_mode, enable_raw_mode}, }; 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() -> io::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); } } (first_resize, last_resize) } fn main() -> io::Result<()> { println!("{}", HELP); enable_raw_mode()?; let mut stdout = io::stdout(); let supports_keyboard_enhancement = matches!( keyfork_crossterm::terminal::supports_keyboard_enhancement(), Ok(true) ); if supports_keyboard_enhancement { queue!( stdout, PushKeyboardEnhancementFlags( KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES | KeyboardEnhancementFlags::REPORT_ALL_KEYS_AS_ESCAPE_CODES | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS | KeyboardEnhancementFlags::REPORT_EVENT_TYPES ) )?; } execute!( stdout, EnableBracketedPaste, EnableFocusChange, EnableMouseCapture, )?; if let Err(e) = print_events() { println!("Error: {:?}\r", e); } if supports_keyboard_enhancement { queue!(stdout, PopKeyboardEnhancementFlags)?; } execute!( stdout, DisableBracketedPaste, PopKeyboardEnhancementFlags, DisableFocusChange, DisableMouseCapture )?; disable_raw_mode() }