ximagesrc: avoid blocking wait for X events
authorJakub Adam <jakub.adam@collabora.com>
Fri, 10 Dec 2021 15:08:27 +0000 (16:08 +0100)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 10 Dec 2021 20:43:09 +0000 (20:43 +0000)
XNextEvent() blocks indefinitely in absence of X11 events, which can
prevent the pipeline from stopping.

This can cause problems when ximagesrc is used in "remote desktop"
scenarios and the GStreamer application itself, through which the user
is viewing and controlling the machine, is the only source of input
events.

Replace the call with non-blocking XCheckTypedEvent().

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1438>

subprojects/gst-plugins-good/sys/ximage/gstximagesrc.c

index b97d82c..2897008 100644 (file)
@@ -547,9 +547,8 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
     do {
       XDamageNotifyEvent *damage_ev = (XDamageNotifyEvent *) (&ev);
 
-      XNextEvent (ximagesrc->xcontext->disp, &ev);
-
-      if (ev.type == ximagesrc->damage_event_base + XDamageNotify &&
+      if (XCheckTypedEvent (ximagesrc->xcontext->disp,
+              ximagesrc->damage_event_base + XDamageNotify, &ev) &&
           damage_ev->level == XDamageReportNonEmpty) {
 
         XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None,