From: Dana Jansens Date: Sat, 1 Mar 2008 05:52:49 +0000 (-0500) Subject: instead of passing things to the environment, substitute $pid and $window inline... X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=94d41260a065d96776335ecb8ff0b7784238b8ee;p=chaz%2Fopenbox instead of passing things to the environment, substitute $pid and $window inline in the Execute command string --- diff --git a/openbox/actions/execute.c b/openbox/actions/execute.c index 69690faa..865e0972 100644 --- a/openbox/actions/execute.c +++ b/openbox/actions/execute.c @@ -136,6 +136,71 @@ static gboolean run_func(ObActionsData *data, gpointer options) return FALSE; } + if (data->client) { + gchar *c, *before, *expand; + + /* replace occurances of $pid and $window */ + + expand = NULL; + before = cmd; + + while ((c = strchr(before, '$'))) { + if ((c[1] == 'p' || c[1] == 'P') && + (c[2] == 'i' || c[2] == 'I') && + (c[3] == 'd' || c[3] == 'D') && + !g_ascii_isalnum(c[4])) + { + /* found $pid */ + gchar *tmp; + + *c = '\0'; + tmp = expand; + expand = g_strdup_printf("%s%s%u", + (expand ? expand : ""), + before, + data->client->pid); + g_free(tmp); + + before = c + 4; /* 4 = strlen("$pid") */ + } + + if ((c[1] == 'w' || c[1] == 'W') && + (c[2] == 'i' || c[2] == 'I') && + (c[3] == 'n' || c[3] == 'N') && + (c[4] == 'd' || c[4] == 'D') && + (c[5] == 'o' || c[5] == 'O') && + (c[6] == 'w' || c[6] == 'W') && + !g_ascii_isalnum(c[7])) + { + /* found $window */ + gchar *tmp; + + *c = '\0'; + tmp = expand; + expand = g_strdup_printf("%s%s%lu", + (expand ? expand : ""), + before, + data->client->window); + g_free(tmp); + + before = c + 7; /* 4 = strlen("$window") */ + } + } + + if (expand) { + gchar *tmp; + + /* add on the end of the string after the last replacement */ + tmp = expand; + expand = g_strconcat(expand, before, NULL); + g_free(tmp); + + /* replace the command with the expanded one */ + g_free(cmd); + cmd = expand; + } + } + /* If there is a keyboard grab going on then we need to cancel it so the application can grab things */ event_cancel_all_key_grabs(); @@ -156,26 +221,6 @@ static gboolean run_func(ObActionsData *data, gpointer options) screen_desktop); } - if (data->client && data->client->pid) { - gchar *pid; - - pid = g_strdup_printf("%u", data->client->pid); - setenv("PID", pid, TRUE); - g_free(pid); - } - else - unsetenv("PID"); - - if (data->client) { - gchar *wid; - - wid = g_strdup_printf("%u", data->client->window); - setenv("WINDOW_ID", wid, TRUE); - g_free(wid); - } - else - unsetenv("WINDOW_ID"); - if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, NULL, &e)) @@ -189,9 +234,6 @@ static gboolean run_func(ObActionsData *data, gpointer options) if (o->sn) unsetenv("DESKTOP_STARTUP_ID"); - unsetenv("PID"); - unsetenv("WINDOW_ID"); - g_free(program); g_strfreev(argv); }