exposay: fix infinite loop with fullscreen surfaces
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Tue, 7 Jan 2014 15:41:39 +0000 (16:41 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Wed, 8 Jan 2014 05:41:18 +0000 (21:41 -0800)
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

desktop-shell/exposay.c

index 81da00a..f409aa3 100644 (file)
@@ -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;