+static gboolean sn_launch_wait_timeout(gpointer data)
+{
+ SnLauncherContext *sn = data;
+ sn_launcher_context_complete(sn);
+ return FALSE; /* don't repeat */
+}
+
+gchar **sn_get_spawn_environment(char *program, Time time)
+{
+ gchar **env, *desc;
+ guint len;
+ const char *id;
+
+ desc = g_strdup_printf(_("Running %s\n"), program);
+
+ if (sn_launcher_context_get_initiated(sn_launcher)) {
+ sn_launcher_context_unref(sn_launcher);
+ sn_launcher = sn_launcher_context_new(sn_display, ob_screen);
+ }
+
+ sn_launcher_context_set_name(sn_launcher, program);
+ sn_launcher_context_set_description(sn_launcher, desc);
+ sn_launcher_context_set_icon_name(sn_launcher, program);
+ sn_launcher_context_set_binary_name(sn_launcher, program);
+ sn_launcher_context_initiate(sn_launcher, "openbox", program, time);
+ id = sn_launcher_context_get_startup_id(sn_launcher);
+
+ /* 30 second timeout for apps to start */
+ sn_launcher_context_ref(sn_launcher);
+ ob_main_loop_timeout_add(ob_main_loop, 30 * G_USEC_PER_SEC,
+ sn_launch_wait_timeout, sn_launcher,
+ (GDestroyNotify)sn_launcher_context_unref);
+
+ env = g_strdupv(environ);
+ len = g_strv_length(env); /* includes last null */
+ env = g_renew(gchar*, env, ++len); /* add one spot */
+ env[len-2] = g_strdup_printf("DESKTOP_STARTUP_ID=%s", id);
+ env[len-1] = NULL;
+
+ g_free(desc);
+
+ return env;
+}
+
+void sn_spawn_cancel()
+{
+ sn_launcher_context_complete(sn_launcher);
+}
+