]> Dogcows Code - chaz/openbox/blobdiff - src/openbox.cc
nelements is not passed anymore, its simply a return value
[chaz/openbox] / src / openbox.cc
index 499e5a1c3eeba5c12250e0d7d9b6b9677f3045ae..60db5d83f4c5c61133cbf1212522181eb714cd89 100644 (file)
@@ -131,22 +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]);
-  
-  // run the user's script or the system defaults if that fails
-  bool pyerr = false;
-  if (!python_exec(_scriptfilepath.c_str())) {
-    pyerr = true;
-
-    // reset all the python stuff
-    _bindings->removeAllKeys();
-    _bindings->removeAllButtons();
-    _bindings->removeAllEvents();
-    
-    python_exec(SCRIPTDIR"/defaults.py"); // system default bahaviors
-  }
-
   // initialize all the screens
   _focused_screen = 0;
 
@@ -169,37 +153,79 @@ 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);
   
   _state = State_Normal; // done starting
-
-  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);
-    dia.addButton(otk::DialogButton("OK", true));
-    dia.show();
-    dia.focus();
-    dia.run();
-  }
 }
 
 
This page took 0.022453 seconds and 4 git commands to generate.