async-rs / async-std

Async version of the Rust standard library

Home Page:https://async.rs

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

The first terminal event is ignored after using `stdin`

dalance opened this issue · comments

I want to use async_std::io::std and terminal event after it.
But the first event seems to be ignored.
The procedure of reproduce is below:

use crossterm::event::{read, Event};
use crossterm::terminal;
use std::time::Duration;

fn main() {
    let buf = async_std::task::block_on(async_std::io::timeout(Duration::new(1, 0), async {
        use async_std::io::ReadExt;
        let mut buf = [0; 1];
        let mut stdin = async_std::io::stdin();
        let _ = stdin.read_exact(&mut buf).await?;
        Ok(buf)
    }));
    dbg!(buf);

    terminal::enable_raw_mode().unwrap();

    println!("{:?}", read());

    terminal::disable_raw_mode().unwrap();
}
  • run the above code
  • wait until dbg! message is shown
  • press any key

The expected result is that the first key pressing is shown.
Actually the first key pressing is ignored, and the second key pressing is shown.

If let buf = ... code block is commented out, the first key pressing is shown.

This behaviour seems to be the same as tokio.

The behaviour seems to known limitation.
I'll close this.