shell: Do not hang when mapping a popup twice
authorGiulio Camuffo <giuliocamuffo@gmail.com>
Mon, 18 Feb 2013 21:26:01 +0000 (22:26 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Mon, 18 Feb 2013 22:39:40 +0000 (17:39 -0500)
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

index 8f86782..d9b977e 100644 (file)
@@ -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;