summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-02-03 00:06:46 +0000
committerDana Jansens <danakj@orodu.net>2003-02-03 00:06:46 +0000
commite2069b5792a80ba8ccfd03c9d1bdd5e364dbee10 (patch)
treeb706764c5e96de7057c2ec9a30657862564aec0f
parent96a949ec1f2be9da216e4d228992d1ce6855a6d4 (diff)
move the restart into main.cc, so the openbox class can clean up properly before the restart
-rw-r--r--src/main.cc18
-rw-r--r--src/openbox.cc23
-rw-r--r--src/openbox.hh7
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 <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);
+ }
}
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 <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);
- }
}
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; }
};
}