# 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
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);
+ }
}
# 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
{
_state = State_Exiting; // time to kill everything
- int first_screen = _screens.front()->number();
-
std::for_each(_screens.begin(), _screens.end(), otk::PointerAssassin());
delete _bindings;
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);
- }
}
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; }
};
}