summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>2014-01-07 16:41:39 +0100
committerKristian Høgsberg <krh@bitplanet.net>2014-01-07 21:41:18 -0800
commite6bbe5a90d1ea91624ebdbdb7abdc7a1bbe9829d (patch)
tree0fa6c7e91dae246e8d58fa3b8d3300aa9e439622
parentef9c8eb2db49ff32788c1d9a4a88fd706017e045 (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.c7
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;