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
This commit is contained in:
Olivier Fourdan 2018-04-04 10:15:25 +02:00
parent 85bbd82ae8
commit 17a745bf81

View File

@ -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)
{