mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-10-03 02:52:32 +00:00
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.
This commit is contained in:
parent
13bdf25270
commit
f57774e112
|
@ -961,18 +961,31 @@ get_output_height(struct weston_output *output)
|
|||
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 @@ 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);
|
||||
|
|
Loading…
Reference in a new issue