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
dev
Emilio Pozuelo Monfort 11 years ago committed by Kristian Høgsberg
parent ef9c8eb2db
commit e6bbe5a90d
  1. 7
      desktop-shell/exposay.c

@ -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;

Loading…
Cancel
Save