From e2069b5792a80ba8ccfd03c9d1bdd5e364dbee10 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 3 Feb 2003 00:06:46 +0000 Subject: [PATCH] move the restart into main.cc, so the openbox class can clean up properly before the restart --- src/main.cc | 18 ++++++++++++++++++ src/openbox.cc | 23 ----------------------- src/openbox.hh | 7 +++++++ 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main.cc b/src/main.cc index a422563d..e59749aa 100644 --- a/src/main.cc +++ b/src/main.cc @@ -17,10 +17,16 @@ extern "C" { # include #endif // HAVE_STDIO_H +#ifdef HAVE_UNISTD_H +# include +# include +#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 @@ int main(int argc, char **argv) { 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); + } } diff --git a/src/openbox.cc b/src/openbox.cc index bd72ea9f..0143a3eb 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -35,15 +35,6 @@ extern "C" { # include #endif // HAVE_FCNTL_H -#ifdef HAVE_UNISTD_H -# include -# include -#endif // HAVE_UNISTD_H - -#ifdef HAVE_SYS_SELECT_H -# include -#endif // HAVE_SYS_SELECT_H - #ifdef HAVE_SYS_WAIT_H # include #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 @@ Openbox::~Openbox() 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); - } } diff --git a/src/openbox.hh b/src/openbox.hh index bdd4272d..8145531f 100644 --- a/src/openbox.hh +++ b/src/openbox.hh @@ -228,6 +228,13 @@ public: 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; } }; } -- 2.39.2