mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-30 11:08:34 +00:00
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:
parent
7ba7c58f99
commit
59d7f9c62e
1 changed files with 5 additions and 7 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue