Support key release events for windows. (#745)

This commit is contained in:
Timon 2023-01-28 11:05:31 +01:00 committed by GitHub
parent a993a98291
commit 318f810a39
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 24 additions and 22 deletions

View File

@ -328,7 +328,7 @@ impl Command for Show {
} }
/// A command that enables blinking of the terminal cursor. /// A command that enables blinking of the terminal cursor.
/// ///
/// # Notes /// # Notes
/// ///
/// - Some Unix terminals (ex: GNOME and Konsole) as well as Windows versions lower than Windows 10 do not support this functionality. /// - Some Unix terminals (ex: GNOME and Konsole) as well as Windows versions lower than Windows 10 do not support this functionality.

View File

@ -134,20 +134,14 @@ impl ScreenBufferCursor {
if x < 0 { if x < 0 {
return Err(io::Error::new( return Err(io::Error::new(
io::ErrorKind::Other, io::ErrorKind::Other,
format!( format!("Argument Out of Range Exception when setting cursor position to X: {x}"),
"Argument Out of Range Exception when setting cursor position to X: {}",
x
),
)); ));
} }
if y < 0 { if y < 0 {
return Err(io::Error::new( return Err(io::Error::new(
io::ErrorKind::Other, io::ErrorKind::Other,
format!( format!("Argument Out of Range Exception when setting cursor position to Y: {y}"),
"Argument Out of Range Exception when setting cursor position to Y: {}",
y
),
)); ));
} }

View File

@ -643,7 +643,9 @@ pub struct KeyEvent {
pub modifiers: KeyModifiers, pub modifiers: KeyModifiers,
/// Kind of event. /// Kind of event.
/// ///
/// Only set if [`KeyboardEnhancementFlags::REPORT_EVENT_TYPES`] has been enabled with [`PushKeyboardEnhancementFlags`]. /// Only set if:
/// - Unix: [`KeyboardEnhancementFlags::REPORT_EVENT_TYPES`] has been enabled with [`PushKeyboardEnhancementFlags`].
/// - Windows: always
pub kind: KeyEventKind, pub kind: KeyEventKind,
/// Keyboard state. /// Keyboard state.
/// ///

View File

@ -13,7 +13,7 @@ use winapi::um::{
}; };
use crate::{ use crate::{
event::{Event, KeyCode, KeyEvent, KeyModifiers, MouseButton, MouseEventKind}, event::{Event, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseButton, MouseEventKind},
Result, Result,
}; };
@ -221,7 +221,12 @@ fn parse_key_event_record(key_event: &KeyEventRecord) -> Option<WindowsKeyEvent>
// values. // values.
let ch = std::char::from_u32(unicode_scalar_value as u32).unwrap(); let ch = std::char::from_u32(unicode_scalar_value as u32).unwrap();
let key_code = KeyCode::Char(ch); let key_code = KeyCode::Char(ch);
let key_event = KeyEvent::new(key_code, modifiers); let kind = if key_event.key_down {
KeyEventKind::Press
} else {
KeyEventKind::Release
};
let key_event = KeyEvent::new_with_kind(key_code, modifiers, kind);
return Some(WindowsKeyEvent::KeyEvent(key_event)); return Some(WindowsKeyEvent::KeyEvent(key_event));
} }
} }
@ -235,10 +240,6 @@ fn parse_key_event_record(key_event: &KeyEventRecord) -> Option<WindowsKeyEvent>
return None; return None;
} }
if !key_event.key_down {
return None;
}
let parse_result = match virtual_key_code { let parse_result = match virtual_key_code {
VK_SHIFT | VK_CONTROL | VK_MENU => None, VK_SHIFT | VK_CONTROL | VK_MENU => None,
VK_BACK => Some(KeyCode::Backspace), VK_BACK => Some(KeyCode::Backspace),
@ -283,7 +284,12 @@ fn parse_key_event_record(key_event: &KeyEventRecord) -> Option<WindowsKeyEvent>
}; };
if let Some(key_code) = parse_result { if let Some(key_code) = parse_result {
let key_event = KeyEvent::new(key_code, modifiers); let kind = if key_event.key_down {
KeyEventKind::Press
} else {
KeyEventKind::Release
};
let key_event = KeyEvent::new_with_kind(key_code, modifiers, kind);
return Some(WindowsKeyEvent::KeyEvent(key_event)); return Some(WindowsKeyEvent::KeyEvent(key_event));
} }

View File

@ -114,8 +114,8 @@ impl fmt::Display for Colored {
Color::DarkCyan => f.write_str("5;6"), Color::DarkCyan => f.write_str("5;6"),
Color::White => f.write_str("5;15"), Color::White => f.write_str("5;15"),
Color::Grey => f.write_str("5;7"), Color::Grey => f.write_str("5;7"),
Color::Rgb { r, g, b } => write!(f, "2;{};{};{}", r, g, b), Color::Rgb { r, g, b } => write!(f, "2;{r};{g};{b}"),
Color::AnsiValue(val) => write!(f, "5;{}", val), Color::AnsiValue(val) => write!(f, "5;{val}"),
_ => Ok(()), _ => Ok(()),
} }
} }

View File

@ -195,13 +195,13 @@ pub(crate) fn set_size(width: u16, height: u16) -> Result<()> {
if width > bounds.x { if width > bounds.x {
return Err(ErrorKind::new( return Err(ErrorKind::new(
io::ErrorKind::InvalidInput, io::ErrorKind::InvalidInput,
format!("terminal width {} too large", width), format!("terminal width {width} too large"),
)); ));
} }
if height > bounds.y { if height > bounds.y {
return Err(ErrorKind::new( return Err(ErrorKind::new(
io::ErrorKind::InvalidInput, io::ErrorKind::InvalidInput,
format!("terminal height {} too large", height), format!("terminal height {height} too large"),
)); ));
} }
@ -218,7 +218,7 @@ pub(crate) fn set_window_title(title: impl fmt::Display) -> Result<()> {
} }
let mut title_utf16 = Utf16Encoder(Vec::new()); let mut title_utf16 = Utf16Encoder(Vec::new());
write!(title_utf16, "{}", title).expect("formatting failed"); write!(title_utf16, "{title}").expect("formatting failed");
title_utf16.0.push(0); title_utf16.0.push(0);
let title = title_utf16.0; let title = title_utf16.0;