+PyObject *MotionData_pressx(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":pressx")) return NULL;
+ return PyLong_FromLong(self->pressx);
+}
+
+PyObject *MotionData_pressy(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":pressy")) return NULL;
+ return PyLong_FromLong(self->pressy);
+}
+
+
+PyObject *MotionData_press_clientx(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientx")) return NULL;
+ return PyLong_FromLong(self->press_clientx);
+}
+
+PyObject *MotionData_press_clienty(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clienty")) return NULL;
+ return PyLong_FromLong(self->press_clienty);
+}
+
+PyObject *MotionData_press_clientwidth(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientwidth")) return NULL;
+ return PyLong_FromLong(self->press_clientwidth);
+}
+
+PyObject *MotionData_press_clientheight(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":press_clientheight")) return NULL;
+ return PyLong_FromLong(self->press_clientheight);
+}
+
+PyObject *MotionData_time(MotionData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":time")) return NULL;
+ return PyLong_FromLong(self->time);
+}
+
+static PyMethodDef MotionData_methods[] = {
+ {"action", (PyCFunction)MotionData_action, METH_VARARGS,
+ "Return the action being executed."},
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
+ "Return the client window id."},
+ {"context", (PyCFunction)MotionData_context, METH_VARARGS,
+ "Return the context that the action is occuring in."},
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
+ "Return the modifier keys state."},
+ {"button", (PyCFunction)MotionData_button, METH_VARARGS,
+ "Return the number of the pressed button (1-5)."},
+ {"xroot", (PyCFunction)MotionData_xroot, METH_VARARGS,
+ "Return the X-position of the mouse cursor on the root window."},
+ {"yroot", (PyCFunction)MotionData_yroot, METH_VARARGS,
+ "Return the Y-position of the mouse cursor on the root window."},
+ {"pressx", (PyCFunction)MotionData_pressx, METH_VARARGS,
+ "Return the X-position of the mouse cursor at the start of the drag."},
+ {"pressy", (PyCFunction)MotionData_pressy, METH_VARARGS,
+ "Return the Y-position of the mouse cursor at the start of the drag."},
+ {"press_clientx", (PyCFunction)MotionData_press_clientx, METH_VARARGS,
+ "Return the X-position of the client at the start of the drag."},
+ {"press_clienty", (PyCFunction)MotionData_press_clienty, METH_VARARGS,
+ "Return the Y-position of the client at the start of the drag."},
+ {"press_clientwidth", (PyCFunction)MotionData_press_clientwidth,
+ METH_VARARGS,
+ "Return the width of the client at the start of the drag."},
+ {"press_clientheight", (PyCFunction)MotionData_press_clientheight,
+ METH_VARARGS,
+ "Return the height of the client at the start of the drag."},
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
+ "Return the time at which the event occured."},
+ {NULL, NULL, 0, NULL}
+};
+
+static PyMethodDef ButtonData_methods[] = {
+ {"action", (PyCFunction)MotionData_action, METH_VARARGS,
+ "Return the action being executed."},
+ {"context", (PyCFunction)MotionData_context, METH_VARARGS,
+ "Return the context that the action is occuring in."},
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
+ "Return the client window id."},
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
+ "Return the modifier keys state."},
+ {"button", (PyCFunction)MotionData_button, METH_VARARGS,
+ "Return the number of the pressed button (1-5)."},
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
+ "Return the time at which the event occured."},
+ {NULL, NULL, 0, NULL}
+};
+
+PyObject *KeyData_key(KeyData *self, PyObject *args)
+{
+ if(!PyArg_ParseTuple(args,":key")) return NULL;
+ return PyString_FromString(
+ XKeysymToString(XKeycodeToKeysym(otk::OBDisplay::display, self->key, 0)));
+
+}
+
+static PyMethodDef KeyData_methods[] = {
+ {"window", (PyCFunction)MotionData_window, METH_VARARGS,
+ "Return the client window id."},
+ {"modifiers", (PyCFunction)MotionData_modifiers, METH_VARARGS,
+ "Return the modifier keys state."},
+ {"key", (PyCFunction)KeyData_key, METH_VARARGS,
+ "Return the name of the pressed key."},
+ {"time", (PyCFunction)MotionData_time, METH_VARARGS,
+ "Return the time at which the event occured."},
+ {NULL, NULL, 0, NULL}
+};
+
+static PyObject *MotionDataGetAttr(PyObject *obj, char *name)
+{
+ return Py_FindMethod(MotionData_methods, obj, name);
+}
+
+static PyObject *ButtonDataGetAttr(PyObject *obj, char *name)
+{
+ return Py_FindMethod(ButtonData_methods, obj, name);
+}
+
+static PyObject *KeyDataGetAttr(PyObject *obj, char *name)
+{
+ return Py_FindMethod(KeyData_methods, obj, name);
+}
+
+static PyTypeObject MotionData_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "MotionData",
+ sizeof(MotionData),
+ 0,
+ dealloc,
+ 0,
+ (getattrfunc)MotionDataGetAttr,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static PyTypeObject ButtonData_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "ButtonData",
+ sizeof(ButtonData),
+ 0,
+ dealloc,
+ 0,
+ (getattrfunc)ButtonDataGetAttr,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static PyTypeObject KeyData_Type = {
+ PyObject_HEAD_INIT(NULL)
+ 0,
+ "KeyData",
+ sizeof(KeyData),
+ 0,
+ dealloc,
+ 0,
+ (getattrfunc)KeyDataGetAttr,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+MotionData *new_motion_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action, int xroot, int yroot,
+ const otk::Point &initpos, const otk::Rect &initarea)
+{
+ MotionData *data = PyObject_New(MotionData, &MotionData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->button = button;
+ data->context= context;
+ data->action = action;
+ data->xroot = xroot;
+ data->yroot = yroot;
+ data->pressx = initpos.x();
+ data->pressy = initpos.y();
+ data->press_clientx = initarea.x();
+ data->press_clienty = initarea.y();
+ data->press_clientwidth = initarea.width();
+ data->press_clientheight = initarea.height();
+ return data;
+}
+
+ButtonData *new_button_data(Window window, Time time, unsigned int state,
+ unsigned int button, MouseContext context,
+ MouseAction action)
+{
+ ButtonData *data = PyObject_New(ButtonData, &ButtonData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->button = button;
+ data->context= context;
+ data->action = action;
+ return data;
+}
+
+KeyData *new_key_data(Window window, Time time, unsigned int state,
+ unsigned int key)
+{
+ KeyData *data = PyObject_New(KeyData, &KeyData_Type);
+ data->window = window;
+ data->time = time;
+ data->state = state;
+ data->key = key;
+ return data;
+}
+
+// **************** //
+// End custom types //
+// **************** //
+
+void python_init(char *argv0)
+{
+ Py_SetProgramName(argv0);
+ Py_Initialize();
+ init_otk();
+ init_openbox();
+ PyRun_SimpleString("from _otk import *; from _openbox import *;");
+ PyRun_SimpleString("openbox = Openbox_instance()");
+
+ // set up access to the python global variables
+ PyObject *obmodule = PyImport_AddModule("__main__");
+ obdict = PyModule_GetDict(obmodule);
+
+ // set up the custom types
+ MotionData_Type.ob_type = &PyType_Type;
+ ButtonData_Type.ob_type = &PyType_Type;
+ KeyData_Type.ob_type = &PyType_Type;
+}
+
+void python_destroy()
+{
+ Py_DECREF(obdict);
+}
+
+bool python_exec(const std::string &path)
+{
+ FILE *rcpyfd = fopen(path.c_str(), "r");
+ if (!rcpyfd) {
+ printf("failed to load python file %s\n", path.c_str());
+ return false;