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