mirror of
https://github.com/godotengine/godot.git
synced 2024-11-22 12:12:28 +00:00
Fix crash on Windows when closing Window
Send `WINDOW_EVENT_MOUSE_EXIT` when a window is destroyed. Ensure, that on Windows, the event_callback is still valid during destroying the `Window`.
This commit is contained in:
parent
2992ffd255
commit
8c1ce404d7
@ -1449,6 +1449,12 @@ void DisplayServerX11::delete_sub_window(WindowID p_id) {
|
||||
|
||||
DEBUG_LOG_X11("delete_sub_window: %lu (%u) \n", wd.x11_window, p_id);
|
||||
|
||||
window_set_rect_changed_callback(Callable(), p_id);
|
||||
window_set_window_event_callback(Callable(), p_id);
|
||||
window_set_input_event_callback(Callable(), p_id);
|
||||
window_set_input_text_callback(Callable(), p_id);
|
||||
window_set_drop_files_callback(Callable(), p_id);
|
||||
|
||||
while (wd.transient_children.size()) {
|
||||
window_set_transient(*wd.transient_children.begin(), INVALID_WINDOW_ID);
|
||||
}
|
||||
|
@ -3838,6 +3838,10 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA
|
||||
} break;
|
||||
case WM_DESTROY: {
|
||||
Input::get_singleton()->flush_buffered_events();
|
||||
if (window_mouseover_id == window_id) {
|
||||
window_mouseover_id = INVALID_WINDOW_ID;
|
||||
_send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_EXIT);
|
||||
}
|
||||
} break;
|
||||
case WM_SETCURSOR: {
|
||||
if (LOWORD(lParam) == HTCLIENT) {
|
||||
|
@ -618,12 +618,6 @@ void Window::_clear_window() {
|
||||
|
||||
bool had_focus = has_focus();
|
||||
|
||||
DisplayServer::get_singleton()->window_set_rect_changed_callback(Callable(), window_id);
|
||||
DisplayServer::get_singleton()->window_set_window_event_callback(Callable(), window_id);
|
||||
DisplayServer::get_singleton()->window_set_input_event_callback(Callable(), window_id);
|
||||
DisplayServer::get_singleton()->window_set_input_text_callback(Callable(), window_id);
|
||||
DisplayServer::get_singleton()->window_set_drop_files_callback(Callable(), window_id);
|
||||
|
||||
if (transient_parent && transient_parent->window_id != DisplayServer::INVALID_WINDOW_ID) {
|
||||
DisplayServer::get_singleton()->window_set_transient(window_id, DisplayServer::INVALID_WINDOW_ID);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user