X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fstartupnotify.c;h=e249002b106bd4299b1eb60227b7e0de54331e39;hb=HEAD;hp=954b9d4ab1193bc92c9ccc7a7766f00bf1073653;hpb=c5d2a9bc98fb7d1ed85c69fc3007ab36b9fd96d5;p=chaz%2Fopenbox diff --git a/openbox/startupnotify.c b/openbox/startupnotify.c index 954b9d4a..e249002b 100644 --- a/openbox/startupnotify.c +++ b/openbox/startupnotify.c @@ -2,7 +2,7 @@ startupnotify.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003 Ben Jansens + Copyright (c) 2003-2007 Dana Jansens This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,30 +19,31 @@ #include "startupnotify.h" #include "gettext.h" +#include "event.h" +#include "obt/xqueue.h" -extern gchar **environ; +#ifdef HAVE_STDLIB_H +# include +#endif #ifndef USE_LIBSN void sn_startup(gboolean reconfig) {} void sn_shutdown(gboolean reconfig) {} gboolean sn_app_starting() { return FALSE; } -Time sn_app_started(const gchar *id, const gchar *wmclass) +Time sn_app_started(const gchar *id, const gchar *wmclass, const gchar *name) { return CurrentTime; } gboolean sn_get_desktop(gchar *id, guint *desktop) { return FALSE; } -gchar **sn_get_spawn_environment(char *program, char *name, - char *icon_name, Time time) -{ - return g_strdupv(environ); -} +void sn_setup_spawn_environment(const gchar *program, const gchar *name, + const gchar *icon_name, const gchar *wmclass, + gint desktop) {} void sn_spawn_cancel() {} #else #include "openbox.h" -#include "mainloop.h" #include "screen.h" #define SN_API_NOT_YET_FROZEN @@ -62,12 +63,12 @@ void sn_startup(gboolean reconfig) { if (reconfig) return; - sn_display = sn_display_new(ob_display, NULL, NULL); + sn_display = sn_display_new(obt_display, NULL, NULL); sn_context = sn_monitor_context_new(sn_display, ob_screen, sn_event_func, NULL, NULL); sn_launcher = sn_launcher_context_new(sn_display, ob_screen); - ob_main_loop_x_add(ob_main_loop, sn_handler, NULL, NULL); + xqueue_add_callback(sn_handler, NULL); } void sn_shutdown(gboolean reconfig) @@ -76,7 +77,7 @@ void sn_shutdown(gboolean reconfig) if (reconfig) return; - ob_main_loop_x_remove(ob_main_loop, sn_handler); + xqueue_remove_callback(sn_handler, NULL); for (it = sn_waits; it; it = g_slist_next(it)) sn_startup_sequence_unref((SnStartupSequence*)it->data); @@ -105,7 +106,7 @@ static SnStartupSequence* sequence_find(const gchar *id) return ret; } -gboolean sn_app_starting() +gboolean sn_app_starting(void) { return sn_waits != NULL; } @@ -137,11 +138,11 @@ static void sn_event_func(SnMonitorEvent *ev, gpointer data) case SN_MONITOR_EVENT_INITIATED: sn_startup_sequence_ref(seq); sn_waits = g_slist_prepend(sn_waits, seq); - /* 30 second timeout for apps to start if the launcher doesn't + /* 20 second timeout for apps to start if the launcher doesn't have a timeout */ - ob_main_loop_timeout_add(ob_main_loop, 30 * G_USEC_PER_SEC, - sn_wait_timeout, seq, - (GDestroyNotify)sn_startup_sequence_unref); + g_timeout_add_full(G_PRIORITY_DEFAULT, + 20 * 1000, sn_wait_timeout, seq, + (GDestroyNotify)sn_startup_sequence_unref); change = TRUE; break; case SN_MONITOR_EVENT_CHANGED: @@ -152,8 +153,7 @@ static void sn_event_func(SnMonitorEvent *ev, gpointer data) case SN_MONITOR_EVENT_CANCELED: if ((seq = sequence_find(sn_startup_sequence_get_id(seq)))) { sn_waits = g_slist_remove(sn_waits, seq); - ob_main_loop_timeout_remove_data(ob_main_loop, sn_wait_timeout, - seq, FALSE); + g_source_remove_by_user_data(seq); change = TRUE; } break; @@ -163,7 +163,7 @@ static void sn_event_func(SnMonitorEvent *ev, gpointer data) screen_set_root_cursor(); } -Time sn_app_started(const gchar *id, const gchar *wmclass) +Time sn_app_started(const gchar *id, const gchar *wmclass, const gchar *name) { GSList *it; Time t = CurrentTime; @@ -174,10 +174,9 @@ Time sn_app_started(const gchar *id, const gchar *wmclass) for (it = sn_waits; it; it = g_slist_next(it)) { SnStartupSequence *seq = it->data; gboolean found = FALSE; - const gchar *seqid, *seqclass, *seqname, *seqbin; + const gchar *seqid, *seqclass, *seqbin; seqid = sn_startup_sequence_get_id(seq); seqclass = sn_startup_sequence_get_wmclass(seq); - seqname = sn_startup_sequence_get_name(seq); seqbin = sn_startup_sequence_get_binary_name(seq); if (id && seqid) { @@ -185,15 +184,21 @@ Time sn_app_started(const gchar *id, const gchar *wmclass) 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; + } + else if (seqclass) { + /* seqclass = "a string to match against the "resource name" or + "resource class" hints. These are WM_CLASS[0] and WM_CLASS[1]" + - from the startup-notification spec + */ + found = (seqclass && !strcmp(seqclass, wmclass)) || + (seqclass && !strcmp(seqclass, name)); + } + else if (seqbin) { + /* Check the binary name against the class and name hints + as well, to help apps that don't have the class set + correctly */ + found = (seqbin && !g_ascii_strcasecmp(seqbin, wmclass)) || + (seqbin && !g_ascii_strcasecmp(seqbin, name)); } if (found) { @@ -226,14 +231,14 @@ static gboolean sn_launch_wait_timeout(gpointer data) return FALSE; /* don't repeat */ } -gchar **sn_get_spawn_environment(char *program, char *name, - char *icon_name, Time time) +void sn_setup_spawn_environment(const gchar *program, const gchar *name, + const gchar *icon_name, const gchar *wmclass, + gint desktop) { - gchar **env, *desc; - guint len; + gchar *desc; const char *id; - desc = g_strdup_printf(_("Running %s\n"), program); + desc = g_strdup_printf(_("Running %s"), program); if (sn_launcher_context_get_initiated(sn_launcher)) { sn_launcher_context_unref(sn_launcher); @@ -242,29 +247,28 @@ gchar **sn_get_spawn_environment(char *program, char *name, 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, icon_name ? icon_name : program); + sn_launcher_context_set_icon_name(sn_launcher, icon_name ? + icon_name : program); sn_launcher_context_set_binary_name(sn_launcher, program); - sn_launcher_context_initiate(sn_launcher, "openbox", program, time); + if (wmclass) sn_launcher_context_set_wmclass(sn_launcher, wmclass); + 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, + event_time()); id = sn_launcher_context_get_startup_id(sn_launcher); - /* 30 second timeout for apps to start */ + /* 20 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); + g_timeout_add_full(G_PRIORITY_DEFAULT, + 20 * 1000, 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_setenv("DESKTOP_STARTUP_ID", id, TRUE); g_free(desc); - - return env; } -void sn_spawn_cancel() +void sn_spawn_cancel(void) { sn_launcher_context_complete(sn_launcher); }