X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fpython.cc;h=08f8f506139cf2398f8ce25c511500789c0cb82f;hb=7fe3301e7ea905a8a76d54c22751f3d8a346e28b;hp=d44b2d48a2c03603a3ee997f9910348c14437a8b;hpb=b34824a4e2ddc0247099fa1b3952de426bfde05b;p=chaz%2Fopenbox diff --git a/src/python.cc b/src/python.cc index d44b2d48..08f8f506 100644 --- a/src/python.cc +++ b/src/python.cc @@ -1,93 +1,47 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- #include "python.hh" +#include "openbox.hh" +#include "actions.hh" +#include "python.hh" +#include "bindings.hh" +#include "otk/display.hh" +#include "otk/util.hh" -#include -#include +extern "C" { +#include +} namespace ob { -typedef std::vector FunctionList; - -static FunctionList callbacks[OBActions::NUM_ACTIONS]; - -bool python_register(int action, PyObject *callback) +void python_init(char *argv0) { - if (action < 0 || action >= OBActions::NUM_ACTIONS) { - PyErr_SetString(PyExc_AssertionError, "Invalid action type."); - return false; - } - if (!PyCallable_Check(callback)) { - PyErr_SetString(PyExc_AssertionError, "Invalid callback function."); - return false; - } - - FunctionList::iterator it = std::find(callbacks[action].begin(), - callbacks[action].end(), - callback); - if (it == callbacks[action].end()) { // not already in there - Py_XINCREF(callback); // Add a reference to new callback - callbacks[action].push_back(callback); - } - return true; + // start the python engine + Py_SetProgramName(argv0); + Py_Initialize(); + // prepend the openbox directories for python scripts to the sys path + PyRun_SimpleString("import sys"); + PyRun_SimpleString("sys.path.insert(0, '" SCRIPTDIR "')"); + PyRun_SimpleString(const_cast(("sys.path.insert(0, '" + + otk::expandTilde("~/.openbox/python") + + "')").c_str())); } -bool python_unregister(int action, PyObject *callback) +void python_destroy() { - if (action < 0 || action >= OBActions::NUM_ACTIONS) { - PyErr_SetString(PyExc_AssertionError, "Invalid action type."); - return false; - } - if (!PyCallable_Check(callback)) { - PyErr_SetString(PyExc_AssertionError, "Invalid callback function."); - return false; - } - - FunctionList::iterator it = std::find(callbacks[action].begin(), - callbacks[action].end(), - callback); - if (it != callbacks[action].end()) { // its been registered before - Py_XDECREF(*it); // Dispose of previous callback - callbacks[action].erase(it); - } - return true; + Py_Finalize(); } -void python_callback(OBActions::ActionType action, Window window, - OBWidget::WidgetType type, unsigned int state, - long d1, long d2, long d3, long d4) +bool python_exec(const std::string &path) { - PyObject *arglist; - PyObject *result; - - assert(action >= 0 && action < OBActions::NUM_ACTIONS); - - if (d4 != LONG_MIN) - arglist = Py_BuildValue("iliillll", action, window, type, state, - d1, d2, d3, d4); - else if (d3 != LONG_MIN) - arglist = Py_BuildValue("iliilll", action, window, type, state, - d1, d2, d3); - else if (d2 != LONG_MIN) - arglist = Py_BuildValue("iliill", action, window, type, state, d1, d2); - else if (d1 != LONG_MIN) - arglist = Py_BuildValue("iliil", action, window, type, state, d1); - else - arglist = Py_BuildValue("ilii", action, window, type, state); - - FunctionList::iterator it, end = callbacks[action].end(); - for (it = callbacks[action].begin(); it != end; ++it) { - // call the callback - result = PyEval_CallObject(*it, arglist); - if (result) { - Py_DECREF(result); - } else { - // an exception occured in the script, display it - PyErr_Print(); - } + FILE *rcpyfd = fopen(path.c_str(), "r"); + if (!rcpyfd) { + printf("Failed to load python file %s\n", path.c_str()); + return false; } - - Py_DECREF(arglist); + PyRun_SimpleFile(rcpyfd, const_cast(path.c_str())); + fclose(rcpyfd); + return true; } }