mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-09-03 20:30:24 +00:00
x11: Ignore BadWindow errors when handling a SelectionRequest
When handing a SelectionRequest event, XChangeProperty can generate a BadWindow error if the requesting window was already destroyed. Register an error handler to catch this, and prevent it from being fatal.
(cherry picked from commit ec6790bd5e)
This commit is contained in:
@@ -792,6 +792,17 @@ static void X11_UpdateUserTime(SDL_WindowData *data, const unsigned long latest)
|
||||
}
|
||||
}
|
||||
|
||||
static int SelectionRequestErrorHandler(Display *d, XErrorEvent *e)
|
||||
{
|
||||
// Ignore BadWindow, as it can happen during XChangeProperty if the target window was already destroyed.
|
||||
if (e->error_code != BadWindow) {
|
||||
char err_msg[128];
|
||||
X11_XGetErrorText(d, e->error_code, err_msg, sizeof(err_msg));
|
||||
SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Failed to handle SelectionRequest: %hhu (%s)", e->error_code, err_msg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void X11_HandleClipboardEvent(SDL_VideoDevice *_this, const XEvent *xevent)
|
||||
{
|
||||
int i;
|
||||
@@ -805,6 +816,7 @@ static void X11_HandleClipboardEvent(SDL_VideoDevice *_this, const XEvent *xeven
|
||||
// Copy the selection from our own CUTBUFFER to the requested property
|
||||
case SelectionRequest:
|
||||
{
|
||||
int (*prev_handler)(Display *, XErrorEvent *);
|
||||
const XSelectionRequestEvent *req = &xevent->xselectionrequest;
|
||||
XEvent sevent;
|
||||
int mime_formats;
|
||||
@@ -823,6 +835,11 @@ static void X11_HandleClipboardEvent(SDL_VideoDevice *_this, const XEvent *xeven
|
||||
}
|
||||
#endif
|
||||
|
||||
/* If the requesting window was already destroyed, XChangeProperty can generate a BadWindow
|
||||
* error. Register an error handler to catch this, and prevent it from being fatal.
|
||||
*/
|
||||
prev_handler = X11_XSetErrorHandler(SelectionRequestErrorHandler);
|
||||
|
||||
if (req->selection == XA_PRIMARY) {
|
||||
clipboard = &videodata->primary_selection;
|
||||
} else {
|
||||
@@ -880,6 +897,8 @@ static void X11_HandleClipboardEvent(SDL_VideoDevice *_this, const XEvent *xeven
|
||||
}
|
||||
X11_XSendEvent(display, req->requestor, False, 0, &sevent);
|
||||
X11_XSync(display, False);
|
||||
|
||||
X11_XSetErrorHandler(prev_handler);
|
||||
} break;
|
||||
|
||||
case SelectionNotify:
|
||||
|
||||
Reference in New Issue
Block a user