wayland: add support for connecting to a foreign display

This allows the reuse of the display connection and hence objects with
existing code that is using Wayland.

https://bugzilla.gnome.org/show_bug.cgi?id=703566
This commit is contained in:
Rob Bradford 2013-07-03 18:49:23 +01:00
parent 5c93c0a1af
commit 6521701e29
4 changed files with 41 additions and 2 deletions

View File

@ -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

View File

@ -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 <wayland-client.h>
@ -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;
}

View File

@ -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__ */

View File

@ -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
</SECTION>
<SECTION>