X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fstartupnotify.c;h=5b5723e591ecf545597273e32e64b95582a1224a;hb=939fbcfd31e07a6e0f1cdbfcef9b04f63e6af700;hp=1114d28fefa87c39fa3cda99d2ba85c3e85b11d5;hpb=19b480058e869a588ea20be5e29017ae2052e967;p=chaz%2Fopenbox diff --git a/openbox/startupnotify.c b/openbox/startupnotify.c index 1114d28f..5b5723e5 100644 --- a/openbox/startupnotify.c +++ b/openbox/startupnotify.c @@ -20,11 +20,14 @@ #include "startupnotify.h" #include "gettext.h" -extern gchar **environ; +#include #ifndef USE_LIBSN -void sn_startup(gboolean reconfig) {} +void sn_startup(gboolean reconfig) { + /* unset this so we don't pass it on unknowingly */ + if (!reconfig) unsetenv("DESKTOP_STARTUP_ID"); +} void sn_shutdown(gboolean reconfig) {} gboolean sn_app_starting() { return FALSE; } Time sn_app_started(const gchar *id, const gchar *wmclass) @@ -32,10 +35,8 @@ Time sn_app_started(const gchar *id, const gchar *wmclass) return CurrentTime; } gboolean sn_get_desktop(gchar *id, guint *desktop) { return FALSE; } -gchar **sn_get_spawn_environment(char *program, Time time) -{ - return g_strdupv(environ); -} +void sn_setup_spawn_environment(gchar *program, gchar *name, + gchar *icon_name, gint desktop, Time time) {} void sn_spawn_cancel() {} #else @@ -61,6 +62,9 @@ void sn_startup(gboolean reconfig) { if (reconfig) return; + /* unset this so we don't pass it on unknowingly */ + unsetenv("DESKTOP_STARTUP_ID"); + sn_display = sn_display_new(ob_display, NULL, NULL); sn_context = sn_monitor_context_new(sn_display, ob_screen, sn_event_func, NULL, NULL); @@ -140,6 +144,7 @@ static void sn_event_func(SnMonitorEvent *ev, gpointer data) have a timeout */ ob_main_loop_timeout_add(ob_main_loop, 30 * G_USEC_PER_SEC, sn_wait_timeout, seq, + g_direct_equal, (GDestroyNotify)sn_startup_sequence_unref); change = TRUE; break; @@ -167,14 +172,35 @@ Time sn_app_started(const gchar *id, const gchar *wmclass) GSList *it; Time t = CurrentTime; + if (!id && !wmclass) + return t; + for (it = sn_waits; it; it = g_slist_next(it)) { SnStartupSequence *seq = it->data; - const gchar *seqid, *seqclass; + gboolean found = FALSE; + const gchar *seqid, *seqclass, *seqname, *seqbin; seqid = sn_startup_sequence_get_id(seq); seqclass = sn_startup_sequence_get_wmclass(seq); - if ((seqid && id && !strcmp(seqid, id)) || - (seqclass && wmclass && !strcmp(seqclass, wmclass))) - { + seqname = sn_startup_sequence_get_name(seq); + seqbin = sn_startup_sequence_get_binary_name(seq); + + if (id && seqid) { + /* if the app has a startup id, then look for that for highest + accuracy */ + if (!strcmp(seqid, id)) + found = TRUE; + } else { + seqclass = sn_startup_sequence_get_wmclass(seq); + seqname = sn_startup_sequence_get_name(seq); + seqbin = sn_startup_sequence_get_binary_name(seq); + + if ((seqname && !g_ascii_strcasecmp(seqname, wmclass)) || + (seqbin && !g_ascii_strcasecmp(seqbin, wmclass)) || + (seqclass && !strcmp(seqclass, wmclass))) + found = TRUE; + } + + if (found) { sn_startup_sequence_complete(seq); t = sn_startup_sequence_get_timestamp(seq); break; @@ -204,10 +230,11 @@ static gboolean sn_launch_wait_timeout(gpointer data) return FALSE; /* don't repeat */ } -gchar **sn_get_spawn_environment(char *program, Time time) +void sn_setup_spawn_environment(gchar *program, gchar *name, + gchar *icon_name, gint desktop, + Time time) { - gchar **env, *desc; - guint len; + gchar *desc; const char *id; desc = g_strdup_printf(_("Running %s\n"), program); @@ -217,10 +244,12 @@ gchar **sn_get_spawn_environment(char *program, Time time) sn_launcher = sn_launcher_context_new(sn_display, ob_screen); } - sn_launcher_context_set_name(sn_launcher, program); + sn_launcher_context_set_name(sn_launcher, name ? name : program); sn_launcher_context_set_description(sn_launcher, desc); - sn_launcher_context_set_icon_name(sn_launcher, program); + sn_launcher_context_set_icon_name(sn_launcher, icon_name ? icon_name : program); sn_launcher_context_set_binary_name(sn_launcher, program); + if (desktop >= 0 && (unsigned) desktop < screen_num_desktops) + sn_launcher_context_set_workspace(sn_launcher, (signed) desktop); sn_launcher_context_initiate(sn_launcher, "openbox", program, time); id = sn_launcher_context_get_startup_id(sn_launcher); @@ -228,17 +257,12 @@ gchar **sn_get_spawn_environment(char *program, Time time) 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, + g_direct_equal, (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; + setenv("DESKTOP_STARTUP_ID", id, TRUE); g_free(desc); - - return env; } void sn_spawn_cancel()