]> Dogcows Code - chaz/openbox/blobdiff - src/openbox.cc
nelements is not passed anymore, its simply a return value
[chaz/openbox] / src / openbox.cc
index d068880baf08e8c1a6d66c2dc3adc5fea180419b..60db5d83f4c5c61133cbf1212522181eb714cd89 100644 (file)
@@ -14,6 +14,7 @@
 #include "otk/util.hh"
 #include "otk/rendercolor.hh"
 #include "otk/renderstyle.hh"
+#include "otk/messagedialog.hh"
 
 extern "C" {
 #include <X11/cursorfont.h>
@@ -130,18 +131,6 @@ Openbox::Openbox(int argc, char **argv)
   _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;
 
@@ -164,20 +153,74 @@ Openbox::Openbox(int argc, char **argv)
     }
   }
 
-  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);
This page took 0.023352 seconds and 4 git commands to generate.