// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
-#ifdef HAVE_CONFIG_H
-# include "../config.h"
-#endif
+#include "config.h"
#include "openbox.hh"
#include "client.hh"
#include "otk/property.hh"
#include "otk/util.hh"
#include "otk/rendercolor.hh"
+#include "otk/renderstyle.hh"
+#include "otk/messagedialog.hh"
extern "C" {
#include <X11/cursorfont.h>
-#ifdef HAVE_STDIO_H
-# include <stdio.h>
-#endif // HAVE_STDIO_H
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif // HAVE_STDLIB_H
-
#ifdef HAVE_SIGNAL_H
# include <signal.h>
#endif // HAVE_SIGNAL_H
}
#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+
+namespace otk {
+extern void initialize();
+extern void destroy();
+}
namespace ob {
Openbox::Openbox(int argc, char **argv)
: otk::EventDispatcher(),
- otk::EventHandler(),
- _display()
+ otk::EventHandler()
{
struct sigaction action;
openbox = this;
- _displayreq = (char*) 0;
_argv = argv;
_shutdown = false;
_restart = false;
parseCommandLine(argc, argv);
+ otk::initialize();
+
XSynchronize(**otk::display, _sync);
// set up the signal handler
// anything that died while we were restarting won't give us a SIGCHLD
while (waitpid(-1, NULL, WNOHANG) > 0);
- otk::RenderColor::initialize();
- otk::Timer::initialize();
- otk::Property::initialize();
_actions = new Actions();
_bindings = new Bindings();
_cursors.ul_angle = XCreateFontCursor(**otk::display, XC_ul_angle);
_cursors.ur_angle = XCreateFontCursor(**otk::display, XC_ur_angle);
- // initialize scripting
- python_init(argv[0]);
-
- // load config values
- //python_exec(SCRIPTDIR"/config.py"); // load openbox config values
- // run all of the python scripts
- //python_exec(SCRIPTDIR"/builtins.py"); // builtin callbacks
- //python_exec(SCRIPTDIR"/focus.py"); // focus helpers
- // run the user's script or the system defaults if that fails
- if (!python_exec(_scriptfilepath.c_str()))
- python_exec(SCRIPTDIR"/defaults.py"); // system default bahaviors
-
// initialize all the screens
_focused_screen = 0;
}
}
- assert(_focused_screen);
-
if (_screens.empty()) {
printf(_("No screens were found without a window manager. Exiting.\n"));
::exit(1);
}
+ assert(_focused_screen);
+
ScreenList::iterator it, end = _screens.end();
+
+ // run the user's script or the system defaults if that fails
+ bool pyerr, doretry;
+ do {
+ // initialize scripting
+ python_init(argv[0]);
+
+ // load all of the screens' configs here so we have a theme set if
+ // we decide to show the dialog below
+ for (it = _screens.begin(); it != end; ++it)
+ (*it)->config().load(); // load the defaults from config.py
+
+ pyerr = doretry = false;
+
+ // reset all the python stuff
+ _bindings->removeAllKeys();
+ _bindings->removeAllButtons();
+ _bindings->removeAllEvents();
+
+ int ret = python_exec(_scriptfilepath.c_str());
+ if (ret == 2)
+ pyerr = true;
+
+ if (ret) {
+ // reset all the python stuff
+ _bindings->removeAllKeys();
+ _bindings->removeAllButtons();
+ _bindings->removeAllEvents();
+
+ if (python_exec(SCRIPTDIR"/defaults.py")) // system default bahaviors
+ pyerr = true;
+ }
+
+ if (pyerr) {
+ std::string msg;
+ msg += _("An error occured while executing the python scripts.");
+ msg += "\n\n";
+ msg += _("See the exact error message in Openbox's output for details.");
+ otk::MessageDialog dia(this, _("Python Error"), msg);
+ otk::DialogButton ok(_("Okay"), true);
+ otk::DialogButton retry(_("Retry"));
+ dia.addButton(ok);
+ dia.addButton(retry);
+ dia.show();
+ dia.focus();
+ const otk::DialogButton &res = dia.run();
+ if (res == retry) {
+ doretry = true;
+ python_destroy(); // kill all the python modules so they reinit right
+ }
+ }
+ } while (pyerr && doretry);
+
for (it = _screens.begin(); it != end; ++it) {
+ (*it)->config().load(); // load the config as the scripts may change it
(*it)->manageExisting();
}
-
+
// grab any keys set up before the screens existed
- _bindings->grabKeys(true);
+ //_bindings->grabKeys(true);
// set up input focus
setFocusedClient(0);
CurrentTime);
XSync(**otk::display, false);
- // this tends to block.. i honestly am not sure why. causing an x error in
- // the shutdown process unblocks it. blackbox simply did a ::exit(0), so
- // all im gunna do is the same.
- //delete _display;
-
- otk::Timer::destroy();
- otk::RenderColor::destroy();
+ otk::destroy();
}
for (int i = 1; i < argc; ++i) {
std::string arg(argv[i]);
- if (arg == "-display") {
- if (++i >= argc)
- err = true;
- else
- _displayreq = argv[i];
- } else if (arg == "-rc") {
+ if (arg == "-rc") {
if (++i >= argc)
err = true;
else
// sometimes this is called with the already-focused window, this is
// important for the python scripts to work (eg, c = 0 twice). don't just
// return if _focused_client == c
-
+
assert(_focused_screen);
// uninstall the old colormap