if (!sink->window) {
/* if we were not provided a window, create one ourselves */
- sink->window =
- gst_wl_window_new_toplevel (sink->display, &sink->video_info);
+ sink->window = gst_wl_window_new_toplevel (sink->display,
+ &sink->video_info, &sink->render_lock);
}
}
"an externally-supplied display handle. Consider providing a "
"display handle from your application with GstContext"));
} else {
- sink->window = gst_wl_window_new_in_surface (sink->display, surface);
+ sink->window = gst_wl_window_new_in_surface (sink->display, surface,
+ &sink->render_lock);
}
} else {
GST_ERROR_OBJECT (sink, "Failed to find display handle, "
handle_configure (void *data, struct wl_shell_surface *shell_surface,
uint32_t edges, int32_t width, int32_t height)
{
+ GstWlWindow *window = data;
+
+ GST_DEBUG ("Windows configure: edges %x, width = %i, height %i", edges,
+ width, height);
+
+ if (width == 0 || height == 0)
+ return;
+
+ gst_wl_window_set_render_rectangle (window, 0, 0, width, height);
}
static void
handle_popup_done (void *data, struct wl_shell_surface *shell_surface)
{
+ GST_DEBUG ("Window popup done.");
}
static const struct wl_shell_surface_listener shell_surface_listener = {
}
static GstWlWindow *
-gst_wl_window_new_internal (GstWlDisplay * display)
+gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock)
{
GstWlWindow *window;
struct wl_region *region;
window = g_object_new (GST_TYPE_WL_WINDOW, NULL);
window->display = g_object_ref (display);
+ window->render_lock = render_lock;
window->area_surface = wl_compositor_create_surface (display->compositor);
window->video_surface = wl_compositor_create_surface (display->compositor);
}
GstWlWindow *
-gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info)
+gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
+ GMutex * render_lock)
{
GstWlWindow *window;
gint width;
- window = gst_wl_window_new_internal (display);
+ window = gst_wl_window_new_internal (display, render_lock);
/* go toplevel */
window->shell_surface = wl_shell_get_shell_surface (display->shell,
GstWlWindow *
gst_wl_window_new_in_surface (GstWlDisplay * display,
- struct wl_surface * parent)
+ struct wl_surface * parent, GMutex * render_lock)
{
GstWlWindow *window;
- window = gst_wl_window_new_internal (display);
+ window = gst_wl_window_new_internal (display, render_lock);
/* embed in parent */
window->area_subsurface =
{
GObject parent_instance;
+ GMutex *render_lock;
+
GstWlDisplay *display;
struct wl_surface *area_surface;
struct wl_subsurface *area_subsurface;
/* this will be set when viewporter is available and black background has
* already been set on the area_subsurface */
gboolean no_border_update;
+
};
struct _GstWlWindowClass
GType gst_wl_window_get_type (void);
GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display,
- const GstVideoInfo * info);
+ const GstVideoInfo * info, GMutex * render_lock);
GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
- struct wl_surface * parent);
+ struct wl_surface * parent, GMutex * render_lock);
GstWlDisplay *gst_wl_window_get_display (GstWlWindow * window);
struct wl_surface *gst_wl_window_get_wl_surface (GstWlWindow * window);