Work around codegen bug with GetKeyboardState (#41970)
Works around an issue, which can be reproduced in the following program:
```rs
use windows::Win32::UI::Input::KeyboardAndMouse::{GetKeyboardState, VK_CONTROL};
fn main() {
let mut keyboard_state = [0u8; 256];
unsafe {
GetKeyboardState(&mut keyboard_state).unwrap();
}
let ctrl_down = (keyboard_state[VK_CONTROL.0 as usize] & 0x80) != 0;
println!("Is Ctrl down: {ctrl_down}");
}
```
In debug mode, this program prints the correct answer. In release mode,
it always prints false. The optimizer appears to think that
`keyboard_state` isn't mutated and remains zeroed, and folds the
`modifier_down` comparisons to `false`.
Release Notes:
- N/A
This commit is contained in:
@@ -26,10 +26,8 @@ pub struct KeyDownEvent {
|
||||
/// Whether the key is currently held down.
|
||||
pub is_held: bool,
|
||||
|
||||
/// Whether the modifiers are excessive for producing this character.
|
||||
/// When false, the modifiers are essential for character input (e.g., AltGr),
|
||||
/// and character input should be prioritized over keybindings.
|
||||
/// When true, the modifiers are for keybindings (e.g., Ctrl+A).
|
||||
/// Whether to prefer character input over keybindings for this keystroke.
|
||||
/// In some cases, like AltGr on Windows, modifiers are significant for character input.
|
||||
pub prefer_character_input: bool,
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user