Skip to content

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

Marco Trevisan requested to merge 3v1n0/gtk:gtk-3-24+trap-bad-rr-errors into gtk-3-24

Backport of !6046 (merged)


We may try to update the XRR outputs and Crtcs when they're changing in the server, and so we may get BadRROutput that we're currently not handling properly.

As per this, use traps and check whether we got errors, and if we did let's ignore the current output.

It's not required to call init_randr13() again because if we got errors it's very likely that there's a change coming that will be notified at next iteration during which we'll repeat the init actions.


This is similar to !4681 (merged) happening quite a lot when stress-testing the test mutter clients (example https://gitlab.gnome.org/3v1n0/mutter/-/jobs/2856615).

A trace we get for such bug is:

#0  _g_log_abort (breakpoint=1) at ../../glib/glib/gmessages.c:555
#1  g_log_writer_default (log_level=<optimized out>, fields=0x7ffe81028ed0, n_fields=6, user_data=0x0)
    at ../../glib/glib/gmessages.c:2812
#2  0x00007f10fa2d9561 in g_log_structured_array (n_fields=6, fields=0x7ffe81028ed0, log_level=G_LOG_LEVEL_ERROR)
    at ../../glib/glib/gmessages.c:1983
#3  g_log_structured_array (log_level=G_LOG_LEVEL_ERROR, fields=0x7ffe81028ed0, n_fields=6)
    at ../../glib/glib/gmessages.c:1956
#4  0x00007f10fa2da133 in g_log_structured_standard (log_domain=log_domain@entry=0x7f10fa804623 "Gdk", 
    log_level=log_level@entry=G_LOG_LEVEL_ERROR, 
    file=file@entry=0x7f10fa825c80 "../../gtk/gdk/x11/gdkdisplay-x11.c", line=line@entry=0x7f10fa8256eb "2765", 
    func=func@entry=0x7f10fa826370 <__func__.4> "_gdk_x11_display_error_event", 
    message_format=message_format@entry=0x7f10fa8266d6 "%s") at ../../glib/glib/gmessages.c:2040
#5  0x00007f10fa7e04f3 in _gdk_x11_display_error_event (display=display@entry=0x55fbbac8cca0, 
    error=error@entry=0x7ffe81029530) at ../../gtk/gdk/x11/gdkdisplay-x11.c:2765
#6  0x00007f10fa7edcc3 in gdk_x_error (error=0x7ffe81029530, xdisplay=0x55fbbac7a320)
    at ../../gtk/gdk/x11/gdkmain-x11.c:296
#7  gdk_x_error (xdisplay=0x55fbbac7a320, error=0x7ffe81029530) at ../../gtk/gdk/x11/gdkmain-x11.c:258
#8  0x00007f10fa177974 in _XError (dpy=dpy@entry=0x55fbbac7a320, rep=rep@entry=0x55fbbae5a370)
    at /data/GNOME/xorg/lib/libX11/src/XlibInt.c:1503
#9  0x00007f10fa174497 in handle_error (dpy=dpy@entry=0x55fbbac7a320, err=0x55fbbae5a370, 
    in_XReply=in_XReply@entry=1) at /data/GNOME/xorg/lib/libX11/src/xcb_io.c:211
#10 0x00007f10fa175845 in _XReply (dpy=dpy@entry=0x55fbbac7a320, rep=rep@entry=0x7ffe810296f0, 
    extra=extra@entry=1, discard=discard@entry=0) at /data/GNOME/xorg/lib/libX11/src/xcb_io.c:798
#11 0x00007f10f99c3157 in XRRGetOutputInfo (dpy=0x55fbbac7a320, resources=resources@entry=0x55fbbae70b90, 
    output=output@entry=1441) at /media/M2/GNOME/xorg/lib/libXrandr/src/XrrOutput.c:57
#12 0x00007f10fa7efa68 in init_randr13 (screen=screen@entry=0x55fbbac91990, changed=changed@entry=0x7ffe81029814)
    at ../../gtk/gdk/x11/gdkscreen-x11.c:797
#13 0x00007f10fa7f109b in init_multihead (screen=0x55fbbac91990) at ../../gtk/gdk/x11/gdkscreen-x11.c:1036
#14 process_monitors_change (screen=0x55fbbac91990) at ../../gtk/gdk/x11/gdkscreen-x11.c:1189
#15 _gdk_x11_screen_size_changed (screen=screen@entry=0x55fbbac91990, event=event@entry=0x7ffe81029960)
    at ../../gtk/gdk/x11/gdkscreen-x11.c:1228
#16 0x00007f10fa7e1e39 in gdk_x11_display_translate_event (translator=<optimized out>, display=0x55fbbac8cca0, 
    event=0x55fbbae801d0, xevent=0x7ffe81029960) at ../../gtk/gdk/x11/gdkdisplay-x11.c:1201
#17 0x00007f10fa7e8902 in _gdk_x11_event_translator_translate (translator=0x55fbbac8cca0, display=0x55fbbac8cca0, 
    xevent=xevent@entry=0x7ffe81029960) at ../../gtk/gdk/x11/gdkeventtranslator.c:51
#18 0x00007f10fa7e8403 in gdk_event_source_translate_event (xevent=0x7ffe81029960, event_source=0x55fbbacba220)
    at ../../gtk/gdk/x11/gdkeventsource.c:243
#19 _gdk_x11_display_queue_events (display=0x55fbbac8cca0) at ../../gtk/gdk/x11/gdkeventsource.c:341
#20 0x00007f10fa791664 in gdk_display_get_event (display=display@entry=0x55fbbac8cca0)
    at ../../gtk/gdk/gdkdisplay.c:442
#21 0x00007f10fa7e7fe6 in gdk_event_source_dispatch (source=<optimized out>, callback=<optimized out>, 
    user_data=<optimized out>) at ../../gtk/gdk/x11/gdkeventsource.c:363
#22 0x00007f10fa2ce547 in g_main_dispatch (context=context@entry=0x55fbbacba2e0) at ../../glib/glib/gmain.c:3476
#23 0x00007f10fa2d1487 in g_main_context_dispatch_unlocked (context=0x55fbbacba2e0)
    at ../../glib/glib/gmain.c:4286
#24 g_main_context_iterate_unlocked (context=0x55fbbacba2e0, block=block@entry=1, dispatch=dispatch@entry=1, 
    self=<optimized out>) at ../../glib/glib/gmain.c:4351
#25 0x00007f10fa2d1d1f in g_main_loop_run (loop=loop@entry=0x55fbbaecac10) at ../../glib/glib/gmain.c:4553
#26 0x00007f10faa5fedd in gtk_main () at ../../gtk/gtk/gtkmain.c:1329
#27 0x000055fbb970690c in main (argc=1, argv=0x7ffe81029d18) at ../../mutter/src/tests/test-client.c:1040
(rr) f 12
#12 0x00007f10fa7efa68 in init_randr13 (screen=screen@entry=0x55fbbac91990, changed=changed@entry=0x7ffe81029814)
    at ../../gtk/gdk/x11/gdkscreen-x11.c:797
797	      XRROutputInfo *output_info =

/cc @jadahl

Merge request reports