tty-reader icon indicating copy to clipboard operation
tty-reader copied to clipboard

Overload nonblock semantics with a timeout value

Open kmayer opened this issue 3 years ago • 0 comments

Useful if you have an application that would like to sleep at the end of every loop. This will let it wait for & collect the keypress until the sleep would have expired.

For example, this loop will sleep until approximately the start of the next second on the system clock.

loop do
  draw
  now = Time.now.to_f
  codes = reader.read_keypress(raw: true, nonblock: (now.ceil(0) - now))
  command.interpret(codes) if codes
end

Describe the change

Overload the semantics of the nonblock so that it can take a timeout value as well as Boolean.

Why are we doing this?

I'm building an application that is like top: It updates the terminal screen at 1 second intervals, and needs to listen to keyboard commands. I was having trouble capturing the key presses in my event loop. I had a sleep in the loop, but then I noticed that Console#get_char# has a TIMEOUT` constant.

Benefits

This adds a useful feature for writing looping applications.

Drawbacks

Not supported in win_console.

This may not be the best approach for this type of application. I did a bunch of experimentation before I got this to work to my satisfaction.

There are no tests around the nonblock option, and I'm not sure how to test a timeout option without introducing something like the Timecop gem to the development environment.

Requirements

  • [ ] Tests written & passing locally?
  • [X] Code style checked?
  • [X] Rebased with master branch?
  • [X] Documentation updated?
  • [ ] Changelog updated?

kmayer avatar May 28 '22 17:05 kmayer