On Mon, Feb 10, 2014 at 02:23:04PM +0100, Emilio Pozuelo Monfort wrote:
> From: Emilio Pozuelo Monfort <emilio.pozu...@collabora.co.uk>
> 
> When a view was destroyed while we were on exposay, we didn't
> remove it from the list of views, and so when leaving exposay
> we were trying to animate (and sometimes activate) a
> non-existent view, causing a crash.
> 
> Signed-off-by: Emilio Pozuelo Monfort <emilio.pozu...@collabora.co.uk>

Applied, thanks.

Kristian

> ---
>  desktop-shell/exposay.c | 31 +++++++++++++++++++++++++++++--
>  1 file changed, 29 insertions(+), 2 deletions(-)
> 
> diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c
> index b7e32c9..ca36358 100644
> --- a/desktop-shell/exposay.c
> +++ b/desktop-shell/exposay.c
> @@ -33,6 +33,7 @@ struct exposay_surface {
>       struct exposay_output *eoutput;
>       struct weston_surface *surface;
>       struct weston_view *view;
> +     struct wl_listener view_destroy_listener;
>       struct wl_list link;
>  
>       int x;
> @@ -57,6 +58,20 @@ static void exposay_set_state(struct desktop_shell *shell,
>  static void exposay_check_state(struct desktop_shell *shell);
>  
>  static void
> +exposay_surface_destroy(struct exposay_surface *esurface)
> +{
> +     wl_list_remove(&esurface->link);
> +     wl_list_remove(&esurface->view_destroy_listener.link);
> +
> +     if (esurface->shell->exposay.focus_current == esurface->view)
> +             esurface->shell->exposay.focus_current = NULL;
> +     if (esurface->shell->exposay.focus_prev == esurface->view)
> +             esurface->shell->exposay.focus_prev = NULL;
> +
> +     free(esurface);
> +}
> +
> +static void
>  exposay_in_flight_inc(struct desktop_shell *shell)
>  {
>       shell->exposay.in_flight++;
> @@ -110,8 +125,7 @@ exposay_animate_out_done(struct weston_view_animation 
> *animation, void *data)
>       struct exposay_surface *esurface = data;
>       struct desktop_shell *shell = esurface->shell;
>  
> -     wl_list_remove(&esurface->link);
> -     free(esurface);
> +     exposay_surface_destroy(esurface);
>  
>       exposay_in_flight_dec(shell);
>  }
> @@ -176,6 +190,16 @@ exposay_pick(struct desktop_shell *shell, int x, int y)
>       }
>  }
>  
> +static void
> +handle_view_destroy(struct wl_listener *listener, void *data)
> +{
> +     struct exposay_surface *esurface = container_of(listener,
> +                                              struct exposay_surface,
> +                                              view_destroy_listener);
> +
> +     exposay_surface_destroy(esurface);
> +}
> +
>  /* Pretty lame layout for now; just tries to make a square.  Should take
>   * aspect ratio into account really.  Also needs to be notified of surface
>   * addition and removal and adjust layout/animate accordingly. */
> @@ -267,6 +291,9 @@ exposay_layout(struct desktop_shell *shell, struct 
> shell_output *shell_output)
>               esurface->eoutput = eoutput;
>               esurface->view = view;
>  
> +             esurface->view_destroy_listener.notify = handle_view_destroy;
> +             wl_signal_add(&view->destroy_signal, 
> &esurface->view_destroy_listener);
> +
>               esurface->row = i / eoutput->grid_size;
>               esurface->column = i % eoutput->grid_size;
>  
> -- 
> 1.9.rc1
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to