[mutter] Make mutter manage its own clutter backends



commit 90de521799aa181fd612325460b99a0b4a0a2c93
Author: Jonas Ådahl <jadahl gmail com>
Date:   Wed May 4 16:19:23 2016 +0800

    Make mutter manage its own clutter backends
    
    Introduce two new clutter backends: MetaClutterBackendX11 and
    MetaClutterBackendNative. They are so far only wrap ClutterBackendX11
    and ClutterBackendEglNative respectively, but the aim is to move things
    from the original clutter backends when needed.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=768976

 clutter/clutter/clutter-backend.c                 |   24 ++++++-
 clutter/clutter/clutter-macros.h                  |    2 +
 clutter/clutter/clutter-mutter.h                  |   36 ++++++++++
 clutter/clutter/egl/clutter-backend-eglnative.h   |    3 +
 clutter/clutter/x11/clutter-backend-x11.h         |    3 +
 src/Makefile.am                                   |    4 +
 src/backends/meta-backend-private.h               |    5 ++
 src/backends/meta-backend.c                       |   76 ++++++++++++++-------
 src/backends/native/meta-backend-native.c         |   10 +++
 src/backends/native/meta-backend-native.h         |    1 +
 src/backends/native/meta-clutter-backend-native.c |   49 +++++++++++++
 src/backends/native/meta-clutter-backend-native.h |   38 ++++++++++
 src/backends/x11/meta-backend-x11.c               |    9 +++
 src/backends/x11/meta-backend-x11.h               |    2 +
 src/backends/x11/meta-clutter-backend-x11.c       |   48 +++++++++++++
 src/backends/x11/meta-clutter-backend-x11.h       |   38 ++++++++++
 src/core/main.c                                   |   23 +++++--
 src/core/util-private.h                           |   16 +++++
 18 files changed, 353 insertions(+), 34 deletions(-)
---
diff --git a/clutter/clutter/clutter-backend.c b/clutter/clutter/clutter-backend.c
index f66370c..a827229 100644
--- a/clutter/clutter/clutter-backend.c
+++ b/clutter/clutter/clutter-backend.c
@@ -48,6 +48,7 @@
 #include "clutter-debug.h"
 #include "clutter-event-private.h"
 #include "clutter-marshal.h"
+#include "clutter-mutter.h"
 #include "clutter-private.h"
 #include "clutter-stage-manager-private.h"
 #include "clutter-stage-private.h"
@@ -236,10 +237,7 @@ clutter_backend_do_real_create_context (ClutterBackend  *backend,
   internal_error = NULL;
 
   CLUTTER_NOTE (BACKEND, "Creating Cogl renderer");
-  if (klass->get_renderer != NULL)
-    backend->cogl_renderer = klass->get_renderer (backend, &internal_error);
-  else
-    backend->cogl_renderer = cogl_renderer_new ();
+  backend->cogl_renderer = klass->get_renderer (backend, &internal_error);
 
   if (backend->cogl_renderer == NULL)
     goto error;
@@ -510,6 +508,8 @@ clutter_backend_real_create_stage (ClutterBackend  *backend,
 
 static const char *allowed_backends;
 
+static ClutterBackend * (* custom_backend_func) (void);
+
 static const struct {
   const char *name;
   ClutterBackend * (* create_backend) (void);
@@ -523,6 +523,12 @@ static const struct {
   { NULL, NULL },
 };
 
+void
+clutter_set_custom_backend_func (ClutterBackend *(* func) (void))
+{
+  custom_backend_func = func;
+}
+
 ClutterBackend *
 _clutter_create_backend (void)
 {
@@ -532,6 +538,16 @@ _clutter_create_backend (void)
   char **backends;
   int i;
 
+  if (custom_backend_func)
+    {
+      retval = custom_backend_func ();
+
+      if (!retval)
+        g_error ("Failed to create custom backend.");
+
+      return retval;
+    }
+
   if (allowed_backends == NULL)
     allowed_backends = "*";
 
diff --git a/clutter/clutter/clutter-macros.h b/clutter/clutter/clutter-macros.h
index 3b5a18e..521ad43 100644
--- a/clutter/clutter/clutter-macros.h
+++ b/clutter/clutter/clutter-macros.h
@@ -128,6 +128,8 @@
 
 #define CLUTTER_AVAILABLE_IN_ALL _CLUTTER_EXTERN
 
+#define CLUTTER_AVAILABLE_IN_MUTTER _CLUTTER_EXTERN
+
 /**
  * CLUTTER_VERSION_MIN_REQUIRED:
  *
diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h
new file mode 100644
index 0000000..ebd06b6
--- /dev/null
+++ b/clutter/clutter/clutter-mutter.h
@@ -0,0 +1,36 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2016 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef __CLUTTER_MUTTER_H__
+#define __CLUTTER_MUTTER_H__
+
+#define __CLUTTER_H_INSIDE__
+
+#include "clutter-backend.h"
+#include "clutter-macros.h"
+
+CLUTTER_AVAILABLE_IN_MUTTER
+void clutter_set_custom_backend_func (ClutterBackend *(* func) (void));
+
+#undef __CLUTTER_H_INSIDE__
+
+#endif /* __CLUTTER_MUTTER_H__ */
diff --git a/clutter/clutter/egl/clutter-backend-eglnative.h b/clutter/clutter/egl/clutter-backend-eglnative.h
index 00424b8..d98013d 100644
--- a/clutter/clutter/egl/clutter-backend-eglnative.h
+++ b/clutter/clutter/egl/clutter-backend-eglnative.h
@@ -47,6 +47,8 @@ G_BEGIN_DECLS
 typedef struct _ClutterBackendEglNative       ClutterBackendEglNative;
 typedef struct _ClutterBackendEglNativeClass  ClutterBackendEglNativeClass;
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackendEglNative, g_object_unref)
+
 struct _ClutterBackendEglNative
 {
   ClutterBackend parent_instance;
@@ -66,6 +68,7 @@ struct _ClutterBackendEglNativeClass
   ClutterBackendClass parent_class;
 };
 
+CLUTTER_AVAILABLE_IN_MUTTER
 GType clutter_backend_egl_native_get_type (void) G_GNUC_CONST;
 
 ClutterBackend *clutter_backend_egl_native_new (void);
diff --git a/clutter/clutter/x11/clutter-backend-x11.h b/clutter/clutter/x11/clutter-backend-x11.h
index 98a4589..50d0797 100644
--- a/clutter/clutter/x11/clutter-backend-x11.h
+++ b/clutter/clutter/x11/clutter-backend-x11.h
@@ -48,6 +48,8 @@ typedef struct _ClutterBackendX11Class  ClutterBackendX11Class;
 typedef struct _ClutterEventX11         ClutterEventX11;
 typedef struct _ClutterX11EventFilter   ClutterX11EventFilter;
 
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterBackendX11, g_object_unref)
+
 struct _ClutterX11EventFilter
 {
   ClutterX11FilterFunc func;
@@ -116,6 +118,7 @@ struct _ClutterBackendX11Class
   ClutterBackendClass parent_class;
 };
 
+CLUTTER_AVAILABLE_IN_MUTTER
 GType clutter_backend_x11_get_type (void) G_GNUC_CONST;
 
 ClutterBackend *clutter_backend_x11_new (void);
diff --git a/src/Makefile.am b/src/Makefile.am
index 77e8e02..f2fae4c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -108,6 +108,8 @@ libmutter_la_SOURCES =                              \
        backends/x11/meta-backend-x11.h                 \
        backends/x11/meta-barrier-x11.c                 \
        backends/x11/meta-barrier-x11.h                 \
+       backends/x11/meta-clutter-backend-x11.c         \
+       backends/x11/meta-clutter-backend-x11.h         \
        backends/x11/meta-cursor-renderer-x11.c         \
        backends/x11/meta-cursor-renderer-x11.h         \
        backends/x11/nested/meta-cursor-renderer-x11-nested.c           \
@@ -328,6 +330,8 @@ libmutter_la_SOURCES +=                                     \
        backends/native/meta-backend-native-private.h   \
        backends/native/meta-barrier-native.c           \
        backends/native/meta-barrier-native.h           \
+       backends/native/meta-clutter-backend-native.c   \
+       backends/native/meta-clutter-backend-native.h   \
        backends/native/meta-cursor-renderer-native.c   \
        backends/native/meta-cursor-renderer-native.h   \
        backends/native/meta-idle-monitor-native.c      \
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 73123ce..4bf1934 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -35,6 +35,7 @@
 #include "meta-cursor-renderer.h"
 #include "meta-monitor-manager-private.h"
 #include "backends/meta-pointer-constraint.h"
+#include "core/util-private.h"
 
 #define DEFAULT_XKB_RULES_FILE "evdev"
 #define DEFAULT_XKB_MODEL "pc105+inet"
@@ -60,6 +61,8 @@ struct _MetaBackendClass
 {
   GObjectClass parent_class;
 
+  ClutterBackend * (* create_clutter_backend) (MetaBackend *backend);
+
   void (* post_init) (MetaBackend *backend);
 
   MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend,
@@ -99,6 +102,8 @@ struct _MetaBackendClass
                                            double       *dy_unaccel);
 };
 
+void meta_init_backend (MetaBackendType backend_type);
+
 MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
                                                  int          device_id);
 MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend);
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 93c8ad3..238624f 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -26,6 +26,7 @@
 
 #include <stdlib.h>
 
+#include <clutter/clutter-mutter.h>
 #include <meta/meta-backend.h>
 #include "meta-backend-private.h"
 #include "meta-input-settings-private.h"
@@ -63,6 +64,7 @@ struct _MetaBackendPrivate
   MetaCursorRenderer *cursor_renderer;
   MetaInputSettings *input_settings;
 
+  ClutterBackend *clutter_backend;
   ClutterActor *stage;
 
   guint device_update_idle_id;
@@ -610,30 +612,6 @@ meta_backend_set_client_pointer_constraint (MetaBackend           *backend,
     backend->client_pointer_constraint = g_object_ref (constraint);
 }
 
-static GType
-get_backend_type (void)
-{
-#if defined(CLUTTER_WINDOWING_X11)
-  if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
-    return META_TYPE_BACKEND_X11;
-#endif
-
-#if defined(CLUTTER_WINDOWING_EGL) && defined(HAVE_NATIVE_BACKEND)
-  if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL))
-    return META_TYPE_BACKEND_NATIVE;
-#endif
-
-  g_assert_not_reached ();
-}
-
-static void
-meta_create_backend (void)
-{
-  /* meta_backend_init() above install the backend globally so
-   * so meta_get_backend() works even during initialization. */
-  g_object_new (get_backend_type (), NULL);
-}
-
 /* Mutter is responsible for pulling events off the X queue, so Clutter
  * doesn't need (and shouldn't) run its normal event source which polls
  * the X fd, but we do have to deal with dispatching events that accumulate
@@ -682,6 +660,54 @@ static GSourceFuncs event_funcs = {
   event_dispatch
 };
 
+static ClutterBackend *
+meta_backend_get_clutter_backend (MetaBackend *backend)
+{
+  MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+  if (!priv->clutter_backend)
+    {
+      priv->clutter_backend =
+        META_BACKEND_GET_CLASS (backend)->create_clutter_backend (backend);
+    }
+
+  return priv->clutter_backend;
+}
+
+static ClutterBackend *
+meta_get_clutter_backend (void)
+{
+  MetaBackend *backend = meta_get_backend ();
+
+  return meta_backend_get_clutter_backend (backend);
+}
+
+void
+meta_init_backend (MetaBackendType backend_type)
+{
+  GType type;
+
+  switch (backend_type)
+    {
+    case META_BACKEND_TYPE_X11:
+      type = META_TYPE_BACKEND_X11;
+      break;
+
+#ifdef HAVE_NATIVE_BACKEND
+    case META_BACKEND_TYPE_NATIVE:
+      type = META_TYPE_BACKEND_NATIVE;
+      break;
+#endif
+
+    default:
+      g_assert_not_reached ();
+    }
+
+  /* meta_backend_init() above install the backend globally so
+   * so meta_get_backend() works even during initialization. */
+  g_object_new (type, NULL);
+}
+
 /**
  * meta_clutter_init: (skip)
  */
@@ -691,7 +717,7 @@ meta_clutter_init (void)
   ClutterSettings *clutter_settings;
   GSource *source;
 
-  meta_create_backend ();
+  clutter_set_custom_backend_func (meta_get_clutter_backend);
 
   if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
     {
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 454eec6..bc4ecad 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -38,6 +38,7 @@
 #include "meta-launcher.h"
 #include "backends/meta-cursor-tracker-private.h"
 #include "backends/meta-pointer-constraint.h"
+#include "backends/native/meta-clutter-backend-native.h"
 
 #include <stdlib.h>
 
@@ -241,6 +242,12 @@ pointer_constrain_callback (ClutterInputDevice *device,
   constrain_all_screen_monitors(device, monitors, n_monitors, new_x, new_y);
 }
 
+static ClutterBackend *
+meta_backend_native_create_clutter_backend (MetaBackend *backend)
+{
+  return g_object_new (META_TYPE_CLUTTER_BACKEND_NATIVE, NULL);
+}
+
 static void
 meta_backend_native_post_init (MetaBackend *backend)
 {
@@ -357,7 +364,10 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
 
   object_class->finalize = meta_backend_native_finalize;
 
+  backend_class->create_clutter_backend = meta_backend_native_create_clutter_backend;
+
   backend_class->post_init = meta_backend_native_post_init;
+
   backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
   backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
   backend_class->create_cursor_renderer = meta_backend_native_create_cursor_renderer;
diff --git a/src/backends/native/meta-backend-native.h b/src/backends/native/meta-backend-native.h
index 64a494b..136012b 100644
--- a/src/backends/native/meta-backend-native.h
+++ b/src/backends/native/meta-backend-native.h
@@ -26,6 +26,7 @@
 #define META_BACKEND_NATIVE_H
 
 #include "backends/meta-backend-private.h"
+#include "backends/native/meta-clutter-backend-native.h"
 
 #define META_TYPE_BACKEND_NATIVE             (meta_backend_native_get_type ())
 #define META_BACKEND_NATIVE(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_NATIVE, 
MetaBackendNative))
diff --git a/src/backends/native/meta-clutter-backend-native.c 
b/src/backends/native/meta-clutter-backend-native.c
new file mode 100644
index 0000000..b374f4f
--- /dev/null
+++ b/src/backends/native/meta-clutter-backend-native.c
@@ -0,0 +1,49 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Jonas Ådahl <jadahl gmail com>
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "clutter/clutter.h"
+#include "clutter/egl/clutter-backend-eglnative.h"
+#include "backends/native/meta-clutter-backend-native.h"
+
+struct _MetaClutterBackendNative
+{
+  ClutterBackendEglNative parent;
+};
+
+G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
+               CLUTTER_TYPE_BACKEND_EGL_NATIVE)
+
+static void
+meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen)
+{
+}
+
+static void
+meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
+{
+}
diff --git a/src/backends/native/meta-clutter-backend-native.h 
b/src/backends/native/meta-clutter-backend-native.h
new file mode 100644
index 0000000..d9124f2
--- /dev/null
+++ b/src/backends/native/meta-clutter-backend-native.h
@@ -0,0 +1,38 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Jonas Ådahl <jadahl gmail com>
+ */
+
+#ifndef META_CLUTTER_BACKEND_NATIVE_H
+#define META_CLUTTER_BACKEND_NATIVE_H
+
+#include <glib-object.h>
+
+#include "clutter/clutter.h"
+#include "clutter/egl/clutter-backend-eglnative.h"
+
+#define META_TYPE_CLUTTER_BACKEND_NATIVE (meta_clutter_backend_native_get_type ())
+G_DECLARE_FINAL_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
+                      META, CLUTTER_BACKEND_NATIVE,
+                      ClutterBackendEglNative)
+
+#endif /* META_CLUTTER_BACKEND_NATIVE_H */
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index 0890996..116da20 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -29,6 +29,7 @@
 
 #include "meta-backend-x11.h"
 
+#include <clutter.h>
 #include <clutter/x11/clutter-x11.h>
 
 #include <X11/extensions/sync.h>
@@ -41,6 +42,7 @@
 #include "meta-monitor-manager-xrandr.h"
 #include "backends/meta-monitor-manager-dummy.h"
 #include "backends/x11/nested/meta-cursor-renderer-x11-nested.h"
+#include "backends/x11/meta-clutter-backend-x11.h"
 #include "meta-cursor-renderer-x11.h"
 #ifdef HAVE_WAYLAND
 #include "wayland/meta-wayland.h"
@@ -499,6 +501,12 @@ meta_backend_x11_post_init (MetaBackend *backend)
   META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
 }
 
+static ClutterBackend *
+meta_backend_x11_create_clutter_backend (MetaBackend *backend)
+{
+  return g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
+}
+
 static MetaIdleMonitor *
 meta_backend_x11_create_idle_monitor (MetaBackend *backend,
                                       int          device_id)
@@ -865,6 +873,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
 {
   MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
 
+  backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
   backend_class->post_init = meta_backend_x11_post_init;
   backend_class->create_idle_monitor = meta_backend_x11_create_idle_monitor;
   backend_class->create_monitor_manager = meta_backend_x11_create_monitor_manager;
diff --git a/src/backends/x11/meta-backend-x11.h b/src/backends/x11/meta-backend-x11.h
index 040f927..439d09f 100644
--- a/src/backends/x11/meta-backend-x11.h
+++ b/src/backends/x11/meta-backend-x11.h
@@ -29,6 +29,8 @@
 
 #include <X11/Xlib.h>
 
+#include "backends/x11/meta-clutter-backend-x11.h"
+
 #define META_TYPE_BACKEND_X11             (meta_backend_x11_get_type ())
 #define META_BACKEND_X11(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND_X11, 
MetaBackendX11))
 #define META_BACKEND_X11_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_BACKEND_X11, 
MetaBackendX11Class))
diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c
new file mode 100644
index 0000000..3b40177
--- /dev/null
+++ b/src/backends/x11/meta-clutter-backend-x11.c
@@ -0,0 +1,48 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Jonas Ådahl <jadahl gmail com>
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "backends/x11/meta-clutter-backend-x11.h"
+#include "clutter/clutter.h"
+
+struct _MetaClutterBackendX11
+{
+  ClutterBackendX11 parent;
+};
+
+G_DEFINE_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
+               CLUTTER_TYPE_BACKEND_X11)
+
+static void
+meta_clutter_backend_x11_init (MetaClutterBackendX11 *clutter_backend_x11)
+{
+}
+
+static void
+meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass)
+{
+}
diff --git a/src/backends/x11/meta-clutter-backend-x11.h b/src/backends/x11/meta-clutter-backend-x11.h
new file mode 100644
index 0000000..4e811e4
--- /dev/null
+++ b/src/backends/x11/meta-clutter-backend-x11.h
@@ -0,0 +1,38 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2016 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ *     Jonas Ådahl <jadahl gmail com>
+ */
+
+#ifndef META_CLUTTER_BACKEND_X11_H
+#define META_CLUTTER_BACKEND_X11_H
+
+#include <glib-object.h>
+
+#include "clutter/clutter.h"
+#include "clutter/x11/clutter-backend-x11.h"
+
+#define META_TYPE_CLUTTER_BACKEND_X11 (meta_clutter_backend_x11_get_type ())
+G_DECLARE_FINAL_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
+                      META, CLUTTER_BACKEND_X11,
+                      ClutterBackendX11)
+
+#endif /* META_CLUTTER_BACKEND_X11_H */
diff --git a/src/core/main.c b/src/core/main.c
index c99ede5..c7ce17d 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -82,6 +82,8 @@
 #include "wayland/meta-wayland.h"
 # endif
 
+#include "backends/meta-backend-private.h"
+
 #if defined(HAVE_NATIVE_BACKEND) && defined(HAVE_WAYLAND)
 #include <systemd/sd-login.h>
 #endif
@@ -371,7 +373,8 @@ check_for_wayland_session_type (void)
 #endif
 
 static void
-init_backend (void)
+calculate_compositor_configuration (MetaCompositorType *compositor_type,
+                                    MetaBackendType    *backend_type)
 {
 #ifdef HAVE_WAYLAND
   gboolean run_as_wayland_compositor = opt_wayland;
@@ -388,16 +391,19 @@ init_backend (void)
 
 #ifdef CLUTTER_WINDOWING_EGL
   if (opt_display_server || (run_as_wayland_compositor && !opt_nested))
-    clutter_set_windowing_backend (CLUTTER_WINDOWING_EGL);
+    *backend_type = META_BACKEND_TYPE_NATIVE;
   else
 #endif
 #endif
 #endif
-    clutter_set_windowing_backend (CLUTTER_WINDOWING_X11);
+    *backend_type = META_BACKEND_TYPE_X11;
 
 #ifdef HAVE_WAYLAND
-  meta_set_is_wayland_compositor (run_as_wayland_compositor);
+  if (run_as_wayland_compositor)
+    *compositor_type = META_COMPOSITOR_TYPE_WAYLAND;
+  else
 #endif
+    *compositor_type = META_COMPOSITOR_TYPE_X11;
 }
 
 /**
@@ -411,6 +417,8 @@ meta_init (void)
 {
   struct sigaction act;
   sigset_t empty_mask;
+  MetaCompositorType compositor_type;
+  MetaBackendType backend_type;
 
   sigemptyset (&empty_mask);
   act.sa_handler = SIG_IGN;
@@ -432,7 +440,10 @@ meta_init (void)
   if (g_getenv ("MUTTER_DEBUG"))
     meta_set_debugging (TRUE);
 
-  init_backend ();
+  calculate_compositor_configuration (&compositor_type, &backend_type);
+
+  if (compositor_type == META_COMPOSITOR_TYPE_WAYLAND)
+    meta_set_is_wayland_compositor (TRUE);
 
   if (g_get_home_dir ())
     if (chdir (g_get_home_dir ()) < 0)
@@ -455,6 +466,8 @@ meta_init (void)
   if (!meta_is_wayland_compositor ())
     meta_select_display (opt_display_name);
 
+  meta_init_backend (backend_type);
+
   meta_clutter_init ();
 
 #ifdef HAVE_WAYLAND
diff --git a/src/core/util-private.h b/src/core/util-private.h
index 7d1f4b9..c9f090a 100644
--- a/src/core/util-private.h
+++ b/src/core/util-private.h
@@ -28,6 +28,22 @@
 #include <meta/util.h>
 #include <glib/gi18n-lib.h>
 
+typedef enum _MetaCompositorType
+{
+#ifdef HAVE_WAYLAND
+  META_COMPOSITOR_TYPE_WAYLAND,
+#endif
+  META_COMPOSITOR_TYPE_X11,
+} MetaCompositorType;
+
+typedef enum _MetaBackendType
+{
+#ifdef HAVE_NATIVE_BACKEND
+  META_BACKEND_TYPE_NATIVE,
+#endif
+  META_BACKEND_TYPE_X11,
+} MetaBackendType;
+
 void     meta_set_verbose (gboolean setting);
 void     meta_set_debugging (gboolean setting);
 void     meta_set_syncing (gboolean setting);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]