Fix window drop on Wayland

In some scenarious of window dropping the callback for keyboard
may run after the window was dropped.
This commit is contained in:
Kirill Chibisov 2023-02-02 14:42:34 +03:00 committed by GitHub
parent 1eb1a13a77
commit 7029ce6ecd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 8 deletions

View file

@ -8,6 +8,8 @@ And please only add new entries to the top of this list, right below the `# Unre
# Unreleased # Unreleased
- On Wayland, fix crash when dropping a window in multi-window setup.
# 0.28.0 # 0.28.0
- On macOS, fixed `Ime::Commit` persisting for all input after interacting with `Ime`. - On macOS, fixed `Ime::Commit` persisting for all input after interacting with `Ime`.

View file

@ -24,7 +24,10 @@ pub(super) fn handle_keyboard(
KeyboardEvent::Enter { surface, .. } => { KeyboardEvent::Enter { surface, .. } => {
let window_id = wayland::make_wid(&surface); let window_id = wayland::make_wid(&surface);
let window_handle = winit_state.window_map.get_mut(&window_id).unwrap(); let window_handle = match winit_state.window_map.get_mut(&window_id) {
Some(window_handle) => window_handle,
None => return,
};
window_handle.has_focus.store(true, Ordering::Relaxed); window_handle.has_focus.store(true, Ordering::Relaxed);
// Window gained focus. // Window gained focus.
@ -39,7 +42,14 @@ pub(super) fn handle_keyboard(
inner.target_window_id = Some(window_id); inner.target_window_id = Some(window_id);
} }
KeyboardEvent::Leave { surface, .. } => { KeyboardEvent::Leave { surface, .. } => {
// Reset the id.
inner.target_window_id = None;
let window_id = wayland::make_wid(&surface); let window_id = wayland::make_wid(&surface);
let window_handle = match winit_state.window_map.get_mut(&window_id) {
Some(window_handle) => window_handle,
None => return,
};
// Notify that no modifiers are being pressed. // Notify that no modifiers are being pressed.
if !inner.modifiers_state.borrow().is_empty() { if !inner.modifiers_state.borrow().is_empty() {
@ -49,14 +59,10 @@ pub(super) fn handle_keyboard(
); );
} }
let window_handle = winit_state.window_map.get_mut(&window_id).unwrap();
window_handle.has_focus.store(false, Ordering::Relaxed); window_handle.has_focus.store(false, Ordering::Relaxed);
// Window lost focus. // Window lost focus.
event_sink.push_window_event(WindowEvent::Focused(false), window_id); event_sink.push_window_event(WindowEvent::Focused(false), window_id);
// Reset the id.
inner.target_window_id = None;
} }
KeyboardEvent::Key { KeyboardEvent::Key {
rawkey, rawkey,

View file

@ -45,9 +45,6 @@ pub(super) fn handle_pointer(
pointer_data.latest_enter_serial.replace(serial); pointer_data.latest_enter_serial.replace(serial);
let window_id = wayland::make_wid(&surface); let window_id = wayland::make_wid(&surface);
if !winit_state.window_map.contains_key(&window_id) {
return;
}
let window_handle = match winit_state.window_map.get_mut(&window_id) { let window_handle = match winit_state.window_map.get_mut(&window_id) {
Some(window_handle) => window_handle, Some(window_handle) => window_handle,
None => return, None => return,