Fix wrong resize size return (#526)

This commit is contained in:
Timon 2020-12-28 10:15:50 +01:00 committed by GitHub
parent 744ec05f19
commit e46decc2f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 2 deletions

View File

@ -47,7 +47,7 @@ version = "0.3.8"
features = ["winuser"]
[target.'cfg(windows)'.dependencies]
crossterm_winapi = "0.6.2"
crossterm_winapi = "0.7.0"
#
# UNIX dependencies

View File

@ -4,6 +4,7 @@
use std::io::stdout;
use crossterm::event::poll;
use crossterm::{
cursor::position,
event::{read, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
@ -11,6 +12,7 @@ use crossterm::{
terminal::{disable_raw_mode, enable_raw_mode},
Result,
};
use std::time::Duration;
const HELP: &str = r#"Blocking read()
- Keyboard, mouse and terminal resize events enabled
@ -29,6 +31,11 @@ fn print_events() -> Result<()> {
println!("Cursor position: {:?}\r", position());
}
if let Event::Resize(_, _) = event {
let (original_size, new_size) = flush_resize_events(event);
println!("Resize from: {:?}, to: {:?}", original_size, new_size);
}
if event == Event::Key(KeyCode::Esc.into()) {
break;
}
@ -37,6 +44,27 @@ fn print_events() -> Result<()> {
Ok(())
}
// Resize events can occur in batches.
// With a simple loop they can be flushed.
// This function will keep the first and last resize event.
fn flush_resize_events(event: Event) -> ((u16, u16), (u16, u16)) {
if let Event::Resize(x, y) = event {
let mut last_resize = (x, y);
loop {
if let Ok(true) = poll(Duration::from_millis(50)) {
if let Ok(Event::Resize(x, y)) = read() {
last_resize = (x, y);
}
} else {
break;
}
}
return ((x, y), last_resize);
}
((0, 0), (0, 0))
}
fn main() -> Result<()> {
println!("{}", HELP);

View File

@ -15,6 +15,8 @@
//! * use the [`read`](fn.read.html) & [`poll`](fn.poll.html) functions on any, but same, thread
//! * or the [`EventStream`](struct.EventStream.html).
//!
//! **Make sure to enable raw mode in order for keyboard events to work properly**
//!
//! ## Mouse Events
//!
//! Mouse events are not enabled by default. You have to enable them with the
@ -273,6 +275,7 @@ pub enum Event {
/// A single mouse event with additional pressed modifiers.
Mouse(MouseEvent),
/// An resize event with new dimensions after resize (columns, rows).
/// **Note** that resize events can be occur in batches.
Resize(u16, u16),
}

View File

@ -34,7 +34,8 @@ impl EventSource for WindowsEventSource {
loop {
if let Some(event_ready) = self.poll.poll(poll_timeout.leftover())? {
if event_ready && self.console.number_of_console_input_events()? != 0 {
let number = self.console.number_of_console_input_events()?;
if event_ready && number != 0 {
let event = match self.console.read_single_input_event()? {
InputRecord::KeyEvent(record) => handle_key_event(record)?,
InputRecord::MouseEvent(record) => handle_mouse_event(record)?,