Add Windows 10 support
I tried the merge request !151 but found it wasn't really working. This MR adds commits to that.
Running e.g. the
keys example seemed to be somewhat working when started with
cargo run --example keys, but wasn't working if started directly as
target\debug\examples\keys.exe: escape sequences were just printed on the screen instead of controlling the output. It seems
cargo leaves the console in the Virtual Terminal mode, thus hiding the fact that
termion didn't properly set up the console. Even when started from
cargo, keyboard input was not handled properly.
I fixed the problems I noticed in the original MR:
- Fix unused imports.
- Fix "termion::sys::tty::is_tty()".
- Add support for using escape sequences and reading special keys on Windows 10.
Then I changed some of the examples to make it easier to test the various features:
- Print keys using Debug trait in examples/keys.rs.
- Show more color and style features in examples/color.rs.
- Print mouse events in examples/mouse.rs.
Finally I added some tests for
parse_csi() and fixed the panics those tests discovered:
- Fix a comment.
- Normalize indentation in "event::parse_csi()".
- Simplify pattern matching in "event::parse_csi()".
- Simplify pattern matching in "event::parse_csi()" with "ok()?".
- Add tests for "CSI <" and fix "event::parse_csi()" not to panic.
- Add tests for "CSI M" and fix "event::parse_csi()" not to panic.
- Fix invalid tests.
- Simplify matching "CSI M" in "event::parse_csi()".
- Add tests for "CSI ... M" and fix "event::parse_csi()" not to panic.
- Add tests for "CSI ... ~" and fix "event::parse_csi()" not to panic.
There are still some shortcomings in Windows support:
- Control-j, control-m and Enter are all reported as
- Control-z ends the input iterator (because of CTRL_Z_MASK in
- Control-arrow keys are not supported (
termiondoesn't parse multiple arguments)
- Window resize events are not received
- Only Windows 10.0.10586 and later is supported (some features starting from 10.0.14393)
All of these problems could be avoided by using the Windows Console API to get key and windows size events directly.