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

2014-02-10 Thread Emilio Pozuelo Monfort
From: Emilio Pozuelo Monfort 

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


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

2014-02-10 Thread Daniel Stone
Hi,

On 10 February 2014 13:23, Emilio Pozuelo Monfort  wrote:
> 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.

This should trigger re-layout as well - as should new windows.

Cheers,
Daniel
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel


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

2014-02-18 Thread Kristian Høgsberg
On Mon, Feb 10, 2014 at 02:23:04PM +0100, Emilio Pozuelo Monfort wrote:
> From: Emilio Pozuelo Monfort 
> 
> 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 

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


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

2014-02-19 Thread Emilio Pozuelo Monfort
On 10/02/14 21:17, Daniel Stone wrote:
> Hi,
> 
> On 10 February 2014 13:23, Emilio Pozuelo Monfort  wrote:
>> 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.
> 
> This should trigger re-layout as well - as should new windows.

Certainly. I have opened https://bugs.freedesktop.org/show_bug.cgi?id=75186 to
not forget about it.

Emilio
___
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel