[mutter] compositor: Get the stage via the backend



commit 25f9406e6918070891dd8c1ab548420fda67e63d
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Thu Apr 16 19:14:21 2020 +0200

    compositor: Get the stage via the backend
    
    We would get the MetaDisplay from the backend singleton before creating
    the MetaCompositor, then in MetaCompositor, get the backend singleton
    again to get the stage. To get rid of the extra singleton fetching, just
    pass the backend the MetaCompositor constructors, and fetch the stage
    directly from the backend everytime it's needed.
    
    This also makes it available earlier than before, as we didn't set our
    instance private stage pointer until the manage() call.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1289

 src/compositor/compositor.c             | 44 ++++++++++++++++++++++-----------
 src/compositor/meta-compositor-native.c |  4 ++-
 src/compositor/meta-compositor-native.h |  3 ++-
 src/compositor/meta-compositor-server.c |  4 ++-
 src/compositor/meta-compositor-server.h |  3 ++-
 src/compositor/meta-compositor-x11.c    |  4 ++-
 src/compositor/meta-compositor-x11.h    |  3 ++-
 src/core/display.c                      |  8 +++---
 8 files changed, 49 insertions(+), 24 deletions(-)
---
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index d45d507432..5918c90474 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -91,6 +91,7 @@ enum
   PROP_0,
 
   PROP_DISPLAY,
+  PROP_BACKEND,
 
   N_PROPS
 };
@@ -111,6 +112,7 @@ typedef struct _MetaCompositorPrivate
   GObject parent;
 
   MetaDisplay *display;
+  MetaBackend *backend;
 
   guint pre_paint_func_id;
   guint post_paint_func_id;
@@ -231,7 +233,7 @@ meta_get_stage_for_display (MetaDisplay *display)
   g_return_val_if_fail (compositor, NULL);
   priv = meta_compositor_get_instance_private (compositor);
 
-  return priv->stage;
+  return meta_backend_get_stage (priv->backend);
 }
 
 /**
@@ -564,12 +566,11 @@ meta_compositor_do_manage (MetaCompositor  *compositor,
   MetaCompositorPrivate *priv =
     meta_compositor_get_instance_private (compositor);
   MetaDisplay *display = priv->display;
-  MetaBackend *backend = meta_get_backend ();
-
-  priv->stage = meta_backend_get_stage (backend);
+  MetaBackend *backend = priv->backend;
+  ClutterActor *stage = meta_backend_get_stage (backend);
 
   priv->stage_presented_id =
-    g_signal_connect (priv->stage, "presented",
+    g_signal_connect (stage, "presented",
                       G_CALLBACK (on_presented),
                       compositor);
 
@@ -582,18 +583,18 @@ meta_compositor_do_manage (MetaCompositor  *compositor,
    * matter.
    */
   priv->stage_after_paint_id =
-    g_signal_connect_after (priv->stage, "after-paint",
+    g_signal_connect_after (stage, "after-paint",
                             G_CALLBACK (after_stage_paint), compositor);
 
-  clutter_stage_set_sync_delay (CLUTTER_STAGE (priv->stage), META_SYNC_DELAY);
+  clutter_stage_set_sync_delay (CLUTTER_STAGE (stage), META_SYNC_DELAY);
 
   priv->window_group = meta_window_group_new (display);
   priv->top_window_group = meta_window_group_new (display);
   priv->feedback_group = meta_window_group_new (display);
 
-  clutter_actor_add_child (priv->stage, priv->window_group);
-  clutter_actor_add_child (priv->stage, priv->top_window_group);
-  clutter_actor_add_child (priv->stage, priv->feedback_group);
+  clutter_actor_add_child (stage, priv->window_group);
+  clutter_actor_add_child (stage, priv->top_window_group);
+  clutter_actor_add_child (stage, priv->feedback_group);
 
   if (!META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor, error))
     return FALSE;
@@ -1162,7 +1163,7 @@ meta_compositor_real_post_paint (MetaCompositor *compositor)
 
     case COGL_GRAPHICS_RESET_STATUS_PURGED_CONTEXT_RESET:
       g_signal_emit_by_name (priv->display, "gl-video-memory-purged");
-      clutter_actor_queue_redraw (CLUTTER_ACTOR (priv->stage));
+      clutter_actor_queue_redraw (meta_backend_get_stage (priv->backend));
       break;
 
     default:
@@ -1211,6 +1212,9 @@ meta_compositor_set_property (GObject      *object,
     case PROP_DISPLAY:
       priv->display = g_value_get_object (value);
       break;
+    case PROP_BACKEND:
+      priv->backend = g_value_get_object (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -1231,6 +1235,9 @@ meta_compositor_get_property (GObject    *object,
     case PROP_DISPLAY:
       g_value_set_object (value, priv->display);
       break;
+    case PROP_BACKEND:
+      g_value_set_object (value, priv->backend);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -1266,11 +1273,12 @@ meta_compositor_dispose (GObject *object)
   MetaCompositor *compositor = META_COMPOSITOR (object);
   MetaCompositorPrivate *priv =
     meta_compositor_get_instance_private (compositor);
+  ClutterActor *stage = meta_backend_get_stage (priv->backend);
 
   g_clear_pointer (&priv->laters, meta_laters_free);
 
-  g_clear_signal_handler (&priv->stage_after_paint_id, priv->stage);
-  g_clear_signal_handler (&priv->stage_presented_id, priv->stage);
+  g_clear_signal_handler (&priv->stage_after_paint_id, stage);
+  g_clear_signal_handler (&priv->stage_presented_id, stage);
 
   g_clear_handle_id (&priv->pre_paint_func_id,
                      clutter_threads_remove_repaint_func);
@@ -1309,6 +1317,14 @@ meta_compositor_class_init (MetaCompositorClass *klass)
                          G_PARAM_READWRITE |
                          G_PARAM_CONSTRUCT_ONLY |
                          G_PARAM_STATIC_STRINGS);
+  obj_props[PROP_BACKEND] =
+    g_param_spec_object ("backend",
+                         "backend",
+                         "MetaBackend",
+                         META_TYPE_BACKEND,
+                         G_PARAM_READWRITE |
+                         G_PARAM_CONSTRUCT_ONLY |
+                         G_PARAM_STATIC_STRINGS);
   g_object_class_install_properties (object_class, N_PROPS, obj_props);
 
   signals[PRE_PAINT] =
@@ -1615,7 +1631,7 @@ meta_compositor_get_stage (MetaCompositor *compositor)
   MetaCompositorPrivate *priv =
     meta_compositor_get_instance_private (compositor);
 
-  return CLUTTER_STAGE (priv->stage);
+  return CLUTTER_STAGE (meta_backend_get_stage (priv->backend));
 }
 
 MetaWindowActor *
diff --git a/src/compositor/meta-compositor-native.c b/src/compositor/meta-compositor-native.c
index 85929c0353..cbbca374ba 100644
--- a/src/compositor/meta-compositor-native.c
+++ b/src/compositor/meta-compositor-native.c
@@ -127,10 +127,12 @@ meta_compositor_native_pre_paint (MetaCompositor *compositor)
 }
 
 MetaCompositorNative *
-meta_compositor_native_new (MetaDisplay *display)
+meta_compositor_native_new (MetaDisplay *display,
+                            MetaBackend *backend)
 {
   return g_object_new (META_TYPE_COMPOSITOR_NATIVE,
                        "display", display,
+                       "backend", backend,
                        NULL);
 }
 
diff --git a/src/compositor/meta-compositor-native.h b/src/compositor/meta-compositor-native.h
index d276a5905f..2b1c652087 100644
--- a/src/compositor/meta-compositor-native.h
+++ b/src/compositor/meta-compositor-native.h
@@ -27,6 +27,7 @@
 G_DECLARE_FINAL_TYPE (MetaCompositorNative, meta_compositor_native,
                       META, COMPOSITOR_NATIVE, MetaCompositor)
 
-MetaCompositorNative * meta_compositor_native_new (MetaDisplay *display);
+MetaCompositorNative * meta_compositor_native_new (MetaDisplay *display,
+                                                   MetaBackend *backend);
 
 #endif /* META_COMPOSITOR_NATIVE_H */
diff --git a/src/compositor/meta-compositor-server.c b/src/compositor/meta-compositor-server.c
index f61f55560b..f53c10a196 100644
--- a/src/compositor/meta-compositor-server.c
+++ b/src/compositor/meta-compositor-server.c
@@ -37,10 +37,12 @@ meta_compositor_server_unmanage (MetaCompositor *compositor)
 }
 
 MetaCompositorServer *
-meta_compositor_server_new (MetaDisplay *display)
+meta_compositor_server_new (MetaDisplay *display,
+                            MetaBackend *backend)
 {
   return g_object_new (META_TYPE_COMPOSITOR_SERVER,
                        "display", display,
+                       "backend", backend,
                        NULL);
 }
 
diff --git a/src/compositor/meta-compositor-server.h b/src/compositor/meta-compositor-server.h
index 8b4a92748a..2bf8d5ec3b 100644
--- a/src/compositor/meta-compositor-server.h
+++ b/src/compositor/meta-compositor-server.h
@@ -32,6 +32,7 @@ struct _MetaCompositorServerClass
   MetaCompositorClass parent_class;
 };
 
-MetaCompositorServer * meta_compositor_server_new (MetaDisplay *display);
+MetaCompositorServer * meta_compositor_server_new (MetaDisplay *display,
+                                                   MetaBackend *backend);
 
 #endif /* META_COMPOSITOR_SERVER_H */
diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c
index 211b907e9d..0ab4aa0320 100644
--- a/src/compositor/meta-compositor-x11.c
+++ b/src/compositor/meta-compositor-x11.c
@@ -371,10 +371,12 @@ meta_compositor_x11_get_output_xwindow (MetaCompositorX11 *compositor_x11)
 }
 
 MetaCompositorX11 *
-meta_compositor_x11_new (MetaDisplay *display)
+meta_compositor_x11_new (MetaDisplay *display,
+                         MetaBackend *backend)
 {
   return g_object_new (META_TYPE_COMPOSITOR_X11,
                        "display", display,
+                       "backend", backend,
                        NULL);
 }
 
diff --git a/src/compositor/meta-compositor-x11.h b/src/compositor/meta-compositor-x11.h
index 7165493cdc..42554feb39 100644
--- a/src/compositor/meta-compositor-x11.h
+++ b/src/compositor/meta-compositor-x11.h
@@ -27,7 +27,8 @@
 G_DECLARE_FINAL_TYPE (MetaCompositorX11, meta_compositor_x11,
                       META, COMPOSITOR_X11, MetaCompositor)
 
-MetaCompositorX11 * meta_compositor_x11_new (MetaDisplay *display);
+MetaCompositorX11 * meta_compositor_x11_new (MetaDisplay *display,
+                                             MetaBackend *backend);
 
 void meta_compositor_x11_process_xevent (MetaCompositorX11 *compositor_x11,
                                          XEvent            *xevent,
diff --git a/src/core/display.c b/src/core/display.c
index d49475dcb2..4f2ed6c600 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -573,17 +573,17 @@ meta_display_remove_pending_pings_for_window (MetaDisplay *display,
 static MetaCompositor *
 create_compositor (MetaDisplay *display)
 {
-#ifdef HAVE_WAYLAND
   MetaBackend *backend = meta_get_backend ();
 
+#ifdef HAVE_WAYLAND
 #ifdef HAVE_NATIVE_BACKEND
   if (META_IS_BACKEND_NATIVE (backend))
-    return META_COMPOSITOR (meta_compositor_native_new (display));
+    return META_COMPOSITOR (meta_compositor_native_new (display, backend));
 #endif
   if (META_IS_BACKEND_X11_NESTED (backend))
-    return META_COMPOSITOR (meta_compositor_server_new (display));
+    return META_COMPOSITOR (meta_compositor_server_new (display, backend));
 #endif
-  return META_COMPOSITOR (meta_compositor_x11_new (display));
+  return META_COMPOSITOR (meta_compositor_x11_new (display, backend));
 }
 
 static void


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