#include "screen.hh"
#include "actions.hh"
#include "bindings.hh"
+#include "python.hh"
#include "otk/property.hh"
#include "otk/display.hh"
#include "otk/assassin.hh"
# include <sys/select.h>
#endif // HAVE_SYS_SELECT_H
-#include <Python.h>
-
-// The initializer in openbox_wrap.cc
-extern void init_openbox(void);
-// The initializer in otk_wrap.cc
-extern void init_otk(void);
-
#include "gettext.h"
#define _(str) gettext(str)
}
}
-static void runPython(const char *s) {
- FILE *rcpyfd = fopen(s, "r");
- if (!rcpyfd) {
- printf("failed to load python file %s\n", s);
- } else {
- PyRun_SimpleFile(rcpyfd, const_cast<char*>(s));
- fclose(rcpyfd);
- }
-}
-
-
Openbox::Openbox(int argc, char **argv)
: otk::OtkEventDispatcher(),
otk::OtkEventHandler()
parseCommandLine(argc, argv);
- // TEMPORARY: using the xrdb rc3
- _config.setFile(_rcfilepath);
- if (!_config.load()) {
- printf("failed to load rc file %s\n", _config.file().c_str());
- ::exit(2);
- }
- std::string s;
- _config.getValue("session.styleFile", s);
- _config.setFile(s);
- if (!_config.load()) {
- printf("failed to load style %s\n", _config.file().c_str());
- ::exit(2);
- }
-
// open the X display (and gets some info about it, and its screens)
otk::OBDisplay::initialize(_displayreq);
assert(otk::OBDisplay::display);
_cursors.ul_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ul_angle);
_cursors.ur_angle = XCreateFontCursor(otk::OBDisplay::display, XC_ur_angle);
- // start up python and run the user's startup script
- Py_SetProgramName(argv[0]);
- Py_Initialize();
- init_otk();
- init_openbox();
- PyRun_SimpleString("from _otk import *; from _openbox import *;");
- PyRun_SimpleString("openbox = Openbox_instance()");
-
- runPython(SCRIPTDIR"/clientmotion.py"); // moving and resizing clients
- runPython(SCRIPTDIR"/clicks.py"); // titlebar/root clicks and dblclicks
- runPython(_scriptfilepath.c_str());
-
+ // 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
+ // run the user's script
+ python_exec(_scriptfilepath.c_str());
+
// initialize all the screens
OBScreen *screen;
- screen = new OBScreen(0, _config);
+ screen = new OBScreen(0);
if (screen->managed()) {
_screens.push_back(screen);
- _screens[0]->manageExisting();
// XXX: "change to" the first workspace on the screen to initialize stuff
} else
delete screen;
::exit(1);
}
+ ScreenList::iterator it, end = _screens.end();
+ for (it = _screens.begin(); it != end; ++it) {
+ (*it)->manageExisting();
+ }
+
// grab any keys set up before the screens existed
_bindings->grabKeys(true);
{
_state = State_Exiting; // time to kill everything
- delete _bindings;
- delete _actions;
-
std::for_each(_screens.begin(), _screens.end(), otk::PointerAssassin());
+ delete _bindings;
+ delete _actions;
delete _property;
+ python_destroy();
+
// close the X display
otk::OBDisplay::destroy();
}
}
}
+void Openbox::execute(int screen, const std::string &bin)
+{
+#ifdef __EMX__
+ // XXX: whats this for? windows?
+ spawnlp(P_NOWAIT, "cmd.exe", "cmd.exe", "/c", bin.c_str(), NULL);
+#else // __EMX__
+ if (screen >= ScreenCount(otk::OBDisplay::display))
+ screen = 0;
+ const std::string &dstr =
+ otk::OBDisplay::screenInfo(screen)->displayString();
+
+ if (! fork()) {
+ setsid();
+ int ret = putenv(const_cast<char *>(dstr.c_str()));
+ assert(ret != -1);
+ ret = execl("/bin/sh", "/bin/sh", "-c", bin.c_str(), NULL);
+ exit(ret);
+ }
+#endif // __EMX__
+}
+
}