-#include <vector>
-#include <algorithm>
-
-namespace ob {
-
-typedef std::vector<PyObject*> FunctionList;
-
-static FunctionList callbacks[OBActions::NUM_ACTIONS];
-static FunctionList bindfuncs;
-
-bool python_register(int action, PyObject *callback)
-{
- if (action < 0 || action >= OBActions::NUM_ACTIONS ||
- action == OBActions::Action_KeyPress) {
- 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;
-}
-
-bool python_preregister(int action, PyObject *callback)
-{
- if (action < 0 || action >= OBActions::NUM_ACTIONS ||
- action == OBActions::Action_KeyPress) {
- 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].insert(callbacks[action].begin(), callback);
- }
- return true;
-}
-
-bool python_unregister(int action, PyObject *callback)
-{
- if (action < 0 || action >= OBActions::NUM_ACTIONS ||
- action == OBActions::Action_KeyPress) {
- 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;
-}
-
-bool python_unregister_all(int action)
-{
- if (action < 0 || action >= OBActions::NUM_ACTIONS) {
- PyErr_SetString(PyExc_AssertionError, "Invalid action type.");
- return false;
- }
-
- while (!callbacks[action].empty()) {
- Py_XDECREF(callbacks[action].back());
- callbacks[action].pop_back();
- }
- return true;
-}
-
-void python_callback(OBActions::ActionType action, Window window,
- OBWidget::WidgetType type, unsigned int state,
- long d1, long d2, long d3, long d4)
-{
- PyObject *arglist;
- PyObject *result;
-
- assert(action >= 0 && action < OBActions::NUM_ACTIONS);