diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols index c7ba7b31f..7db48dd27 100644 --- a/clutter/clutter.symbols +++ b/clutter/clutter.symbols @@ -1161,6 +1161,7 @@ clutter_vertex_new clutter_wayland_input_device_get_wl_seat clutter_wayland_stage_get_wl_shell_surface clutter_wayland_stage_get_wl_surface +clutter_wayland_stage_set_wl_surface clutter_wayland_set_display clutter_wayland_disable_event_retrieval #endif diff --git a/clutter/wayland/clutter-stage-wayland.c b/clutter/wayland/clutter-stage-wayland.c index 9549f5430..f4120d03c 100644 --- a/clutter/wayland/clutter-stage-wayland.c +++ b/clutter/wayland/clutter-stage-wayland.c @@ -290,3 +290,50 @@ clutter_wayland_stage_get_wl_surface (ClutterStage *stage) return stage_wayland->wayland_surface; } + +/** + * clutter_wayland_stage_set_wl_surface: + * @stage: a #ClutterStage + * @surface: A Wayland surface to associate with the @stage. + * + * Allows you to explicitly provide an existing Wayland surface to associate + * with @stage, preventing Cogl from allocating a surface and shell surface for + * the stage automatically. + * + * This function must be called before @stage is shown. + * + * Note: this function can only be called when running on the Wayland + * platform. Calling this function at any other time has no effect. + * + * Since: 1.16 + */ +void +clutter_wayland_stage_set_wl_surface (ClutterStage *stage, + struct wl_surface *surface) +{ + ClutterStageWindow *stage_window = _clutter_stage_get_window (stage); + ClutterStageWayland *stage_wayland; + ClutterStageCogl *stage_cogl; + + if (!CLUTTER_IS_STAGE_WAYLAND (stage_window)) + return; + + stage_cogl = CLUTTER_STAGE_COGL (stage_window); + + if (stage_cogl->onscreen == NULL) + { + ClutterBackend *backend = clutter_get_default_backend (); + + /* Use the same default dimensions as clutter_stage_cogl_realize() */ + stage_cogl->onscreen = cogl_onscreen_new (backend->cogl_context, + 800, 600); + + cogl_wayland_onscreen_set_foreign_surface (stage_cogl->onscreen, + surface); + + stage_wayland = CLUTTER_STAGE_WAYLAND (stage_window); + stage_wayland->foreign_wl_surface = TRUE; + } + else + g_warning (G_STRLOC ": cannot set foreign surface for stage"); +} diff --git a/clutter/wayland/clutter-stage-wayland.h b/clutter/wayland/clutter-stage-wayland.h index 3c7eb4209..a8124b5b4 100644 --- a/clutter/wayland/clutter-stage-wayland.h +++ b/clutter/wayland/clutter-stage-wayland.h @@ -53,6 +53,7 @@ struct _ClutterStageWayland struct wl_surface *wayland_surface; struct wl_shell_surface *wayland_shell_surface; gboolean fullscreen; + gboolean foreign_wl_surface; }; struct _ClutterStageWaylandClass diff --git a/clutter/wayland/clutter-wayland.h b/clutter/wayland/clutter-wayland.h index e56b24129..b78bc6e18 100644 --- a/clutter/wayland/clutter-wayland.h +++ b/clutter/wayland/clutter-wayland.h @@ -46,6 +46,9 @@ struct wl_shell_surface *clutter_wayland_stage_get_wl_shell_surface (ClutterStag struct wl_surface *clutter_wayland_stage_get_wl_surface (ClutterStage *stage); +CLUTTER_AVAILABLE_IN_1_16 +void clutter_wayland_stage_set_wl_surface (ClutterStage *stage, struct wl_surface *surface); + CLUTTER_AVAILABLE_IN_1_16 void clutter_wayland_set_display (struct wl_display *display); diff --git a/doc/reference/clutter/clutter2-sections.txt b/doc/reference/clutter/clutter2-sections.txt index cc9e977fb..d22ec350a 100644 --- a/doc/reference/clutter/clutter2-sections.txt +++ b/doc/reference/clutter/clutter2-sections.txt @@ -922,6 +922,7 @@ ClutterX11XInputEventTypes clutter_wayland_input_device_get_wl_seat clutter_wayland_stage_get_wl_shell_surface clutter_wayland_stage_get_wl_surface +clutter_wayland_stage_set_wl_surface clutter_wayland_set_display clutter_wayland_disable_event_retrieval