mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-23 22:01:31 +11:00
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:
parent
1eb1a13a77
commit
7029ce6ecd
|
@ -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`.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue