ximagesink: generate reconfigure on window handle change
authorJakub Adam <jakub.adam@ktknet.cz>
Thu, 21 Apr 2016 06:45:40 +0000 (08:45 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 26 Apr 2016 08:13:01 +0000 (11:13 +0300)
When ximagesink is given a new window handle, it should check
its geometry and if the size of the new window differs from
the previous one, create reconfigure event in order to get
a chance to negotiate a more suitable image resolution with
the upstream elements.

We can't rely on receiving Expose or ConfigureNotify from
the X server for the newly assigned window, which would also
generate reconfigure.

https://bugzilla.gnome.org/show_bug.cgi?id=765424

sys/ximage/ximagesink.c

index 88c1de1..e625989 100644 (file)
@@ -1585,7 +1585,6 @@ gst_x_image_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
   XID xwindow_id = id;
   GstXImageSink *ximagesink = GST_X_IMAGE_SINK (overlay);
   GstXWindow *xwindow = NULL;
-  XWindowAttributes attr;
 
   /* We acquire the stream lock while setting this window in the element.
      We are basically cleaning tons of stuff replacing the old window, putting
@@ -1626,12 +1625,8 @@ gst_x_image_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
 
     xwindow->win = xwindow_id;
 
-    /* We get window geometry, set the event we want to receive,
-       and create a GC */
+    /* We set the events we want to receive and create a GC. */
     g_mutex_lock (&ximagesink->x_lock);
-    XGetWindowAttributes (ximagesink->xcontext->disp, xwindow->win, &attr);
-    xwindow->width = attr.width;
-    xwindow->height = attr.height;
     xwindow->internal = FALSE;
     if (ximagesink->handle_events) {
       XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask |
@@ -1643,8 +1638,11 @@ gst_x_image_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
     g_mutex_unlock (&ximagesink->x_lock);
   }
 
-  if (xwindow)
+  if (xwindow) {
     ximagesink->xwindow = xwindow;
+    /* Update the window geometry, possibly generating a reconfigure event. */
+    gst_x_image_sink_xwindow_update_geometry(ximagesink);
+  }
 
   g_mutex_unlock (&ximagesink->flow_lock);
 }