[gtk/msvcproj-nmake-install: 14/24] x11: Trap errors happening when getting output properties
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/msvcproj-nmake-install: 14/24] x11: Trap errors happening when getting output properties
- Date: Fri, 13 May 2022 11:36:05 +0000 (UTC)
commit a8d8d1f2da7e0026b2c8c30b19cd342c0b0a93b6
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Mon May 2 16:47:18 2022 +0200
x11: Trap errors happening when getting output properties
This is to avoid getting X11 errors (thus aborting/exiting with a
failure) during rapid hotplugs, which may happen during e.g. CI testing.
gdk/x11/gdkscreen-x11.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
---
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index 81499ba106..c2b7480c48 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -594,19 +594,6 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
XRRFreeCrtcInfo (crtc);
}
- monitor = find_monitor_by_output (x11_display, output);
- if (monitor)
- monitor->remove = FALSE;
- else
- {
- monitor = g_object_new (GDK_TYPE_X11_MONITOR,
- "display", display,
- NULL);
- monitor->output = output;
- monitor->add = TRUE;
- g_ptr_array_add (x11_display->monitors, monitor);
- }
-
/* Fetch minimal manufacturer information (PNP ID) from EDID */
{
#define EDID_LENGTH 128
@@ -619,6 +606,7 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
edid_atom = XInternAtom (disp, RR_PROPERTY_RANDR_EDID, FALSE);
+ gdk_x11_display_error_trap_push (display);
XRRGetOutputProperty (disp, output,
edid_atom,
0,
@@ -631,6 +619,11 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
&nbytes,
&bytes_left,
&prop);
+ if (gdk_x11_display_error_trap_pop (display))
+ {
+ XRRFreeOutputInfo (output_info);
+ continue;
+ }
// Check partial EDID header (whole header: 00 ff ff ff ff ff ff 00)
if (nbytes >= EDID_LENGTH && prop[0] == 0x00 && prop[1] == 0xff)
@@ -651,6 +644,19 @@ init_randr15 (GdkScreen *screen, gboolean *changed)
#undef EDID_LENGTH
}
+ monitor = find_monitor_by_output (x11_display, output);
+ if (monitor)
+ monitor->remove = FALSE;
+ else
+ {
+ monitor = g_object_new (GDK_TYPE_X11_MONITOR,
+ "display", display,
+ NULL);
+ monitor->output = output;
+ monitor->add = TRUE;
+ g_ptr_array_add (x11_display->monitors, monitor);
+ }
+
gdk_monitor_get_geometry (GDK_MONITOR (monitor), &geometry);
name = g_strndup (output_info->name, output_info->nameLen);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]