Last active
March 30, 2022 15:37
-
-
Save lskbr/acb8634d6c69c6de1cfce7cc7346b8e6 to your computer and use it in GitHub Desktop.
Inkey function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
extern crate epoll; | |
extern crate libc; | |
extern crate termion; | |
use std::io; | |
use std::io::{Read, Write}; | |
use std::os::unix::io::AsRawFd; | |
use termion::raw::IntoRawMode; | |
/// Waits for a key press timeout milisseconds | |
/// 0 - no wait | |
/// <0 - wait until a key is pressed | |
/// >0 wait for an event or timeout millisecods for an event. | |
fn inkey(timeout: i32) -> bool { | |
let input = io::stdin(); | |
let _output = io::stdout().into_raw_mode().unwrap(); | |
let fd = input.as_raw_fd(); | |
let pool = epoll::create(true).unwrap(); | |
let e = epoll::Event { | |
events: epoll::Events::EPOLLIN.bits(), | |
data: 0, | |
}; | |
epoll::ctl(pool, epoll::ControlOptions::EPOLL_CTL_ADD, fd, e); | |
let mut v = [e]; | |
let wresult = epoll::wait(pool, timeout, &mut v).unwrap(); | |
unsafe { | |
libc::close(pool); | |
} | |
return wresult == 1; | |
} | |
fn main() { | |
let mut buffer: [u8; 1] = [0; 1]; | |
let mut x = 0; | |
loop { | |
if inkey(0) { | |
let result = io::stdin().read(&mut buffer); | |
println!("{:?} {:?}", result, buffer); | |
if buffer[0] == 3 { | |
break; | |
} | |
} | |
if x % 1000 == 0 { | |
print!("."); | |
} | |
io::stdout().flush(); | |
x += 1; | |
} | |
} |
fn inkey(timeout: i32) -> bool {
this is so wrong. i can pass only seconds, i either wait 0 seconds or 1 second or N seconds, but i cant wait10 milliseconds
for example.
Can you elaborate? You mean the parameter should be in seconds or you don't find any use to be in milliseconds?
i mean that i cannot pass the timeout as milliseconds
, if I call inkey(100)
like this, it will wait for 100 seconds instead of 100 milliseconds
the parameter should be in milliseconds and its not, i've tried it, just 10 as in inkey(10)
and you will see that the function will wait 10 seconds
instead of 10 milliseconds
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
fn inkey(timeout: i32) -> bool {
this is so wrong. i can pass only seconds, i either wait 0 seconds or 1 second or N seconds, but i cant wait10 milliseconds
for example.