Rust · 2519 bytes Raw Blame History
1 // Simple key event debugger
2 // Run with: cargo run --bin keytest
3
4 use crossterm::{
5 event::{self, Event, KeyCode, KeyEvent, KeyModifiers, PushKeyboardEnhancementFlags, PopKeyboardEnhancementFlags, KeyboardEnhancementFlags},
6 terminal::{self, EnterAlternateScreen, LeaveAlternateScreen},
7 execute,
8 };
9 use std::io::{self, Write};
10
11 fn main() -> io::Result<()> {
12 terminal::enable_raw_mode()?;
13 execute!(io::stdout(), EnterAlternateScreen)?;
14
15 // Try to enable keyboard enhancement (same flags as main editor)
16 // REPORT_ALTERNATE_KEYS makes crossterm use the shifted character directly
17 let enhanced = execute!(
18 io::stdout(),
19 PushKeyboardEnhancementFlags(
20 KeyboardEnhancementFlags::DISAMBIGUATE_ESCAPE_CODES
21 | KeyboardEnhancementFlags::REPORT_ALTERNATE_KEYS
22 )
23 ).is_ok();
24
25 println!("Keyboard enhancement: {}\r", if enhanced { "enabled" } else { "disabled" });
26 println!("Press keys to see events (Ctrl+C to quit)\r\n");
27
28 loop {
29 if event::poll(std::time::Duration::from_millis(100))? {
30 match event::read()? {
31 Event::Key(KeyEvent { code, modifiers, kind, state }) => {
32 let ctrl = modifiers.contains(KeyModifiers::CONTROL);
33 let alt = modifiers.contains(KeyModifiers::ALT);
34 let shift = modifiers.contains(KeyModifiers::SHIFT);
35
36 // Show raw char value for debugging control characters
37 let char_info = if let KeyCode::Char(c) = code {
38 format!(" (0x{:02X})", c as u8)
39 } else {
40 String::new()
41 };
42 println!(
43 "Key: {:?}{} | Modifiers: ctrl={} alt={} shift={} | Kind: {:?} | State: {:?}\r",
44 code, char_info, ctrl, alt, shift, kind, state
45 );
46
47 // Quit on Ctrl+C
48 if let KeyCode::Char('c') = code {
49 if ctrl {
50 break;
51 }
52 }
53 }
54 Event::Resize(w, h) => {
55 println!("Resize: {}x{}\r", w, h);
56 }
57 _ => {}
58 }
59 }
60 }
61
62 if enhanced {
63 let _ = execute!(io::stdout(), PopKeyboardEnhancementFlags);
64 }
65 execute!(io::stdout(), LeaveAlternateScreen)?;
66 terminal::disable_raw_mode()?;
67
68 Ok(())
69 }
70