Implement windows focus key press/release on Windows (#1307)
* X11: Sync key press/release with window focus * When a window loses focus, key release events are issued for all pressed keys * When a window gains focus, key press events are issued for all pressed keys * Adds `is_synthetic` field to `WindowEvent` variant `KeyboardInput` to indicate that these events are synthetic. * Adds `is_synthetic: false` to `WindowEvent::KeyboardInput` events issued on all other platforms * Implement windows focus key press/release on Windows * Docs Co-authored-by: Murarth <murarth@gmail.com>
This commit is contained in:
parent
5d99316c96
commit
cc206d31b7
4 changed files with 57 additions and 3 deletions
|
|
@ -1421,7 +1421,27 @@ unsafe extern "system" fn public_window_callback<T>(
|
|||
}
|
||||
|
||||
winuser::WM_SETFOCUS => {
|
||||
use crate::event::WindowEvent::Focused;
|
||||
use crate::event::{ElementState::Released, WindowEvent::Focused};
|
||||
for windows_keycode in event::get_pressed_keys() {
|
||||
let scancode =
|
||||
winuser::MapVirtualKeyA(windows_keycode as _, winuser::MAPVK_VK_TO_VSC);
|
||||
let virtual_keycode = event::vkey_to_winit_vkey(windows_keycode);
|
||||
|
||||
subclass_input.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(WindowId(window)),
|
||||
event: WindowEvent::KeyboardInput {
|
||||
device_id: DEVICE_ID,
|
||||
input: KeyboardInput {
|
||||
scancode,
|
||||
virtual_keycode,
|
||||
state: Released,
|
||||
modifiers: event::get_key_mods(),
|
||||
},
|
||||
is_synthetic: true,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
subclass_input.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(WindowId(window)),
|
||||
event: Focused(true),
|
||||
|
|
@ -1431,7 +1451,27 @@ unsafe extern "system" fn public_window_callback<T>(
|
|||
}
|
||||
|
||||
winuser::WM_KILLFOCUS => {
|
||||
use crate::event::WindowEvent::Focused;
|
||||
use crate::event::{ElementState::Released, WindowEvent::Focused};
|
||||
for windows_keycode in event::get_pressed_keys() {
|
||||
let scancode =
|
||||
winuser::MapVirtualKeyA(windows_keycode as _, winuser::MAPVK_VK_TO_VSC);
|
||||
let virtual_keycode = event::vkey_to_winit_vkey(windows_keycode);
|
||||
|
||||
subclass_input.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(WindowId(window)),
|
||||
event: WindowEvent::KeyboardInput {
|
||||
device_id: DEVICE_ID,
|
||||
input: KeyboardInput {
|
||||
scancode,
|
||||
virtual_keycode,
|
||||
state: Released,
|
||||
modifiers: event::get_key_mods(),
|
||||
},
|
||||
is_synthetic: true,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
subclass_input.send_event(Event::WindowEvent {
|
||||
window_id: RootWindowId(WindowId(window)),
|
||||
event: Focused(false),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue