ximagesink: generate reconfigure on window handle change

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
This commit is contained in:
Jakub Adam 2016-04-21 08:45:40 +02:00 committed by Sebastian Dröge
parent 7ba7c58f99
commit 59d7f9c62e

View file

@ -1585,7 +1585,6 @@ gst_x_image_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id)
XID xwindow_id = id; XID xwindow_id = id;
GstXImageSink *ximagesink = GST_X_IMAGE_SINK (overlay); GstXImageSink *ximagesink = GST_X_IMAGE_SINK (overlay);
GstXWindow *xwindow = NULL; GstXWindow *xwindow = NULL;
XWindowAttributes attr;
/* We acquire the stream lock while setting this window in the element. /* We acquire the stream lock while setting this window in the element.
We are basically cleaning tons of stuff replacing the old window, putting 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; xwindow->win = xwindow_id;
/* We get window geometry, set the event we want to receive, /* We set the events we want to receive and create a GC. */
and create a GC */
g_mutex_lock (&ximagesink->x_lock); g_mutex_lock (&ximagesink->x_lock);
XGetWindowAttributes (ximagesink->xcontext->disp, xwindow->win, &attr);
xwindow->width = attr.width;
xwindow->height = attr.height;
xwindow->internal = FALSE; xwindow->internal = FALSE;
if (ximagesink->handle_events) { if (ximagesink->handle_events) {
XSelectInput (ximagesink->xcontext->disp, xwindow->win, ExposureMask | 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); g_mutex_unlock (&ximagesink->x_lock);
} }
if (xwindow) if (xwindow) {
ximagesink->xwindow = 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); g_mutex_unlock (&ximagesink->flow_lock);
} }