X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fopenbox.cc;h=951d4ab45ca82d532461a684a75a40fd2123017c;hb=1e47e17d08d72d181edc2bde598ad246055655ad;hp=89e541aa7d29e4a18a60a963f938d86466ae8320;hpb=c88451f0c1e2586a5a06babb69b060bf808c9148;p=chaz%2Fopenbox diff --git a/src/openbox.cc b/src/openbox.cc index 89e541aa..951d4ab4 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -14,6 +14,7 @@ #include "otk/util.hh" #include "otk/rendercolor.hh" #include "otk/renderstyle.hh" +#include "otk/messagedialog.hh" extern "C" { #include @@ -38,6 +39,11 @@ extern "C" { #include #include +namespace otk { +extern void initialize(); +extern void destroy(); +} + namespace ob { Openbox *openbox = (Openbox *) 0; @@ -73,8 +79,7 @@ void Openbox::signalHandler(int signal) Openbox::Openbox(int argc, char **argv) : otk::EventDispatcher(), - otk::EventHandler(), - _display() + otk::EventHandler() { struct sigaction action; @@ -82,7 +87,6 @@ Openbox::Openbox(int argc, char **argv) openbox = this; - _displayreq = (char*) 0; _argv = argv; _shutdown = false; _restart = false; @@ -91,9 +95,12 @@ Openbox::Openbox(int argc, char **argv) _focused_client = 0; _sync = false; _single = false; + _remote = false; parseCommandLine(argc, argv); + otk::initialize(); + XSynchronize(**otk::display, _sync); // set up the signal handler @@ -112,10 +119,6 @@ Openbox::Openbox(int argc, char **argv) // anything that died while we were restarting won't give us a SIGCHLD while (waitpid(-1, NULL, WNOHANG) > 0); - otk::RenderColor::initialize(); - otk::RenderStyle::initialize(); - otk::Timer::initialize(); - otk::Property::initialize(); _actions = new Actions(); _bindings = new Bindings(); @@ -129,18 +132,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; @@ -163,20 +154,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); @@ -200,14 +245,7 @@ Openbox::~Openbox() 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::RenderStyle::destroy(); - otk::RenderColor::destroy(); + otk::destroy(); } @@ -218,12 +256,7 @@ void Openbox::parseCommandLine(int argc, char **argv) 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 @@ -242,6 +275,8 @@ void Openbox::parseCommandLine(int argc, char **argv) _sync = true; } else if (arg == "-single") { _single = true; + } else if (arg == "-remote") { + _remote = true; } else if (arg == "-version") { showVersion(); ::exit(0); @@ -273,7 +308,8 @@ void Openbox::showHelp() // print program usage and command line options printf(_("Usage: %s [OPTIONS...]\n\ Options:\n\ - -display use display connection.\n\ + -remote optimize for a remote (low bandwidth) connection to the\n\ + display/Xserver.\n\ -single run on a single screen (default is to run every one).\n\ -rc use alternate resource file.\n\ -menu use alternate menu file.\n\ @@ -317,8 +353,10 @@ void Openbox::showHelp() void Openbox::eventLoop() { while (true) { - dispatchEvents(); // from otk::EventDispatcher - XFlush(**otk::display); // flush here before we go wait for timers + dispatchEvents(false); // from otk::EventDispatcher +// XFlush(**otk::display); // flush here before we go wait for timers + // .. the XPending() should have done this last + // already, it does a flush when it returns 0 // don't wait if we're to shutdown if (_shutdown) break; otk::Timer::dispatchTimers(!_sync); // wait if not in sync mode