[mutter/gnome-3-36] window-actor/wayland: Cleaner subsurface reordering
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/gnome-3-36] window-actor/wayland: Cleaner subsurface reordering
- Date: Thu, 22 Apr 2021 17:04:33 +0000 (UTC)
commit ba19e69885def1c7e5740043da7034f0cf74eb45
Author: Robert Mader <robert mader posteo de>
Date: Fri Apr 16 15:15:41 2021 +0200
window-actor/wayland: Cleaner subsurface reordering
Currently when reordering subsurfaces, we un- and reparent all child
actors of the window actor. This is unnecessarily wasteful and
triggers bugs in clutter. While the underlying issue should be fixed
eventually, simply reorder the actors with the tools clutter provides
us with, avoiding those bugs and likely being faster as well.
(cherry picked from commit f7768874e5ec2a808ccec424ed9e238e3dc13987)
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1838>
src/compositor/meta-window-actor-wayland.c | 65 ++++++++++++++----------------
1 file changed, 31 insertions(+), 34 deletions(-)
---
diff --git a/src/compositor/meta-window-actor-wayland.c b/src/compositor/meta-window-actor-wayland.c
index 98f26fc6c6..cbb995b85b 100644
--- a/src/compositor/meta-window-actor-wayland.c
+++ b/src/compositor/meta-window-actor-wayland.c
@@ -32,37 +32,36 @@ struct _MetaWindowActorWayland
G_DEFINE_TYPE (MetaWindowActorWayland, meta_window_actor_wayland, META_TYPE_WINDOW_ACTOR)
-static gboolean
-remove_surface_actor_from_children (GNode *node,
- gpointer data)
+typedef struct _SurfaceTreeTraverseData
{
- MetaWaylandSurface *surface = node->data;
- MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
- MetaWindowActor *window_actor = data;
- ClutterActor *parent;
-
- parent = clutter_actor_get_parent (CLUTTER_ACTOR (surface_actor));
- if (!parent)
- return FALSE;
-
- g_return_val_if_fail (parent == CLUTTER_ACTOR (window_actor), FALSE);
-
- clutter_actor_remove_child (CLUTTER_ACTOR (window_actor),
- CLUTTER_ACTOR (surface_actor));
-
- return FALSE;
-}
+ MetaWindowActor *window_actor;
+ int index;
+} SurfaceTreeTraverseData;
static gboolean
-add_surface_actor_to_children (GNode *node,
- gpointer data)
+set_surface_actor_index (GNode *node,
+ gpointer data)
{
MetaWaylandSurface *surface = node->data;
MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
- MetaWindowActor *window_actor = data;
-
- clutter_actor_add_child (CLUTTER_ACTOR (window_actor),
- CLUTTER_ACTOR (surface_actor));
+ SurfaceTreeTraverseData *traverse_data = data;
+
+ if (clutter_actor_contains (CLUTTER_ACTOR (traverse_data->window_actor),
+ CLUTTER_ACTOR (surface_actor)))
+ {
+ clutter_actor_set_child_at_index (
+ CLUTTER_ACTOR (traverse_data->window_actor),
+ CLUTTER_ACTOR (surface_actor),
+ traverse_data->index);
+ }
+ else
+ {
+ clutter_actor_insert_child_at_index (
+ CLUTTER_ACTOR (traverse_data->window_actor),
+ CLUTTER_ACTOR (surface_actor),
+ traverse_data->index);
+ }
+ traverse_data->index++;
return FALSE;
}
@@ -75,20 +74,18 @@ meta_window_actor_wayland_rebuild_surface_tree (MetaWindowActor *actor)
MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (
META_SURFACE_ACTOR_WAYLAND (surface_actor));
GNode *root_node = surface->subsurface_branch_node;
+ SurfaceTreeTraverseData traverse_data;
+ traverse_data = (SurfaceTreeTraverseData) {
+ .window_actor = actor,
+ .index = 0,
+ };
g_node_traverse (root_node,
G_IN_ORDER,
G_TRAVERSE_LEAVES,
-1,
- remove_surface_actor_from_children,
- actor);
-
- g_node_traverse (root_node,
- G_IN_ORDER,
- G_TRAVERSE_LEAVES,
- -1,
- add_surface_actor_to_children,
- actor);
+ set_surface_actor_index,
+ &traverse_data);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]