diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols index 098249dfc..346214196 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_set_display #endif #ifdef CLUTTER_WINDOWING_WIN32 clutter_win32_disable_event_retrieval diff --git a/clutter/wayland/clutter-backend-wayland.c b/clutter/wayland/clutter-backend-wayland.c index 77ed8c4be..610df501d 100644 --- a/clutter/wayland/clutter-backend-wayland.c +++ b/clutter/wayland/clutter-backend-wayland.c @@ -46,6 +46,7 @@ #include "wayland/clutter-device-manager-wayland.h" #include "wayland/clutter-event-wayland.h" #include "wayland/clutter-stage-wayland.h" +#include "wayland/clutter-wayland.h" #include "cogl/clutter-stage-cogl.h" #include @@ -59,6 +60,8 @@ G_DEFINE_TYPE (ClutterBackendWayland, clutter_backend_wayland, CLUTTER_TYPE_BACKEND); +static struct wl_display *_foreign_display = NULL; + static void clutter_backend_wayland_load_cursor (ClutterBackendWayland *backend_wayland); static void @@ -175,7 +178,10 @@ clutter_backend_wayland_post_parse (ClutterBackend *backend, ClutterBackendWayland *backend_wayland = CLUTTER_BACKEND_WAYLAND (backend); /* TODO: expose environment variable/commandline option for this... */ - backend_wayland->wayland_display = wl_display_connect (NULL); + backend_wayland->wayland_display = _foreign_display; + if (backend_wayland->wayland_display == NULL) + backend_wayland->wayland_display = wl_display_connect (NULL); + if (!backend_wayland->wayland_display) { g_set_error (error, CLUTTER_INIT_ERROR, @@ -322,3 +328,31 @@ static void clutter_backend_wayland_init (ClutterBackendWayland *backend_wayland) { } + +/** + * clutter_wayland_set_display + * @display: pointer to a wayland display + * + * Sets the display connection Clutter should use; must be called + * before clutter_init(), clutter_init_with_args() or other functions + * pertaining Clutter's initialization process. + * + * If you are parsing the command line arguments by retrieving Clutter's + * #GOptionGroup with clutter_get_option_group() and calling + * g_option_context_parse() yourself, you should also call + * clutter_wayland_set_display() before g_option_context_parse(). + * + * Since: 1.16 + */ +void +clutter_wayland_set_display (struct wl_display *display) +{ + if (_clutter_context_is_initialized ()) + { + g_warning ("%s() can only be used before calling clutter_init()", + G_STRFUNC); + return; + } + + _foreign_display = display; +} diff --git a/clutter/wayland/clutter-wayland.h b/clutter/wayland/clutter-wayland.h index 8ab6839dc..00e02b7bd 100644 --- a/clutter/wayland/clutter-wayland.h +++ b/clutter/wayland/clutter-wayland.h @@ -45,6 +45,9 @@ struct wl_seat *clutter_wayland_input_device_get_wl_seat (ClutterInputDevice *de struct wl_shell_surface *clutter_wayland_stage_get_wl_shell_surface (ClutterStage *stage); struct wl_surface *clutter_wayland_stage_get_wl_surface (ClutterStage *stage); -G_END_DECLS +CLUTTER_AVAILABLE_IN_1_16 +void clutter_wayland_set_display (struct wl_display *display); + +G_END_DECLS #endif /* __CLUTTER_WAYLAND_H__ */ diff --git a/doc/reference/clutter/clutter2-sections.txt b/doc/reference/clutter/clutter2-sections.txt index 2ba441a02..8cae98b58 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_set_display