mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-25 09:17:12 +01:00
x11: Don't let XRRSetScreenSize fire a BadMatch error.
This is a workaround and not a proper fix, but this is possibly complicated, and possibly a corner case, so this will do for 2.0.16, if not the foreseeable future. Reference issue #4561
This commit is contained in:
parent
3a4b217d6c
commit
d0effadf68
@ -995,6 +995,15 @@ X11_GetDisplayModes(_THIS, SDL_VideoDisplay * sdl_display)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This catches an error from XRRSetScreenSize, as a workaround for now. */
|
||||||
|
/* !!! FIXME: remove this later when we have a better solution. */
|
||||||
|
static int (*PreXRRSetScreenSizeErrorHandler)(Display *, XErrorEvent *) = NULL;
|
||||||
|
static int
|
||||||
|
SDL_XRRSetScreenSizeErrHandler(Display *d, XErrorEvent *e)
|
||||||
|
{
|
||||||
|
return (e->error_code == BadMatch) ? 0 : PreXRRSetScreenSizeErrorHandler(d, e);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
X11_SetDisplayMode(_THIS, SDL_VideoDisplay * sdl_display, SDL_DisplayMode * mode)
|
X11_SetDisplayMode(_THIS, SDL_VideoDisplay * sdl_display, SDL_DisplayMode * mode)
|
||||||
{
|
{
|
||||||
@ -1040,7 +1049,17 @@ X11_SetDisplayMode(_THIS, SDL_VideoDisplay * sdl_display, SDL_DisplayMode * mode
|
|||||||
|
|
||||||
mm_width = mode->w * DisplayWidthMM(display, data->screen) / DisplayWidth(display, data->screen);
|
mm_width = mode->w * DisplayWidthMM(display, data->screen) / DisplayWidth(display, data->screen);
|
||||||
mm_height = mode->h * DisplayHeightMM(display, data->screen) / DisplayHeight(display, data->screen);
|
mm_height = mode->h * DisplayHeightMM(display, data->screen) / DisplayHeight(display, data->screen);
|
||||||
|
|
||||||
|
/* !!! FIXME: this can get into a problem scenario when a window is
|
||||||
|
bigger than a physical monitor in a configuration where one screen
|
||||||
|
spans multiple physical monitors. A detailed reproduction case is
|
||||||
|
discussed at https://github.com/libsdl-org/SDL/issues/4561 ...
|
||||||
|
for now we cheat and just catch the X11 error and carry on, which
|
||||||
|
is likely to cause subtle issues but is better than outright
|
||||||
|
crashing */
|
||||||
|
PreXRRSetScreenSizeErrorHandler = X11_XSetErrorHandler(SDL_XRRSetScreenSizeErrHandler);
|
||||||
X11_XRRSetScreenSize(display, RootWindow(display, data->screen), mode->w, mode->h, mm_width, mm_height);
|
X11_XRRSetScreenSize(display, RootWindow(display, data->screen), mode->w, mode->h, mm_width, mm_height);
|
||||||
|
X11_XSetErrorHandler(PreXRRSetScreenSizeErrorHandler);
|
||||||
|
|
||||||
status = X11_XRRSetCrtcConfig (display, res, output_info->crtc, CurrentTime,
|
status = X11_XRRSetCrtcConfig (display, res, output_info->crtc, CurrentTime,
|
||||||
crtc->x, crtc->y, modedata->xrandr_mode, crtc->rotation,
|
crtc->x, crtc->y, modedata->xrandr_mode, crtc->rotation,
|
||||||
|
Loading…
Reference in New Issue
Block a user