X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fopenbox.cc;h=d2ce85fd2b990697e9e37637b60e5241e621fdba;hb=216a04bdd057c03a719a0908cd003503b4f73fdb;hp=727b403ebbe8c543bf55ef36f1c0b8b9c171e6f3;hpb=05a8e51f177b1d0215bcd8c4b6f7b65e7ba7d3ed;p=chaz%2Fopenbox diff --git a/src/openbox.cc b/src/openbox.cc index 727b403e..d2ce85fd 100644 --- a/src/openbox.cc +++ b/src/openbox.cc @@ -1,8 +1,6 @@ // -*- 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" @@ -15,18 +13,12 @@ #include "otk/property.hh" #include "otk/util.hh" #include "otk/rendercolor.hh" +#include "otk/renderstyle.hh" +#include "otk/messagedialog.hh" extern "C" { #include -#ifdef HAVE_STDIO_H -# include -#endif // HAVE_STDIO_H - -#ifdef HAVE_STDLIB_H -# include -#endif // HAVE_STDLIB_H - #ifdef HAVE_SIGNAL_H # include #endif // HAVE_SIGNAL_H @@ -44,6 +36,13 @@ extern "C" { } #include +#include +#include + +namespace otk { +extern void initialize(); +extern void destroy(); +} namespace ob { @@ -80,8 +79,7 @@ void Openbox::signalHandler(int signal) Openbox::Openbox(int argc, char **argv) : otk::EventDispatcher(), - otk::EventHandler(), - _display() + otk::EventHandler() { struct sigaction action; @@ -89,7 +87,6 @@ Openbox::Openbox(int argc, char **argv) openbox = this; - _displayreq = (char*) 0; _argv = argv; _shutdown = false; _restart = false; @@ -98,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 @@ -119,9 +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::Timer::initialize(); - otk::Property::initialize(); _actions = new Actions(); _bindings = new Bindings(); @@ -135,20 +132,9 @@ 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; + _managed_count = 0; for (int i = 0, max = ScreenCount(**otk::display); i < max; ++i) { Screen *screen; @@ -163,26 +149,55 @@ Openbox::Openbox(int argc, char **argv) _screens.push_back(screen); if (!_focused_screen) // set this to the first screen managed _focused_screen = screen; + _managed_count++; } else { delete screen; _screens.push_back(0); } } - assert(_focused_screen); - - if (_screens.empty()) { + if (!_managed_count) { printf(_("No screens were found without a window manager. Exiting.\n")); ::exit(1); } - ScreenList::iterator it, end = _screens.end(); - for (it = _screens.begin(); it != end; ++it) { - (*it)->manageExisting(); + assert(_focused_screen); + + // initialize scripting + python_init(argv[0]); + + // load the theme XXX TEMP SHIT + otk::RenderStyle::setStyle(0, ""); + + int ret = python_exec(_scriptfilepath.c_str()); + if (ret == 2) { + 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(_("Restart")); + dia.addButton(ok); + dia.addButton(retry); + dia.show(); + dia.focus(); + const otk::DialogButton &res = dia.run(); + if (res == retry) { + _restart = _shutdown = true; + return; + } } - + + if (ret) + python_exec(SCRIPTDIR"/defaults.py"); // system default bahaviors + + ScreenList::iterator it, end = _screens.end(); + for (it = _screens.begin(); it != end; ++it) + if (*it) (*it)->manageExisting(); + // grab any keys set up before the screens existed - _bindings->grabKeys(true); + //_bindings->grabKeys(true); // set up input focus setFocusedClient(0); @@ -206,13 +221,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::RenderColor::destroy(); + otk::destroy(); } @@ -223,12 +232,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 @@ -247,6 +251,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); @@ -278,7 +284,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\ @@ -322,8 +329,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 @@ -360,13 +369,30 @@ Client *Openbox::findClient(Window window) void Openbox::setFocusedClient(Client *c) { + // 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 + if (_focused_client) + _focused_client->installColormap(false); + else + _focused_screen->installColormap(false); + _focused_client = c; if (c) { _focused_screen = _screens[c->screen()]; + + // install the client's colormap + c->installColormap(true); } else { - assert(_focused_screen); XSetInputFocus(**otk::display, _focused_screen->focuswindow(), RevertToNone, CurrentTime); + + // install the root window colormap + _focused_screen->installColormap(true); } // set the NET_ACTIVE_WINDOW hint for all screens ScreenList::iterator it, end = _screens.end();