diff options
author | Olivier Fourdan <ofourdan@redhat.com> | 2018-04-04 10:15:25 +0200 |
---|---|---|
committer | Olivier Fourdan <ofourdan@redhat.com> | 2018-04-09 10:19:26 +0200 |
commit | 17a745bf81c24dae9c081e93ae1593e2bb81efd6 (patch) | |
tree | 618e82a3acd34b5fdfd088f1d22bd8361dba5403 | |
parent | 85bbd82ae847eed0bba943c119a356d9493f7da2 (diff) | |
download | mutter-17a745bf81c24dae9c081e93ae1593e2bb81efd6.tar.gz |
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
-rw-r--r-- | src/wayland/meta-wayland-surface.c | 18 |
1 files changed, 18 insertions, 0 deletions
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) { |