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);