xdg-shell: Don't early out of role commit before calling parent impl

Make sure to always call the parent role commit vfunc, so that they can
handle updating their state properly.

This means other places need to handle the situation where
surface->window is NULL on commit. This may for example happen when the
parent of a modal dialog is unmapped or NULL is attached to a
wl_shell_surface.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
This commit is contained in:
Jonas Ådahl 2016-07-15 17:44:21 +08:00
parent ef3e036b45
commit dc03b3aa47
2 changed files with 15 additions and 7 deletions

View File

@ -1997,10 +1997,13 @@ actor_surface_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
queue_surface_actor_frame_callbacks (surface, pending);
if (!surface->window)
return;
meta_surface_actor_wayland_sync_state (
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor));
queue_surface_actor_frame_callbacks (surface, pending);
}
static void
@ -2026,7 +2029,7 @@ shell_surface_role_surface_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaWaylandSurfaceRoleClass *surface_role_class;
MetaWindow *window = surface->window;
MetaWindow *window;
MetaWaylandBuffer *buffer;
CoglTexture *texture;
MetaSurfaceActorWayland *actor;
@ -2040,9 +2043,14 @@ shell_surface_role_surface_commit (MetaWaylandSurfaceRole *surface_role,
if (!buffer)
return;
window = surface->window;
if (!window)
return;
actor = META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
scale = meta_surface_actor_wayland_get_scale (actor);
texture = buffer->texture;
window->buffer_rect.width = cogl_texture_get_width (texture) * scale;
window->buffer_rect.height = cogl_texture_get_height (texture) * scale;
}

View File

@ -751,14 +751,14 @@ xdg_popup_role_commit (MetaWaylandSurfaceRole *surface_role,
if (xdg_popup->setup.parent_surface)
finish_popup_setup (xdg_popup);
/* If the window disappeared the surface is not coming back. */
if (!surface->window)
return;
surface_role_class =
META_WAYLAND_SURFACE_ROLE_CLASS (meta_wayland_xdg_popup_parent_class);
surface_role_class->commit (surface_role, pending);
/* If the window disappeared the surface is not coming back. */
if (!surface->window)
return;
if (!pending->newly_attached)
return;