X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fopenbox.i;h=b88175d90e6565d7f984aa9d080e95fa8988ce25;hb=e05d5f7934ce27893f900627fbd06b1679d4c0ad;hp=74ed301060fa72c36158c717a7fd1b93f98164b5;hpb=d4853f108c1d22c344c1cb9a8a8b7cdc46648983;p=chaz%2Fopenbox diff --git a/src/openbox.i b/src/openbox.i index 74ed3010..b88175d9 100644 --- a/src/openbox.i +++ b/src/openbox.i @@ -10,11 +10,12 @@ #include "openbox.hh" #include "screen.hh" #include "client.hh" -#include "python.hh" +#include "bindings.hh" +#include "actions.hh" %} - %include stl.i +%include exception.i //%include std_list.i //%template(ClientList) std::list; @@ -27,13 +28,14 @@ %inline %{ enum ActionType { Action_ButtonPress, - Action_ButtonRelease, Action_Click, Action_DoubleClick, Action_EnterWindow, Action_LeaveWindow, Action_KeyPress, - Action_MouseMotion + Action_MouseMotion, + Action_NewWindow, + Action_CloseWindow }; enum WidgetType { Type_Frame, @@ -51,16 +53,110 @@ Type_Root }; %} -%ignore ob::python_callback; -%rename(register) ob::python_register; -%rename(preregister) ob::python_preregister; -%rename(unregister) ob::python_unregister; -%rename(unregister_all) ob::python_unregister_all; -%rename(bind_key) ob::python_bind_key; -%rename(unbind_key) ob::python_unbind_key; -%rename(bind_mouse) ob::python_bind_mouse; -%rename(unbind_mouse) ob::python_unbind_mouse; -%rename(unbind_all) ob::python_unbind_all; +%rename(register) python_register; +%inline %{ +PyObject * python_register(int action, PyObject *func, bool infront = false) +{ + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, "Invalid callback function."); + return NULL; + } + + if (!ob::Openbox::instance->actions()->registerCallback( + (ob::OBActions::ActionType)action, func, infront)) { + PyErr_SetString(PyExc_RuntimeError, "Unable to register action callback."); + return NULL; + } + Py_INCREF(Py_None); return Py_None; +} + +PyObject * unregister(int action, PyObject *func) +{ + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, "Invalid callback function."); + return NULL; + } + + if (!ob::Openbox::instance->actions()->unregisterCallback( + (ob::OBActions::ActionType)action, func)) { + PyErr_SetString(PyExc_RuntimeError, "Unable to unregister action callback."); + return NULL; + } + Py_INCREF(Py_None); return Py_None; +} + +PyObject * unregister_all(int action) +{ + if (!ob::Openbox::instance->actions()->unregisterAllCallbacks( + (ob::OBActions::ActionType)action)) { + PyErr_SetString(PyExc_RuntimeError, + "Unable to unregister action callbacks."); + return NULL; + } + Py_INCREF(Py_None); return Py_None; +} + +PyObject * bind(PyObject *keylist, PyObject *func) +{ + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, "Invalid callback function."); + return NULL; + } + if (!PyList_Check(keylist)) { + PyErr_SetString(PyExc_TypeError, "Invalid keylist. Not a list."); + return NULL; + } + + ob::OBBindings::StringVect vectkeylist; + for (int i = 0, end = PyList_Size(keylist); i < end; ++i) { + PyObject *str = PyList_GetItem(keylist, i); + if (!PyString_Check(str)) { + PyErr_SetString(PyExc_TypeError, + "Invalid keylist. It must contain only strings."); + return NULL; + } + vectkeylist.push_back(PyString_AsString(str)); + } + + if (!ob::Openbox::instance->bindings()->add(vectkeylist, func)) { + PyErr_SetString(PyExc_RuntimeError,"Unable to add binding."); + return NULL; + } + Py_INCREF(Py_None); return Py_None; +} + +PyObject * unbind(PyObject *keylist) +{ + if (!PyList_Check(keylist)) { + PyErr_SetString(PyExc_TypeError, "Invalid keylist. Not a list."); + return NULL; + } + + ob::OBBindings::StringVect vectkeylist; + for (int i = 0, end = PyList_Size(keylist); i < end; ++i) { + PyObject *str = PyList_GetItem(keylist, i); + if (!PyString_Check(str)) { + PyErr_SetString(PyExc_TypeError, + "Invalid keylist. It must contain only strings."); + return NULL; + } + vectkeylist.push_back(PyString_AsString(str)); + } + + ob::Openbox::instance->bindings()->remove(vectkeylist); + Py_INCREF(Py_None); return Py_None; +} + +void unbind_all() +{ + ob::Openbox::instance->bindings()->removeAll(); +} + +void set_reset_key(const std::string &key) +{ + ob::Openbox::instance->bindings()->setResetKey(key); +} +%} %ignore ob::OBScreen::clients; %{ @@ -82,11 +178,11 @@ %import "../otk/eventdispatcher.hh" %import "../otk/eventhandler.hh" %import "widget.hh" +%import "actions.hh" %include "openbox.hh" %include "screen.hh" %include "client.hh" -%include "python.hh" // for Mod1Mask etc %include "X11/X.h"