void gst_wl_window_set_render_rectangle (GstWlWindow * window, gint x, gint y, gint w, gint h) { g_return_if_fail (window != NULL); window->render_rectangle.x = x; window->render_rectangle.y = y; window->render_rectangle.w = w; window->render_rectangle.h = h; /* position the area inside the parent - needs a parent commit to apply */ if (window->area_subsurface) wl_subsurface_set_position (window->area_subsurface, x, y); /* change the size of the area */ if (window->area_viewport) wp_viewport_set_destination (window->area_viewport, w, h); gst_wl_window_update_borders (window); if (window->video_width != 0) { wl_subsurface_set_sync (window->video_subsurface); gst_wl_window_resize_video_surface (window, TRUE); } wl_surface_damage (window->area_surface_wrapper, 0, 0, w, h); wl_surface_commit (window->area_surface_wrapper); if (window->video_width != 0) wl_subsurface_set_desync (window->video_subsurface); }
bool WaylandEGLContext::attach (GtkWidget *widget) { GdkWindow *window = gtk_widget_get_window (widget); if (!GDK_IS_WAYLAND_WINDOW (window)) return false; gdk_window = window; gdk_window_get_geometry (gdk_window, &x, &y, &width, &height); display = gdk_wayland_display_get_wl_display (gdk_window_get_display (gdk_window)); parent = gdk_wayland_window_get_wl_surface (gdk_window); registry = wl_display_get_registry (display); wl_registry_add_listener (registry, &wl_registry_listener, this); wl_display_roundtrip (display); if (!compositor || !subcompositor) return false; child = wl_compositor_create_surface (compositor); region = wl_compositor_create_region (compositor); subsurface = wl_subcompositor_get_subsurface (subcompositor, child, parent); wl_surface_set_input_region (child, region); wl_subsurface_set_desync (subsurface); wl_subsurface_set_position (subsurface, x, y); return true; }
static void gst_wl_window_resize_video_surface (GstWlWindow * window, gboolean commit) { GstVideoRectangle src, res; /* center the video_subsurface inside area_subsurface */ src.w = window->video_width; src.h = window->video_height; gst_video_sink_center_rect (src, window->render_rectangle, &res, TRUE); wl_subsurface_set_position (window->video_subsurface, res.x, res.y); wl_viewport_set_destination (window->video_viewport, res.w, res.h); if (commit) { wl_surface_damage (window->video_surface, 0, 0, res.w, res.h); wl_surface_commit (window->video_surface); } if (gst_wl_window_is_toplevel (window)) { struct wl_region *region; region = wl_compositor_create_region (window->display->compositor); wl_region_add(region, 0, 0, window->render_rectangle.w, window->render_rectangle.h); wl_surface_set_input_region (window->area_surface, region); wl_region_destroy (region); } /* this is saved for use in wl_surface_damage */ window->surface_width = res.w; window->surface_height = res.h; }
void WaylandEGLContext::resize () { int scale; gdk_window_get_geometry (gdk_window, &x, &y, &width, &height); scale = gdk_window_get_scale_factor (gdk_window); wl_egl_window_resize (egl_window, width * scale, height * scale, 0, 0); wl_subsurface_set_position (subsurface, x, y); make_current (); }
static void _set_render_rectangle (gpointer data) { struct SetRenderRectangle *render = data; GST_LOG_OBJECT (render->window_egl, "setting render rectangle %i,%i+%ix%i", render->rect.x, render->rect.y, render->rect.w, render->rect.h); if (render->window_egl->window.subsurface) { wl_subsurface_set_sync (render->window_egl->window.subsurface); wl_subsurface_set_position (render->window_egl->window.subsurface, render->rect.x, render->rect.y); render->window_egl->window.window_x = render->rect.x; render->window_egl->window.window_y = render->rect.y; } window_resize (render->window_egl, render->rect.w, render->rect.h); }
static void gst_wl_window_resize_internal (GstWlWindow * window, gboolean commit) { GstVideoRectangle src, res; src.w = window->video_width; src.h = window->video_height; gst_video_sink_center_rect (src, window->render_rectangle, &res, TRUE); if (window->subsurface) wl_subsurface_set_position (window->subsurface, window->render_rectangle.x + res.x, window->render_rectangle.y + res.y); wl_viewport_set_destination (window->viewport, res.w, res.h); if (commit) { wl_surface_damage (window->surface, 0, 0, res.w, res.h); wl_surface_commit (window->surface); } /* this is saved for use in wl_surface_damage */ window->surface_width = res.w; window->surface_height = res.h; }
static void create_surfaces (GstGLWindowWaylandEGL * window_egl) { GstGLDisplayWayland *display = GST_GL_DISPLAY_WAYLAND (GST_GL_WINDOW (window_egl)->display); gint width, height; if (!window_egl->window.surface) { window_egl->window.surface = wl_compositor_create_surface (display->compositor); if (window_egl->window.queue) wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.surface, window_egl->window.queue); } if (window_egl->window.foreign_surface) { /* (re)parent */ if (!display->subcompositor) { GST_ERROR_OBJECT (window_egl, "Wayland server does not support subsurfaces"); window_egl->window.foreign_surface = NULL; goto shell_window; } if (!window_egl->window.subsurface) { window_egl->window.subsurface = wl_subcompositor_get_subsurface (display->subcompositor, window_egl->window.surface, window_egl->window.foreign_surface); if (window_egl->window.queue) wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.subsurface, window_egl->window.queue); wl_subsurface_set_position (window_egl->window.subsurface, window_egl->window.window_x, window_egl->window.window_y); wl_subsurface_set_desync (window_egl->window.subsurface); } } else { shell_window: if (!window_egl->window.shell_surface) { window_egl->window.shell_surface = wl_shell_get_shell_surface (display->shell, window_egl->window.surface); if (window_egl->window.queue) wl_proxy_set_queue ((struct wl_proxy *) window_egl->window. shell_surface, window_egl->window.queue); wl_shell_surface_add_listener (window_egl->window.shell_surface, &shell_surface_listener, window_egl); wl_shell_surface_set_title (window_egl->window.shell_surface, "OpenGL Renderer"); wl_shell_surface_set_toplevel (window_egl->window.shell_surface); } } if (window_egl->window.window_width > 0) width = window_egl->window.window_width; else width = 320; window_egl->window.window_width = width; if (window_egl->window.window_height > 0) height = window_egl->window.window_height; else height = 240; window_egl->window.window_height = height; if (!window_egl->window.native) { gst_gl_window_resize (GST_GL_WINDOW (window_egl), width, height); window_egl->window.native = wl_egl_window_create (window_egl->window.surface, width, height); if (window_egl->window.queue) wl_proxy_set_queue ((struct wl_proxy *) window_egl->window.native, window_egl->window.queue); } }