Merge pull request #119303 from norepro/x11-xsync-badwindow-errors
Fix some X11 BadWindow errors not being ignored
This commit is contained in:
@@ -6065,6 +6065,9 @@ Window find_window_from_process_id(Display *p_display, pid_t p_process_id) {
|
||||
}
|
||||
}
|
||||
|
||||
// Suppress any pending bad window errors.
|
||||
XSync(p_display, False);
|
||||
|
||||
// Restore default error handler.
|
||||
XSetErrorHandler(oldHandler);
|
||||
|
||||
@@ -6114,6 +6117,9 @@ Error DisplayServerX11::embed_process(DisplayServerEnums::WindowID p_window, Pro
|
||||
|
||||
DEBUG_LOG_X11("Starting embedding %ld to window %lu \n", p_pid, wd.x11_window);
|
||||
|
||||
// Handle bad window errors silently because the embedded window may be closed at any time.
|
||||
int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&bad_window_error_handler);
|
||||
|
||||
EmbeddedProcessData *ep = nullptr;
|
||||
if (embedded_processes.has(p_pid)) {
|
||||
ep = embedded_processes.get(p_pid);
|
||||
@@ -6121,6 +6127,8 @@ Error DisplayServerX11::embed_process(DisplayServerEnums::WindowID p_window, Pro
|
||||
// New process, trying to find the window.
|
||||
Window process_window = find_window_from_process_id(x11_display, p_pid);
|
||||
if (!process_window) {
|
||||
XSync(x11_display, False);
|
||||
XSetErrorHandler(oldHandler);
|
||||
return ERR_DOES_NOT_EXIST;
|
||||
}
|
||||
DEBUG_LOG_X11("Process %ld window found: %lu \n", p_pid, process_window);
|
||||
@@ -6132,9 +6140,6 @@ Error DisplayServerX11::embed_process(DisplayServerEnums::WindowID p_window, Pro
|
||||
embedded_processes.insert(p_pid, ep);
|
||||
}
|
||||
|
||||
// Handle bad window errors silently because just in case the embedded window was closed.
|
||||
int (*oldHandler)(Display *, XErrorEvent *) = XSetErrorHandler(&bad_window_error_handler);
|
||||
|
||||
if (p_visible) {
|
||||
// Resize and move the window to match the desired rectangle.
|
||||
// X11 does not allow moving the window entirely outside the screen boundaries.
|
||||
@@ -6236,6 +6241,9 @@ Error DisplayServerX11::embed_process(DisplayServerEnums::WindowID p_window, Pro
|
||||
}
|
||||
}
|
||||
|
||||
// Suppress any pending bad window errors.
|
||||
XSync(x11_display, False);
|
||||
|
||||
// Restore default error handler.
|
||||
XSetErrorHandler(oldHandler);
|
||||
return OK;
|
||||
@@ -6268,6 +6276,9 @@ Error DisplayServerX11::request_close_embedded_process(ProcessID p_pid) {
|
||||
XSendEvent(x11_display, ep->process_window, False, NoEventMask, &ev);
|
||||
}
|
||||
|
||||
// Suppress any pending bad window errors.
|
||||
XSync(x11_display, False);
|
||||
|
||||
// Restore default error handler.
|
||||
XSetErrorHandler(oldHandler);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user