diff --git a/src/compositor/meta-window-actor-wayland.c b/src/compositor/meta-window-actor-wayland.c index 7c3be569042b70e1c55a7f59918d9666005b9dbd..b1fe61641505e201e14eb77c7da28fe3b639cbe7 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 diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c index 27bd91f0c6e063231bbd106d160d077536183c81..d7f56b66e8331dba10444ab61624389d223a7620 100644 --- a/src/wayland/meta-wayland-subsurface.c +++ b/src/wayland/meta-wayland-subsurface.c @@ -355,11 +355,11 @@ is_valid_sibling (MetaWaylandSurface *surface, } static void -subsurface_handle_pending_surface_destroyed (struct wl_listener *listener, - void *data) +subsurface_handle_pending_subsurface_destroyed (struct wl_listener *listener, + void *data) { MetaWaylandSubsurfacePlacementOp *op = - wl_container_of (listener, op, surface_destroy_listener); + wl_container_of (listener, op, subsurface_destroy_listener); op->surface = NULL; } @@ -378,7 +378,7 @@ void meta_wayland_subsurface_placement_op_free (MetaWaylandSubsurfacePlacementOp *op) { if (op->surface) - wl_list_remove (&op->surface_destroy_listener.link); + wl_list_remove (&op->subsurface_destroy_listener.link); if (op->sibling) wl_list_remove (&op->sibling_destroy_listener.link); g_free (op); @@ -396,12 +396,12 @@ queue_subsurface_placement (MetaWaylandSurface *surface, op->placement = placement; op->surface = surface; op->sibling = sibling; - op->surface_destroy_listener.notify = - subsurface_handle_pending_surface_destroyed; + op->subsurface_destroy_listener.notify = + subsurface_handle_pending_subsurface_destroyed; op->sibling_destroy_listener.notify = subsurface_handle_pending_sibling_destroyed; - wl_resource_add_destroy_listener (surface->resource, - &op->surface_destroy_listener); + wl_resource_add_destroy_listener (surface->wl_subsurface, + &op->subsurface_destroy_listener); wl_resource_add_destroy_listener (sibling->resource, &op->sibling_destroy_listener); diff --git a/src/wayland/meta-wayland-subsurface.h b/src/wayland/meta-wayland-subsurface.h index 7ea6bc5ae129d07c8a9a54446ac23018ffbaca93..45dbf86269be687a3742d121f1a58c80ae5b6dec 100644 --- a/src/wayland/meta-wayland-subsurface.h +++ b/src/wayland/meta-wayland-subsurface.h @@ -40,7 +40,7 @@ typedef struct MetaWaylandSubsurfacePlacement placement; MetaWaylandSurface *surface; MetaWaylandSurface *sibling; - struct wl_listener surface_destroy_listener; + struct wl_listener subsurface_destroy_listener; struct wl_listener sibling_destroy_listener; } MetaWaylandSubsurfacePlacementOp;