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.
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index a72f739..2d6d7c2 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -961,18 +961,31 @@
return abs(output->region.extents.y1 - output->region.extents.y2);
}
+static struct weston_transform *
+view_get_transform(struct weston_view *view)
+{
+ struct focus_surface *fsurf = NULL;
+ struct shell_surface *shsurf = NULL;
+
+ if (is_focus_view(view)) {
+ 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;
+ struct weston_transform *transform = view_get_transform(view);
- 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;
- }
+ if (!transform)
+ return;
if (wl_list_empty(&transform->link))
wl_list_insert(view->geometry.transformation_list.prev,
@@ -1044,13 +1057,9 @@
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);