shell: Start the desktop-shell client in the idle handler
authorTiago Vignatti <tiago.vignatti@intel.com>
Tue, 25 Sep 2012 14:57:01 +0000 (17:57 +0300)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 4 Oct 2012 15:00:05 +0000 (11:00 -0400)
https://bugs.freedesktop.org/show_bug.cgi?id=55259

Signed-off-by: Tiago Vignatti <tiago.vignatti@intel.com>
src/shell.c

index e2715d6..e043004 100644 (file)
@@ -3029,7 +3029,7 @@ shell_surface_configure(struct weston_surface *es, int32_t sx, int32_t sy)
        }
 }
 
-static int launch_desktop_shell_process(struct desktop_shell *shell);
+static void launch_desktop_shell_process(void *data);
 
 static void
 desktop_shell_sigchld(struct weston_process *process, int status)
@@ -3058,9 +3058,10 @@ desktop_shell_sigchld(struct weston_process *process, int status)
        launch_desktop_shell_process(shell);
 }
 
-static int
-launch_desktop_shell_process(struct desktop_shell *shell)
+static void
+launch_desktop_shell_process(void *data)
 {
+       struct desktop_shell *shell = data;
        const char *shell_exe = LIBEXECDIR "/weston-desktop-shell";
 
        shell->child.client = weston_client_launch(shell->compositor,
@@ -3069,8 +3070,7 @@ launch_desktop_shell_process(struct desktop_shell *shell)
                                                 desktop_shell_sigchld);
 
        if (!shell->child.client)
-               return -1;
-       return 0;
+               weston_log("not able to start %s\n", shell_exe);
 }
 
 static void
@@ -3698,6 +3698,7 @@ module_init(struct weston_compositor *ec)
        struct desktop_shell *shell;
        struct workspace **pws;
        unsigned int i;
+       struct wl_event_loop *loop;
 
        shell = malloc(sizeof *shell);
        if (shell == NULL)
@@ -3775,8 +3776,9 @@ module_init(struct weston_compositor *ec)
                return -1;
 
        shell->child.deathstamp = weston_compositor_get_time();
-       if (launch_desktop_shell_process(shell) != 0)
-               return -1;
+
+       loop = wl_display_get_event_loop(ec->wl_display);
+       wl_event_loop_add_idle(loop, launch_desktop_shell_process, shell);
 
        wl_list_for_each(seat, &ec->seat_list, link)
                create_pointer_focus_listener(seat);