[mutter] display: Initialize MetaCompositor in two steps
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] display: Initialize MetaCompositor in two steps
- Date: Thu, 16 Apr 2020 14:09:38 +0000 (UTC)
commit dc4fe780f790c8fbd3624a7e75fd25c9a3918d0b
Author: Jonas Ådahl <jadahl gmail com>
Date: Tue Mar 3 09:27:33 2020 +0100
display: Initialize MetaCompositor in two steps
MetaCompositor is the place in mutter that manages the higher level
state of compositing, such as handling what happens before and after
paint. In order for other units that depend on having a compositor
instance active, but should be initialized before the X11 implementation
of MetaCompositor registers as a X11 compositing manager, split the
initialization of compositing into two steps:
1) Instantiate the object - only construct the instance, making it
possible for users to start listening to signals etc
2) Manage - this e.g. establishes the compositor as the X11 compositing
manager and similar things.
This will enable us to put compositing dependent scattered global
variables into a MetaCompositor owned object.
For now, compositor management is internally done by calling a new
`meta_compositor_do_manage()`, as right now we can't change the API of
`meta_compositor_manage()` as it is public. For the next version, manual
management of compositing will removed from the public API, and only
managed internally.
https://gitlab.gnome.org/GNOME/mutter/merge_requests/798
src/compositor/compositor-private.h | 6 ++++-
src/compositor/compositor.c | 19 ++++++++++++---
src/compositor/meta-compositor-server.c | 6 +++--
src/compositor/meta-compositor-x11.c | 32 ++++++++++++++++++++++---
src/core/display.c | 42 ++++++---------------------------
5 files changed, 61 insertions(+), 44 deletions(-)
---
diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h
index 8935732ba..eb536284f 100644
--- a/src/compositor/compositor-private.h
+++ b/src/compositor/compositor-private.h
@@ -18,7 +18,8 @@ struct _MetaCompositorClass
{
GObjectClass parent_class;
- void (* manage) (MetaCompositor *compositor);
+ gboolean (* manage) (MetaCompositor *compositor,
+ GError **error);
void (* unmanage) (MetaCompositor *compositor);
void (* pre_paint) (MetaCompositor *compositor);
void (* post_paint) (MetaCompositor *compositor);
@@ -26,6 +27,9 @@ struct _MetaCompositorClass
MetaWindow *window);
};
+gboolean meta_compositor_do_manage (MetaCompositor *compositor,
+ GError **error);
+
void meta_compositor_remove_window_actor (MetaCompositor *compositor,
MetaWindowActor *window_actor);
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 111965797..5681d7478 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -550,8 +550,9 @@ meta_compositor_redirect_x11_windows (MetaCompositor *compositor)
redirect_windows (display->x11_display);
}
-void
-meta_compositor_manage (MetaCompositor *compositor)
+gboolean
+meta_compositor_do_manage (MetaCompositor *compositor,
+ GError **error)
{
MetaCompositorPrivate *priv =
meta_compositor_get_instance_private (compositor);
@@ -587,9 +588,21 @@ meta_compositor_manage (MetaCompositor *compositor)
clutter_actor_add_child (priv->stage, priv->top_window_group);
clutter_actor_add_child (priv->stage, priv->feedback_group);
- META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor);
+ if (!META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor, error))
+ return FALSE;
priv->plugin_mgr = meta_plugin_manager_new (compositor);
+
+ return TRUE;
+}
+
+void
+meta_compositor_manage (MetaCompositor *compositor)
+{
+ GError *error = NULL;
+
+ if (!meta_compositor_do_manage (compositor, &error))
+ g_error ("Compositor failed to manage display: %s", error->message);
}
void
diff --git a/src/compositor/meta-compositor-server.c b/src/compositor/meta-compositor-server.c
index 928501f8a..361bcc599 100644
--- a/src/compositor/meta-compositor-server.c
+++ b/src/compositor/meta-compositor-server.c
@@ -29,9 +29,11 @@ struct _MetaCompositorServer
G_DEFINE_TYPE (MetaCompositorServer, meta_compositor_server, META_TYPE_COMPOSITOR)
-static void
-meta_compositor_server_manage (MetaCompositor *compositor)
+static gboolean
+meta_compositor_server_manage (MetaCompositor *compositor,
+ GError **error)
{
+ return TRUE;
}
static void
diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c
index 1737e97f5..211b907e9 100644
--- a/src/compositor/meta-compositor-x11.c
+++ b/src/compositor/meta-compositor-x11.c
@@ -100,15 +100,39 @@ meta_compositor_x11_process_xevent (MetaCompositorX11 *compositor_x11,
meta_x11_handle_event (xevent);
}
-static void
-meta_compositor_x11_manage (MetaCompositor *compositor)
+static gboolean
+meta_compositor_x11_manage (MetaCompositor *compositor,
+ GError **error)
{
MetaCompositorX11 *compositor_x11 = META_COMPOSITOR_X11 (compositor);
MetaDisplay *display = meta_compositor_get_display (compositor);
- Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
+ MetaX11Display *x11_display = display->x11_display;
+ Display *xdisplay = meta_x11_display_get_xdisplay (x11_display);
+ int composite_version;
MetaBackend *backend = meta_get_backend ();
Window xwindow;
+ if (!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ||
+ !META_X11_DISPLAY_HAS_DAMAGE (x11_display))
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Missing required extension %s",
+ !META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ?
+ "composite" : "damage");
+ return FALSE;
+ }
+
+ composite_version = ((x11_display->composite_major_version * 10) +
+ x11_display->composite_minor_version);
+ if (composite_version < 3)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "COMPOSITE extension 3.0 required (found %d.%d)",
+ x11_display->composite_major_version,
+ x11_display->composite_minor_version);
+ return FALSE;
+ }
+
meta_x11_display_set_cm_selection (display->x11_display);
compositor_x11->output = display->x11_display->composite_overlay_window;
@@ -139,6 +163,8 @@ meta_compositor_x11_manage (MetaCompositor *compositor)
compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay);
meta_compositor_redirect_x11_windows (META_COMPOSITOR (compositor));
+
+ return TRUE;
}
static void
diff --git a/src/core/display.c b/src/core/display.c
index 0917f4693..8de64b0e0 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -579,39 +579,6 @@ create_compositor (MetaDisplay *display)
return META_COMPOSITOR (meta_compositor_x11_new (display));
}
-static void
-enable_compositor (MetaDisplay *display)
-{
- MetaX11Display *x11_display = display->x11_display;
-
- if (x11_display)
- {
- if (!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ||
- !META_X11_DISPLAY_HAS_DAMAGE (x11_display))
- {
- meta_fatal ("Missing %s extension required for compositing",
- !META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ?
- "composite" : "damage");
- return;
- }
-
- int version = (x11_display->composite_major_version * 10) +
- x11_display->composite_minor_version;
- if (version < 3)
- {
- meta_fatal ("Your version of COMPOSITE (%d.%d) is too old. Version 3.0 or later required.",
- x11_display->composite_major_version,
- x11_display->composite_minor_version);
- return;
- }
- }
-
- if (!display->compositor)
- display->compositor = create_compositor (display);
-
- meta_compositor_manage (display->compositor);
-}
-
static void
meta_display_init (MetaDisplay *disp)
{
@@ -885,6 +852,8 @@ meta_display_open (void)
g_signal_connect (settings, "ui-scaling-factor-changed",
G_CALLBACK (on_ui_scaling_factor_changed), display);
+ display->compositor = create_compositor (display);
+
meta_display_set_cursor (display, META_CURSOR_DEFAULT);
display->stack = meta_stack_new (display);
@@ -922,7 +891,6 @@ meta_display_open (void)
display->last_focus_time = timestamp;
display->last_user_time = timestamp;
- display->compositor = NULL;
if (!meta_is_wayland_compositor ())
meta_prop_get_window (display->x11_display,
@@ -930,7 +898,11 @@ meta_display_open (void)
display->x11_display->atom__NET_ACTIVE_WINDOW,
&old_active_xwindow);
- enable_compositor (display);
+ if (!meta_compositor_do_manage (display->compositor, &error))
+ {
+ g_error ("Compositor failed to manage display: %s",
+ error->message);
+ }
if (display->x11_display)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]