//! Demonstrates how to match on modifiers like: Control, alt, shift. //! //! cargo run --example event-poll-read use std::{io, time::Duration}; use crossterm::{ cursor::position, event::{poll, read, DisableMouseCapture, EnableMouseCapture, Event, KeyCode}, execute, terminal::{disable_raw_mode, enable_raw_mode}, }; const HELP: &str = r#"Blocking poll() & non-blocking read() - Keyboard, mouse and terminal resize events enabled - Prints "." every second if there's no event - Hit "c" to print current cursor position - Use Esc to quit "#; fn print_events() -> io::Result<()> { loop { // Wait up to 1s for another event if poll(Duration::from_millis(1_000))? { // It's guaranteed that read() won't block if `poll` returns `Ok(true)` let event = read()?; println!("Event::{:?}\r", event); if event == Event::Key(KeyCode::Char('c').into()) { println!("Cursor position: {:?}\r", position()); } if event == Event::Key(KeyCode::Esc.into()) { break; } } else { // Timeout expired, no event for 1s println!(".\r"); } } Ok(()) } fn main() -> io::Result<()> { println!("{}", HELP); enable_raw_mode()?; let mut stdout = io::stdout(); execute!(stdout, EnableMouseCapture)?; if let Err(e) = print_events() { println!("Error: {:?}\r", e); } execute!(stdout, DisableMouseCapture)?; disable_raw_mode() }