From 8aa16174e299be2db28a3a37236cd4018b823a29 Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Mon, 18 Feb 2013 22:26:01 +0100 Subject: [PATCH] shell: Do not hang when mapping a popup twice When calling shell_map_popup() more than one time on the same shell_surface the parent transform was getting added more than one time to the transform list, resulting in an infinite loop when going through the list with wl_list_for_each in weston_surface_update_transform_enable(). This commit removes the old transform before adding it again. --- src/shell.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/shell.c b/src/shell.c index ea4daa89..af802a57 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1900,6 +1900,14 @@ shell_map_popup(struct shell_surface *shsurf) struct weston_surface *es = shsurf->surface; struct weston_surface *parent = shsurf->parent; + /* Remove the old transform. We don't want to add it twice + * otherwise Weston will go into an infinite loop when going + * through the transforms. */ + if (!wl_list_empty(&shsurf->popup.parent_transform.link)) { + wl_list_remove(&shsurf->popup.parent_transform.link); + wl_list_init(&shsurf->popup.parent_transform.link); + } + es->output = parent->output; shsurf->popup.grab.interface = &popup_grab_interface; @@ -2070,6 +2078,7 @@ create_shell_surface(void *shell, struct weston_surface *surface, weston_matrix_init(&shsurf->rotation.rotation); wl_list_init(&shsurf->workspace_transform.link); + wl_list_init(&shsurf->popup.parent_transform.link); shsurf->type = SHELL_SURFACE_NONE; shsurf->next_type = SHELL_SURFACE_NONE;