move the restart into main.cc, so the openbox class can clean up properly before the restart
Dana Jansens danakj@orodu.net
3 files changed,
25 insertions(+),
23 deletions(-)
M
src/main.cc
→
src/main.cc
@@ -17,10 +17,16 @@ #ifdef HAVE_STDIO_H
# include <stdio.h> #endif // HAVE_STDIO_H +#ifdef HAVE_UNISTD_H +# include <sys/types.h> +# include <unistd.h> +#endif // HAVE_UNISTD_H + #include "gettext.h" } #include "openbox.hh" +#include "otk/util.hh" int main(int argc, char **argv) { // initialize the locale@@ -32,4 +38,16 @@ textdomain(PACKAGE);
ob::Openbox openbox(argc, argv); openbox.eventLoop(); + + if (openbox.doRestart()) { + const std::string &prog = openbox.restartProgram(); + if (!prog.empty()) { + execl("/bin/sh", "/bin/sh", "-c", prog.c_str(), NULL); + perror(prog.c_str()); + } + + // fall back in case the above execlp doesn't work + execvp(argv[0], argv); + execvp(otk::basename(argv[0]).c_str(), argv); + } }
M
src/openbox.cc
→
src/openbox.cc
@@ -35,15 +35,6 @@ #ifdef HAVE_FCNTL_H
# include <fcntl.h> #endif // HAVE_FCNTL_H -#ifdef HAVE_UNISTD_H -# include <sys/types.h> -# include <unistd.h> -#endif // HAVE_UNISTD_H - -#ifdef HAVE_SYS_SELECT_H -# include <sys/select.h> -#endif // HAVE_SYS_SELECT_H - #ifdef HAVE_SYS_WAIT_H # include <sys/wait.h> #endif // HAVE_SYS_WAIT_H@@ -197,8 +188,6 @@ Openbox::~Openbox()
{ _state = State_Exiting; // time to kill everything - int first_screen = _screens.front()->number(); - std::for_each(_screens.begin(), _screens.end(), otk::PointerAssassin()); delete _bindings;@@ -217,18 +206,6 @@ //delete _display;
otk::Timer::destroy(); otk::RenderColor::destroy(); - - if (_restart) { - if (!_restart_prog.empty()) { - otk::putenv(otk::display->screenInfo(first_screen)->displayString()); - execl("/bin/sh", "/bin/sh", "-c", _restart_prog.c_str(), NULL); - perror(_restart_prog.c_str()); - } - - // fall back in case the above execlp doesn't work - execvp(_argv[0], _argv); - execvp(otk::basename(_argv[0]).c_str(), _argv); - } }
M
src/openbox.hh
→
src/openbox.hh
@@ -228,6 +228,13 @@
inline void restart(const std::string &bin = "") { _shutdown = true; _restart = true; _restart_prog = bin; } + + //! True if Openbox should be restarted instead of exiting + inline bool doRestart() const { return _restart; } + + //! The command line requested to be executed in place of restarting + //! Openbox the way it was run previously. + inline const std::string &restartProgram() const { return _restart_prog; } }; }