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>
|
# include <stdio.h>
|
||||||
#endif // HAVE_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 "gettext.h"
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "openbox.hh"
|
#include "openbox.hh"
|
||||||
|
#include "otk/util.hh"
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
// initialize the locale
|
// initialize the locale
|
||||||
|
@ -32,4 +38,16 @@ int main(int argc, char **argv) {
|
||||||
|
|
||||||
ob::Openbox openbox(argc, argv);
|
ob::Openbox openbox(argc, argv);
|
||||||
openbox.eventLoop();
|
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>
|
# include <fcntl.h>
|
||||||
#endif // HAVE_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
|
#ifdef HAVE_SYS_WAIT_H
|
||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
#endif // HAVE_SYS_WAIT_H
|
#endif // HAVE_SYS_WAIT_H
|
||||||
|
@ -197,8 +188,6 @@ Openbox::~Openbox()
|
||||||
{
|
{
|
||||||
_state = State_Exiting; // time to kill everything
|
_state = State_Exiting; // time to kill everything
|
||||||
|
|
||||||
int first_screen = _screens.front()->number();
|
|
||||||
|
|
||||||
std::for_each(_screens.begin(), _screens.end(), otk::PointerAssassin());
|
std::for_each(_screens.begin(), _screens.end(), otk::PointerAssassin());
|
||||||
|
|
||||||
delete _bindings;
|
delete _bindings;
|
||||||
|
@ -217,18 +206,6 @@ Openbox::~Openbox()
|
||||||
|
|
||||||
otk::Timer::destroy();
|
otk::Timer::destroy();
|
||||||
otk::RenderColor::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 = "") {
|
inline void restart(const std::string &bin = "") {
|
||||||
_shutdown = true; _restart = true; _restart_prog = 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