[PATCH weston] exposay: don't crash if a view goes away
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
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
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
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