From f57774e1125dc261b276e00f717146d549c483c9 Mon Sep 17 00:00:00 2001 From: Greg V Date: Tue, 24 Jul 2018 23:21:55 +0300 Subject: [PATCH] desktop-shell: extract view_get_transform, make it reliable Avoid crashes related to get_shell_surface returning NULL. Surfaces are already allowed to be neither focus nor shell in e.g. focus_state_surface_destroy. --- desktop-shell/shell.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index a72f7391..2d6d7c20 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -961,19 +961,32 @@ get_output_height(struct weston_output *output) return abs(output->region.extents.y1 - output->region.extents.y2); } -static void -view_translate(struct workspace *ws, struct weston_view *view, double d) +static struct weston_transform * +view_get_transform(struct weston_view *view) { - struct weston_transform *transform; + struct focus_surface *fsurf = NULL; + struct shell_surface *shsurf = NULL; if (is_focus_view(view)) { - struct focus_surface *fsurf = get_focus_surface(view->surface); - transform = &fsurf->workspace_transform; - } else { - struct shell_surface *shsurf = get_shell_surface(view->surface); - transform = &shsurf->workspace_transform; + fsurf = get_focus_surface(view->surface); + return &fsurf->workspace_transform; } + shsurf = get_shell_surface(view->surface); + if (shsurf) + return &shsurf->workspace_transform; + + return NULL; +} + +static void +view_translate(struct workspace *ws, struct weston_view *view, double d) +{ + struct weston_transform *transform = view_get_transform(view); + + if (!transform) + return; + if (wl_list_empty(&transform->link)) wl_list_insert(view->geometry.transformation_list.prev, &transform->link); @@ -1044,13 +1057,9 @@ workspace_deactivate_transforms(struct workspace *ws) struct weston_transform *transform; wl_list_for_each(view, &ws->layer.view_list.link, layer_link.link) { - if (is_focus_view(view)) { - struct focus_surface *fsurf = get_focus_surface(view->surface); - transform = &fsurf->workspace_transform; - } else { - struct shell_surface *shsurf = get_shell_surface(view->surface); - transform = &shsurf->workspace_transform; - } + transform = view_get_transform(view); + if (!transform) + continue; if (!wl_list_empty(&transform->link)) { wl_list_remove(&transform->link);