[PATCH weston] exposay: don't crash if a view goes away

Kristian Høgsberg hoegsberg at gmail.com
Tue Feb 18 14:20:38 PST 2014


On Mon, Feb 10, 2014 at 02:23:04PM +0100, Emilio Pozuelo Monfort wrote:
> From: Emilio Pozuelo Monfort <emilio.pozuelo at 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.pozuelo at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list