diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index b1945eb47a2..3a8d6ff6c58 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -5853,16 +5853,20 @@ Error DisplayServerX11::remove_embedded_process(OS::ProcessID p_pid) { // Handle bad window errors silently because just in case the embedded window was closed. int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&bad_window_error_handler); - // Send the message to gracefully close the window. - XEvent ev; - memset(&ev, 0, sizeof(ev)); - ev.xclient.type = ClientMessage; - ev.xclient.window = ep->process_window; - ev.xclient.message_type = XInternAtom(x11_display, "WM_PROTOCOLS", True); - ev.xclient.format = 32; - ev.xclient.data.l[0] = XInternAtom(x11_display, "WM_DELETE_WINDOW", False); - ev.xclient.data.l[1] = CurrentTime; - XSendEvent(x11_display, ep->process_window, False, NoEventMask, &ev); + // Check if the window is still valid. + XWindowAttributes attr; + if (XGetWindowAttributes(x11_display, ep->process_window, &attr)) { + // Send the message to gracefully close the window. + XEvent ev; + memset(&ev, 0, sizeof(ev)); + ev.xclient.type = ClientMessage; + ev.xclient.window = ep->process_window; + ev.xclient.message_type = XInternAtom(x11_display, "WM_PROTOCOLS", True); + ev.xclient.format = 32; + ev.xclient.data.l[0] = XInternAtom(x11_display, "WM_DELETE_WINDOW", False); + ev.xclient.data.l[1] = CurrentTime; + XSendEvent(x11_display, ep->process_window, False, NoEventMask, &ev); + } // Restore default error handler. XSetErrorHandler(oldHandler);