move the restart into main.cc, so the openbox class can clean up properly before the restart

This commit is contained in:
Dana Jansens 2003-02-03 00:06:46 +00:00
parent 96a949ec1f
commit e2069b5792
3 changed files with 25 additions and 23 deletions

View file

@ -17,10 +17,16 @@ extern "C" {
# 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 @@ 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);
}
}

View file

@ -35,15 +35,6 @@ extern "C" {
# 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 @@ 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);
}
}

View file

@ -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; }
};
}