exposay: fix infinite loop with fullscreen surfaces
We were calling exposay_highlight_surface() inside a wl_list_for_each loop for a layer, but exposay_highlight_surface() calls activate() which calls shell_surface_update_layer(), which removes the surface from its layer and reinserts it, causing an infinite loop. Call exposay_highlight_surface() outside the for_each to avoid this. https://bugs.freedesktop.org/show_bug.cgi?id=72404
This commit is contained in:
committed by
Kristian Høgsberg
parent
ef9c8eb2db
commit
e6bbe5a90d
@@ -187,7 +187,7 @@ exposay_layout(struct desktop_shell *shell)
|
|||||||
struct weston_compositor *compositor = shell->compositor;
|
struct weston_compositor *compositor = shell->compositor;
|
||||||
struct weston_output *output = get_default_output(compositor);
|
struct weston_output *output = get_default_output(compositor);
|
||||||
struct weston_view *view;
|
struct weston_view *view;
|
||||||
struct exposay_surface *esurface;
|
struct exposay_surface *esurface, *highlight = NULL;
|
||||||
int w, h;
|
int w, h;
|
||||||
int i;
|
int i;
|
||||||
int last_row_removed = 0;
|
int last_row_removed = 0;
|
||||||
@@ -284,13 +284,16 @@ exposay_layout(struct desktop_shell *shell)
|
|||||||
esurface->height = view->surface->height * esurface->scale;
|
esurface->height = view->surface->height * esurface->scale;
|
||||||
|
|
||||||
if (shell->exposay.focus_current == esurface->view)
|
if (shell->exposay.focus_current == esurface->view)
|
||||||
exposay_highlight_surface(shell, esurface);
|
highlight = esurface;
|
||||||
|
|
||||||
exposay_animate_in(esurface);
|
exposay_animate_in(esurface);
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (highlight)
|
||||||
|
exposay_highlight_surface(shell, highlight);
|
||||||
|
|
||||||
weston_compositor_schedule_repaint(shell->compositor);
|
weston_compositor_schedule_repaint(shell->compositor);
|
||||||
|
|
||||||
return EXPOSAY_LAYOUT_ANIMATE_TO_OVERVIEW;
|
return EXPOSAY_LAYOUT_ANIMATE_TO_OVERVIEW;
|
||||||
|
|||||||
Reference in New Issue
Block a user