Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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
  • Loading branch information
xhaakon authored and sdroege committed Apr 26, 2016
1 parent 7ba7c58 commit 59d7f9c
Showing 1 changed file with 5 additions and 7 deletions.
12 changes: 5 additions & 7 deletions sys/ximage/ximagesink.c
Expand Up @@ -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
Expand Down Expand Up @@ -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 |
Expand All @@ -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);
}
Expand Down

0 comments on commit 59d7f9c

Please sign in to comment.