From 7e2a0ede16bed5671fe55d3d81ccc9f82eebd94b Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Tue, 16 Apr 2019 23:35:28 +0200 Subject: [PATCH] wayland: Move check for present window out of the actor-surface class All child classes of `MetaWaylandShellSurface` as well as `MetaWaylandSurfaceRoleXWayland` should only sync their actor if their toplevel surface has a window. Currently this check is done in the actor-surface class, but not all surface classes have a toplevel window, e.g. dnd-surfaces. Move the check to the right places. For subsurfaces this assumes that the subsurface is not the child of a window-less surface (like, as stated above, e.g. a dnd-surface). If we want to support subsurfaces of window-less surfaces in the future we have to extend the check here. But as this is not a regression, ignore this case for now. https://gitlab.gnome.org/GNOME/mutter/merge_requests/537 --- src/wayland/meta-wayland-actor-surface.c | 7 ------- src/wayland/meta-wayland-shell-surface.c | 20 ++++++++++++++++++++ src/wayland/meta-wayland-subsurface.c | 5 ++++- src/wayland/meta-xwayland.c | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/wayland/meta-wayland-actor-surface.c b/src/wayland/meta-wayland-actor-surface.c index 2471de0a9..bd987e970 100644 --- a/src/wayland/meta-wayland-actor-surface.c +++ b/src/wayland/meta-wayland-actor-surface.c @@ -253,16 +253,9 @@ meta_wayland_actor_surface_commit (MetaWaylandSurfaceRole *surface_role, { MetaWaylandActorSurface *actor_surface = META_WAYLAND_ACTOR_SURFACE (surface_role); - MetaWaylandSurface *surface = - meta_wayland_surface_role_get_surface (surface_role); - MetaWaylandSurface *toplevel_surface; meta_wayland_actor_surface_queue_frame_callbacks (actor_surface, pending); - toplevel_surface = meta_wayland_surface_get_toplevel (surface); - if (!toplevel_surface || !toplevel_surface->window) - return; - meta_wayland_actor_surface_sync_actor_state (actor_surface); } diff --git a/src/wayland/meta-wayland-shell-surface.c b/src/wayland/meta-wayland-shell-surface.c index 04f2aaeea..f8354ab7c 100644 --- a/src/wayland/meta-wayland-shell-surface.c +++ b/src/wayland/meta-wayland-shell-surface.c @@ -175,6 +175,22 @@ meta_wayland_shell_surface_surface_commit (MetaWaylandSurfaceRole *surface_role window->buffer_rect.height = cogl_texture_get_height (texture) * scale; } +static void +meta_wayland_shell_surface_sync_actor_state (MetaWaylandActorSurface *actor_surface) +{ + MetaWaylandSurfaceRole *surface_role = + META_WAYLAND_SURFACE_ROLE (actor_surface); + MetaWaylandSurface *surface = + meta_wayland_surface_role_get_surface (surface_role); + MetaWaylandActorSurfaceClass *actor_surface_class = + META_WAYLAND_ACTOR_SURFACE_CLASS (meta_wayland_shell_surface_parent_class); + MetaWaylandSurface *toplevel_surface; + + toplevel_surface = meta_wayland_surface_get_toplevel (surface); + if (toplevel_surface && toplevel_surface->window) + actor_surface_class->sync_actor_state (actor_surface); +} + static void meta_wayland_shell_surface_init (MetaWaylandShellSurface *role) { @@ -185,6 +201,10 @@ meta_wayland_shell_surface_class_init (MetaWaylandShellSurfaceClass *klass) { MetaWaylandSurfaceRoleClass *surface_role_class = META_WAYLAND_SURFACE_ROLE_CLASS (klass); + MetaWaylandActorSurfaceClass *actor_surface_class = + META_WAYLAND_ACTOR_SURFACE_CLASS (klass); surface_role_class->commit = meta_wayland_shell_surface_surface_commit; + actor_surface_class->sync_actor_state = + meta_wayland_shell_surface_sync_actor_state; } diff --git a/src/wayland/meta-wayland-subsurface.c b/src/wayland/meta-wayland-subsurface.c index e0fa0a48b..bde7bef6e 100644 --- a/src/wayland/meta-wayland-subsurface.c +++ b/src/wayland/meta-wayland-subsurface.c @@ -199,8 +199,11 @@ meta_wayland_subsurface_sync_actor_state (MetaWaylandActorSurface *actor_surface meta_wayland_surface_role_get_surface (surface_role); MetaWaylandActorSurfaceClass *actor_surface_class = META_WAYLAND_ACTOR_SURFACE_CLASS (meta_wayland_subsurface_parent_class); + MetaWaylandSurface *toplevel_surface; - actor_surface_class->sync_actor_state (actor_surface); + toplevel_surface = meta_wayland_surface_get_toplevel (surface); + if (toplevel_surface && toplevel_surface->window) + actor_surface_class->sync_actor_state (actor_surface); sync_actor_subsurface_state (surface); } diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c index 90fdd222b..4233dc809 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -647,6 +647,20 @@ xwayland_surface_get_toplevel (MetaWaylandSurfaceRole *surface_role) return meta_wayland_surface_role_get_surface (surface_role); } +static void +xwayland_surface_sync_actor_state (MetaWaylandActorSurface *actor_surface) +{ + MetaWaylandSurfaceRole *surface_role = + META_WAYLAND_SURFACE_ROLE (actor_surface); + MetaWaylandSurface *surface = + meta_wayland_surface_role_get_surface (surface_role); + MetaWaylandActorSurfaceClass *actor_surface_class = + META_WAYLAND_ACTOR_SURFACE_CLASS (meta_wayland_surface_role_xwayland_parent_class); + + if (surface->window) + actor_surface_class->sync_actor_state (actor_surface); +} + static void meta_wayland_surface_role_xwayland_init (MetaWaylandSurfaceRoleXWayland *role) { @@ -657,11 +671,15 @@ meta_wayland_surface_role_xwayland_class_init (MetaWaylandSurfaceRoleXWaylandCla { MetaWaylandSurfaceRoleClass *surface_role_class = META_WAYLAND_SURFACE_ROLE_CLASS (klass); + MetaWaylandActorSurfaceClass *actor_surface_class = + META_WAYLAND_ACTOR_SURFACE_CLASS (klass); surface_role_class->assigned = xwayland_surface_assigned; surface_role_class->commit = xwayland_surface_commit; surface_role_class->get_toplevel = xwayland_surface_get_toplevel; + actor_surface_class->sync_actor_state = xwayland_surface_sync_actor_state; + xwayland_surface_signals[XWAYLAND_SURFACE_WINDOW_ASSOCIATED] = g_signal_new ("window-associated", G_TYPE_FROM_CLASS (klass),