diff --git a/clutter/clutter-backend-private.h b/clutter/clutter-backend-private.h index 72563a3b1..d18d6da64 100644 --- a/clutter/clutter-backend-private.h +++ b/clutter/clutter-backend-private.h @@ -99,6 +99,8 @@ struct _ClutterBackendClass void (* settings_changed) (ClutterBackend *backend); }; +ClutterBackend * _clutter_create_backend (void); + ClutterStageWindow * _clutter_backend_create_stage (ClutterBackend *backend, ClutterStage *wrapper, GError **error); diff --git a/clutter/clutter-backend.c b/clutter/clutter-backend.c index a30a6930d..2b6c42986 100644 --- a/clutter/clutter-backend.c +++ b/clutter/clutter-backend.c @@ -83,6 +83,9 @@ /* XXX - should probably warn, here */ #include "tslib/clutter-event-tslib.h" #endif +#ifdef CLUTTER_WINDOWING_EGL +#include "egl/clutter-backend-eglnative.h" +#endif #ifdef CLUTTER_INPUT_WAYLAND #include "wayland/clutter-device-manager-wayland.h" #endif @@ -126,6 +129,7 @@ static guint backend_signals[LAST_SIGNAL] = { 0, }; static struct wl_display *_wayland_compositor_display; #endif +static const char *allowed_backend; static void clutter_backend_dispose (GObject *gobject) @@ -463,6 +467,58 @@ clutter_backend_real_create_stage (ClutterBackend *backend, NULL); } +ClutterBackend * +_clutter_create_backend (void) +{ + const char *backend = allowed_backend; + ClutterBackend *retval = NULL; + + if (backend == NULL) + { + const char *backend_env = g_getenv ("CLUTTER_BACKEND"); + + if (backend_env != NULL) + backend = g_intern_string (backend_env); + } + +#ifdef CLUTTER_WINDOWING_OSX + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_OSX)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_OSX, NULL); + else +#endif +#ifdef CLUTTER_WINDOWING_WIN32 + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_WIN32)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_WIN32, NULL); + else +#endif +#ifdef CLUTTER_WINDOWING_X11 + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_X11)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_X11, NULL); + else +#endif +#ifdef CLUTTER_WINDOWING_WAYLAND + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_WAYLAND)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_WAYLAND, NULL); + else +#endif +#ifdef CLUTTER_WINDOWING_EGL + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_EGL)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_EGL_NATIVE, NULL); + else +#endif +#ifdef CLUTTER_WINDOWING_GDK + if (backend == NULL || backend == I_(CLUTTER_WINDOWING_GDK)) + retval = g_object_new (CLUTTER_TYPE_BACKEND_GDK, NULL); + else +#endif + if (backend == NULL) + g_error ("No default Clutter backend found."); + else + g_error ("Unsupported Clutter backend: '%s'", backend); + + return retval; +} + static void clutter_backend_real_init_events (ClutterBackend *backend) { @@ -506,8 +562,8 @@ clutter_backend_real_init_events (ClutterBackend *backend) #endif #ifdef CLUTTER_INPUT_EVDEV /* Evdev can be used regardless of the windowing system */ - if (input_backend != NULL && - strcmp (input_backend, CLUTTER_INPUT_EVDEV) == 0) + if ((input_backend != NULL && strcmp (input_backend, CLUTTER_INPUT_EVDEV) == 0) || + clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)) { _clutter_events_evdev_init (backend); } @@ -1326,3 +1382,21 @@ clutter_wayland_set_compositor_display (void *display) _wayland_compositor_display = display; } #endif + +/** + * clutter_set_windowing_backend: + * @first_backend: the name of a clutter window backend + * + * Restricts clutter to only use the specified backend. + * This must be called before the first API call to clutter, including + * clutter_get_option_context() + * + * Since: 1.16 + */ +void +clutter_set_windowing_backend (const char *backend_type) +{ + g_return_if_fail (backend_type != NULL); + + allowed_backend = g_intern_string (backend_type); +} diff --git a/clutter/clutter-backend.h b/clutter/clutter-backend.h index 474c4264e..8f900b784 100644 --- a/clutter/clutter-backend.h +++ b/clutter/clutter-backend.h @@ -59,6 +59,9 @@ GType clutter_backend_get_type (void) G_GNUC_CONST; ClutterBackend *clutter_get_default_backend (void); +CLUTTER_AVAILABLE_IN_1_16 +void clutter_set_windowing_backend (const char *backend_type); + gdouble clutter_backend_get_resolution (ClutterBackend *backend); void clutter_backend_set_font_options (ClutterBackend *backend, diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c index d0d6185e2..ef83665d9 100644 --- a/clutter/clutter-main.c +++ b/clutter/clutter-main.c @@ -1390,53 +1390,6 @@ _clutter_context_is_initialized (void) return ClutterCntx->is_initialized; } -static ClutterBackend * -clutter_create_backend (void) -{ - const char *backend = g_getenv ("CLUTTER_BACKEND"); - ClutterBackend *retval = NULL; - - if (backend != NULL) - backend = g_intern_string (backend); - -#ifdef CLUTTER_WINDOWING_OSX - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_OSX)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_OSX, NULL); - else -#endif -#ifdef CLUTTER_WINDOWING_WIN32 - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_WIN32)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_WIN32, NULL); - else -#endif -#ifdef CLUTTER_WINDOWING_X11 - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_X11)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_X11, NULL); - else -#endif -#ifdef CLUTTER_WINDOWING_WAYLAND - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_WAYLAND)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_WAYLAND, NULL); - else -#endif -#ifdef CLUTTER_WINDOWING_EGL - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_EGL)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_EGL_NATIVE, NULL); - else -#endif -#ifdef CLUTTER_WINDOWING_GDK - if (backend == NULL || backend == I_(CLUTTER_WINDOWING_GDK)) - retval = g_object_new (CLUTTER_TYPE_BACKEND_GDK, NULL); - else -#endif - if (backend == NULL) - g_error ("No default Clutter backend found."); - else - g_error ("Unsupported Clutter backend: '%s'", backend); - - return retval; -} - static ClutterMainContext * clutter_context_get_default_unlocked (void) { @@ -1449,7 +1402,7 @@ clutter_context_get_default_unlocked (void) ctx->is_initialized = FALSE; /* create the windowing system backend */ - ctx->backend = clutter_create_backend (); + ctx->backend = _clutter_create_backend (); /* create the default settings object, and store a back pointer to * the backend singleton diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols index 7b4bffd1f..7226492ee 100644 --- a/clutter/clutter.symbols +++ b/clutter/clutter.symbols @@ -1193,6 +1193,7 @@ clutter_settings_get_type clutter_set_default_frame_rate clutter_set_font_flags clutter_set_motion_events_enabled +clutter_set_windowing_backend clutter_shader_compile clutter_shader_effect_get_program clutter_shader_effect_get_shader