all repos — openbox @ 94d41260a065d96776335ecb8ff0b7784238b8ee

openbox fork - make it a bit more like ryudo

instead of passing things to the environment, substitute $pid and $window inline in the Execute command string
Dana Jansens danakj@orodu.net
commit

94d41260a065d96776335ecb8ff0b7784238b8ee

parent

94c60ba74e1efef25f86dbc8d000b33756de79ad

1 files changed, 65 insertions(+), 23 deletions(-)

jump to
M openbox/actions/execute.copenbox/actions/execute.c

@@ -136,6 +136,71 @@ g_message(_("Failed to convert the path \"%s\" from utf8"), o->cmd);

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 @@ /* launch it on the current desktop */

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))

@@ -188,9 +233,6 @@ sn_spawn_cancel();

} if (o->sn) unsetenv("DESKTOP_STARTUP_ID"); - - unsetenv("PID"); - unsetenv("WINDOW_ID"); g_free(program); g_strfreev(argv);