From 5efb413cbc43f66ed587dc7327b22ea5d71b34a1 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 8f86782..d9b977e 100644 --- a/src/shell.c +++ b/src/shell.c @@ -1879,6 +1879,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; @@ -2047,6 +2055,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; -- 2.7.4