move the restart into main.cc, so the openbox class can clean up properly before the restart
This commit is contained in:
parent
96a949ec1f
commit
e2069b5792
3 changed files with 25 additions and 23 deletions
18
src/main.cc
18
src/main.cc
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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; }
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue