all repos — openbox @ e2069b5792a80ba8ccfd03c9d1bdd5e364dbee10

openbox fork - make it a bit more like ryudo

move the restart into main.cc, so the openbox class can clean up properly before the restart
Dana Jansens danakj@orodu.net
commit

e2069b5792a80ba8ccfd03c9d1bdd5e364dbee10

parent

96a949ec1f2be9da216e4d228992d1ce6855a6d4

3 files changed, 25 insertions(+), 23 deletions(-)

jump to
M src/main.ccsrc/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.ccsrc/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.hhsrc/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; } }; }