diff options
author | Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk> | 2014-01-07 16:41:39 +0100 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2014-01-07 21:41:18 -0800 |
commit | e6bbe5a90d1ea91624ebdbdb7abdc7a1bbe9829d (patch) | |
tree | 0fa6c7e91dae246e8d58fa3b8d3300aa9e439622 | |
parent | ef9c8eb2db49ff32788c1d9a4a88fd706017e045 (diff) |
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
-rw-r--r-- | desktop-shell/exposay.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c index 81da00ad..f409aa3a 100644 --- a/desktop-shell/exposay.c +++ b/desktop-shell/exposay.c @@ -187,7 +187,7 @@ exposay_layout(struct desktop_shell *shell) struct weston_compositor *compositor = shell->compositor; struct weston_output *output = get_default_output(compositor); struct weston_view *view; - struct exposay_surface *esurface; + struct exposay_surface *esurface, *highlight = NULL; int w, h; int i; int last_row_removed = 0; @@ -284,13 +284,16 @@ exposay_layout(struct desktop_shell *shell) esurface->height = view->surface->height * esurface->scale; if (shell->exposay.focus_current == esurface->view) - exposay_highlight_surface(shell, esurface); + highlight = esurface; exposay_animate_in(esurface); i++; } + if (highlight) + exposay_highlight_surface(shell, highlight); + weston_compositor_schedule_repaint(shell->compositor); return EXPOSAY_LAYOUT_ANIMATE_TO_OVERVIEW; |