From 17a745bf81c24dae9c081e93ae1593e2bb81efd6 Mon Sep 17 00:00:00 2001 From: Olivier Fourdan Date: Wed, 4 Apr 2018 10:15:25 +0200 Subject: [PATCH] wayland: update enter/leave output after effects Compositor effects change the actor size and position, which can lead to inconsistent output enter/leave notifications, leaving clients' surfaces without any output set. Update output enter/leave notifications after all compositor effects are completed so that we give clients accurate output location. Closes: https://gitlab.gnome.org/GNOME/mutter/issues/104 --- src/wayland/meta-wayland-surface.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c index 0c1d2cd54..05b99f8bb 100644 --- a/src/wayland/meta-wayland-surface.c +++ b/src/wayland/meta-wayland-surface.c @@ -54,6 +54,7 @@ #include "compositor/region-utils.h" #include "compositor/meta-shaped-texture-private.h" +#include "compositor/meta-window-actor-private.h" #include "meta-surface-actor.h" #include "meta-surface-actor-wayland.h" @@ -142,6 +143,9 @@ surface_actor_position_notify (MetaSurfaceActorWayland *surface_actor, static void window_position_changed (MetaWindow *window, MetaWaylandSurface *surface); +static void +window_actor_effects_completed (MetaWindowActor *window_actor, + MetaWaylandSurface *surface); static void role_assignment_valist_to_properties (GType role_type, @@ -1083,6 +1087,9 @@ meta_wayland_surface_set_window (MetaWaylandSurface *surface, g_signal_handlers_disconnect_by_func (surface->window, window_position_changed, surface); + g_signal_handlers_disconnect_by_func (meta_window_actor_from_window (surface->window), + window_actor_effects_completed, + surface); } surface->window = window; @@ -1099,6 +1106,10 @@ meta_wayland_surface_set_window (MetaWaylandSurface *surface, "position-changed", G_CALLBACK (window_position_changed), surface, 0); + g_signal_connect_object (meta_window_actor_from_window (window), + "effects-completed", + G_CALLBACK (window_actor_effects_completed), + surface, 0); } } @@ -1200,6 +1211,13 @@ window_position_changed (MetaWindow *window, meta_wayland_surface_update_outputs_recursively (surface); } +static void +window_actor_effects_completed (MetaWindowActor *window_actor, + MetaWaylandSurface *surface) +{ + meta_wayland_surface_update_outputs_recursively (surface); +} + void meta_wayland_surface_create_surface_actor (MetaWaylandSurface *surface) {