Merge branch 'trap-bad-rr-errors' into 'main'

x11: Trap XRandr errors when getting outputs during init and update

See merge request GNOME/gtk!6046
This commit is contained in:
Matthias Clasen 2023-06-02 11:31:45 +00:00
commit c8c895d160

View File

@ -685,8 +685,13 @@ init_randr13 (GdkX11Screen *x11_screen)
for (i = 0; i < resources->noutput; ++i) for (i = 0; i < resources->noutput; ++i)
{ {
RROutput output = resources->outputs[i]; RROutput output = resources->outputs[i];
XRROutputInfo *output_info = XRROutputInfo *output_info;
XRRGetOutputInfo (x11_screen->xdisplay, resources, output);
gdk_x11_display_error_trap_push (display);
output_info = XRRGetOutputInfo (x11_screen->xdisplay, resources, output);
if (gdk_x11_display_error_trap_pop (display))
continue;
if (output_info->connection == RR_Disconnected) if (output_info->connection == RR_Disconnected)
{ {
@ -697,13 +702,22 @@ init_randr13 (GdkX11Screen *x11_screen)
if (output_info->crtc) if (output_info->crtc)
{ {
GdkX11Monitor *monitor; GdkX11Monitor *monitor;
XRRCrtcInfo *crtc = XRRGetCrtcInfo (x11_screen->xdisplay, resources, output_info->crtc); XRRCrtcInfo *crtc;
char *name; char *name;
GdkRectangle geometry; GdkRectangle geometry;
GdkRectangle newgeo; GdkRectangle newgeo;
int j; int j;
int refresh_rate = 0; int refresh_rate = 0;
gdk_x11_display_error_trap_push (display);
crtc = XRRGetCrtcInfo (x11_screen->xdisplay, resources, output_info->crtc);
if (gdk_x11_display_error_trap_pop (display))
{
XRRFreeOutputInfo (output_info);
continue;
}
for (j = 0; j < resources->nmode; j++) for (j = 0; j < resources->nmode; j++)
{ {
XRRModeInfo *xmode = &resources->modes[j]; XRRModeInfo *xmode = &resources->modes[j];
@ -775,8 +789,10 @@ init_randr13 (GdkX11Screen *x11_screen)
} }
x11_display->primary_monitor = 0; x11_display->primary_monitor = 0;
gdk_x11_display_error_trap_push (display);
primary_output = XRRGetOutputPrimary (x11_screen->xdisplay, primary_output = XRRGetOutputPrimary (x11_screen->xdisplay,
x11_screen->xroot_window); x11_screen->xroot_window);
gdk_x11_display_error_trap_pop_ignored (display);
for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++) for (i = 0; i < g_list_model_get_n_items (G_LIST_MODEL (x11_display->monitors)); i++)
{ {