Skip to content

Commit 742bea3

Browse files
committed
display: Initialize MetaCompositor in two steps
MetaCompositor is the place in muffin 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. Original Mutter commit: https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/798/diffs?commit_id=dc4fe780f790c8fbd3624a7e75fd25c9a3918d0b
1 parent fcd14d3 commit 742bea3

File tree

5 files changed

+62
-44
lines changed

5 files changed

+62
-44
lines changed

src/compositor/compositor-private.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ struct _MetaCompositorClass
1818
{
1919
GObjectClass parent_class;
2020

21-
void (* manage) (MetaCompositor *compositor);
21+
gboolean (* manage) (MetaCompositor *compositor,
22+
GError **error);
2223
void (* unmanage) (MetaCompositor *compositor);
2324
void (* pre_paint) (MetaCompositor *compositor);
2425
void (* post_paint) (MetaCompositor *compositor);
@@ -28,6 +29,9 @@ struct _MetaCompositorClass
2829
int64_t time_us);
2930
};
3031

32+
gboolean meta_compositor_do_manage (MetaCompositor *compositor,
33+
GError **error);
34+
3135
void meta_compositor_remove_window_actor (MetaCompositor *compositor,
3236
MetaWindowActor *window_actor);
3337

src/compositor/compositor.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,9 @@ meta_compositor_redirect_x11_windows (MetaCompositor *compositor)
567567
redirect_windows (display->x11_display);
568568
}
569569

570-
void
571-
meta_compositor_manage (MetaCompositor *compositor)
570+
gboolean
571+
meta_compositor_do_manage (MetaCompositor *compositor,
572+
GError **error)
572573
{
573574
MetaCompositorPrivate *priv =
574575
meta_compositor_get_instance_private (compositor);
@@ -618,11 +619,23 @@ meta_compositor_manage (MetaCompositor *compositor)
618619
clutter_actor_add_child (priv->stage, priv->top_window_group);
619620
clutter_actor_add_child (priv->stage, priv->feedback_group);
620621

621-
META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor);
622+
if (!META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor, error))
623+
return FALSE;
622624

623625
priv->plugin_mgr = meta_plugin_manager_new (compositor);
624626

625627
clutter_actor_show (priv->stage);
628+
629+
return TRUE;
630+
}
631+
632+
void
633+
meta_compositor_manage (MetaCompositor *compositor)
634+
{
635+
GError *error = NULL;
636+
637+
if (!meta_compositor_do_manage (compositor, &error))
638+
g_error ("Compositor failed to manage display: %s", error->message);
626639
}
627640

628641
void

src/compositor/meta-compositor-server.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
*/
2020

2121
#include "config.h"
22+
#include <X11/Xlib.h>
2223

2324
#include "compositor/meta-compositor-server.h"
2425

@@ -29,9 +30,11 @@ struct _MetaCompositorServer
2930

3031
G_DEFINE_TYPE (MetaCompositorServer, meta_compositor_server, META_TYPE_COMPOSITOR)
3132

32-
static void
33-
meta_compositor_server_manage (MetaCompositor *compositor)
33+
static gboolean
34+
meta_compositor_server_manage (MetaCompositor *compositor,
35+
GError **error)
3436
{
37+
return TRUE;
3538
}
3639

3740
static void

src/compositor/meta-compositor-x11.c

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,39 @@ determine_server_clock_source (MetaCompositorX11 *compositor_x11)
154154
compositor_x11->xserver_uses_monotonic_clock = FALSE;
155155
}
156156

157-
static void
158-
meta_compositor_x11_manage (MetaCompositor *compositor)
157+
static gboolean
158+
meta_compositor_x11_manage (MetaCompositor *compositor,
159+
GError **error)
159160
{
160161
MetaCompositorX11 *compositor_x11 = META_COMPOSITOR_X11 (compositor);
161162
MetaDisplay *display = meta_compositor_get_display (compositor);
162-
Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
163+
MetaX11Display *x11_display = display->x11_display;
164+
Display *xdisplay = meta_x11_display_get_xdisplay (x11_display);
165+
int composite_version;
163166
MetaBackend *backend = meta_get_backend ();
164167
Window xwindow;
165168

169+
if (!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ||
170+
!META_X11_DISPLAY_HAS_DAMAGE (x11_display))
171+
{
172+
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
173+
"Missing required extension %s",
174+
!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ?
175+
"composite" : "damage");
176+
return FALSE;
177+
}
178+
179+
composite_version = ((x11_display->composite_major_version * 10) +
180+
x11_display->composite_minor_version);
181+
if (composite_version < 3)
182+
{
183+
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
184+
"COMPOSITE extension 3.0 required (found %d.%d)",
185+
x11_display->composite_major_version,
186+
x11_display->composite_minor_version);
187+
return FALSE;
188+
}
189+
166190
determine_server_clock_source (compositor_x11);
167191

168192
meta_x11_display_set_cm_selection (display->x11_display);
@@ -204,6 +228,8 @@ meta_compositor_x11_manage (MetaCompositor *compositor)
204228
compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay);
205229

206230
meta_compositor_redirect_x11_windows (META_COMPOSITOR (compositor));
231+
232+
return TRUE;
207233
}
208234

209235
static void

src/core/display.c

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -627,39 +627,6 @@ create_compositor (MetaDisplay *display)
627627
return META_COMPOSITOR (meta_compositor_x11_new (display));
628628
}
629629

630-
static void
631-
enable_compositor (MetaDisplay *display)
632-
{
633-
MetaX11Display *x11_display = display->x11_display;
634-
635-
if (x11_display)
636-
{
637-
if (!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ||
638-
!META_X11_DISPLAY_HAS_DAMAGE (x11_display))
639-
{
640-
meta_fatal ("Missing %s extension required for compositing",
641-
!META_X11_DISPLAY_HAS_COMPOSITE (x11_display) ?
642-
"composite" : "damage");
643-
return;
644-
}
645-
646-
int version = (x11_display->composite_major_version * 10) +
647-
x11_display->composite_minor_version;
648-
if (version < 3)
649-
{
650-
meta_fatal ("Your version of COMPOSITE (%d.%d) is too old. Version 3.0 or later required.",
651-
x11_display->composite_major_version,
652-
x11_display->composite_minor_version);
653-
return;
654-
}
655-
}
656-
657-
if (!display->compositor)
658-
display->compositor = create_compositor (display);
659-
660-
meta_compositor_manage (display->compositor);
661-
}
662-
663630
static void
664631
meta_display_init (MetaDisplay *disp)
665632
{
@@ -933,6 +900,8 @@ meta_display_open (void)
933900
g_signal_connect (settings, "ui-scaling-factor-changed",
934901
G_CALLBACK (on_ui_scaling_factor_changed), display);
935902

903+
display->compositor = create_compositor (display);
904+
936905
meta_display_set_cursor (display, META_CURSOR_DEFAULT);
937906

938907
display->stack = meta_stack_new (display);
@@ -970,15 +939,18 @@ meta_display_open (void)
970939

971940
display->last_focus_time = timestamp;
972941
display->last_user_time = timestamp;
973-
display->compositor = NULL;
974942

975943
if (!meta_is_wayland_compositor ())
976944
meta_prop_get_window (display->x11_display,
977945
display->x11_display->xroot,
978946
display->x11_display->atom__NET_ACTIVE_WINDOW,
979947
&old_active_xwindow);
980948

981-
enable_compositor (display);
949+
if (!meta_compositor_do_manage (display->compositor, &error))
950+
{
951+
g_error ("Compositor failed to manage display: %s",
952+
error->message);
953+
}
982954

983955
if (display->x11_display)
984956
{

0 commit comments

Comments
 (0)