diff -u blackbox-0.61.1-orig/src/BaseDisplay.cc blackbox-0.61.1/src/BaseDisplay.cc --- blackbox-0.61.1-orig/src/BaseDisplay.cc Thu Oct 5 14:05:40 2000 +++ blackbox-0.61.1/src/BaseDisplay.cc Thu May 24 12:58:47 2001 @@ -200,11 +200,34 @@ // convenience functions #ifndef __EMX__ -void bexec(const char *command, char* displaystring) { +void bshexec(const char *command, char* displaystring) { if (! fork()) { setsid(); putenv(displaystring); execl("/bin/sh", "/bin/sh", "-c", command, NULL); + exit(0); + } +} + +/* 24/May/2001 reed */ +void bexec(const char *command, char* displaystring) { + if (! fork()) { + char **newargv; + int arguments; + + setsid(); + putenv(displaystring); + + newargv[0] = strtok(command, " \t"); + arguments = 1; + newargv[1] = NULL; + while ((newargv[arguments] = strtok(NULL, " \t")) != NULL) { + arguments++; + } + newargv[arguments + 1] = NULL; +/* fprintf (stderr, "command: %s, newargv[1]: %s\n", newargv[0], newargv[1]); */ + execvp(newargv[0], newargv); + fprintf (stderr, "Could not execute: %s\n", newargv[0]); exit(0); } } diff -u blackbox-0.61.1-orig/src/BaseDisplay.hh blackbox-0.61.1/src/BaseDisplay.hh --- blackbox-0.61.1-orig/src/BaseDisplay.hh Thu Oct 5 14:05:40 2000 +++ blackbox-0.61.1/src/BaseDisplay.hh Thu May 24 12:12:29 2001 @@ -64,6 +64,7 @@ #ifndef __EMX__ void bexec(const char *, char *); +void bshexec(const char *, char *); #endif // !__EMX__ char *bstrdup(const char *); Only in blackbox-0.61.1/src: Makefile diff -u blackbox-0.61.1-orig/src/Rootmenu.cc blackbox-0.61.1/src/Rootmenu.cc --- blackbox-0.61.1-orig/src/Rootmenu.cc Mon Jun 26 15:36:15 2000 +++ blackbox-0.61.1/src/Rootmenu.cc Thu May 24 12:12:08 2001 @@ -63,6 +63,22 @@ if (item->function()) { switch (item->function()) { + case BScreen::shExecute: + if (item->exec()) { +#ifndef __EMX__ + char displaystring[MAXPATHLEN]; + sprintf(displaystring, "DISPLAY=%s", + DisplayString(screen->getBaseDisplay()->getXDisplay())); + sprintf(displaystring + strlen(displaystring) - 1, "%d", + screen->getScreenNumber()); + + bshexec(item->exec(), displaystring); +#else // __EMX__ + spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", item->exec(), NULL); +#endif // !__EMX__ + } + break; + case BScreen::Execute: if (item->exec()) { #ifndef __EMX__ diff -u blackbox-0.61.1-orig/src/Screen.cc blackbox-0.61.1/src/Screen.cc --- blackbox-0.61.1-orig/src/Screen.cc Thu Oct 5 19:01:12 2000 +++ blackbox-0.61.1/src/Screen.cc Thu May 24 12:13:00 2001 @@ -1347,7 +1347,7 @@ sprintf(displaystring + strlen(displaystring) - 1, "%d", getScreenNumber()); - bexec(value.addr, displaystring); + bshexec(value.addr, displaystring); #else // __EMX__ spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", value.addr, NULL); #endif // !__EMX__ @@ -2013,6 +2013,25 @@ } menu->insert(label, configmenu); + + break; + + /* 24/May/2001 reed - [shexec] is same as old [exec] */ + case 640: // shexec + if ((! *label) && (! *command)) { + fprintf(stderr, + i18n->getMessage( +#ifdef NLS + ScreenSet, ScreenEXECError, +#else // !NLS + 0, 0, +#endif // NLS + "BScreen::parseMenuFile: [shexec] error, " + "no menu label and/or command defined\n")); + continue; + } + + menu->insert(label, BScreen::shExecute, command); break; diff -u blackbox-0.61.1-orig/src/Screen.hh blackbox-0.61.1/src/Screen.hh --- blackbox-0.61.1-orig/src/Screen.hh Sun Jun 18 20:55:33 2000 +++ blackbox-0.61.1/src/Screen.hh Thu May 24 12:41:53 2001 @@ -325,9 +325,9 @@ RightLeft, TopBottom, BottomTop }; enum { LeftJustify = 1, RightJustify, CenterJustify }; enum { RoundBullet = 1, TriangleBullet, SquareBullet, NoBullet }; - enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, Reconfigure, - WindowShade, WindowIconify, WindowMaximize, WindowClose, WindowRaise, - WindowLower, WindowStick, WindowKill, SetStyle }; + enum { Restart = 1, RestartOther, Exit, Shutdown, Execute, shExecute, + Reconfigure, WindowShade, WindowIconify, WindowMaximize, WindowClose, + WindowRaise, WindowLower, WindowStick, WindowKill, SetStyle }; };