summaryrefslogtreecommitdiff
path: root/wrap/otk_timer.i
diff options
context:
space:
mode:
Diffstat (limited to 'wrap/otk_timer.i')
-rw-r--r--wrap/otk_timer.i78
1 files changed, 78 insertions, 0 deletions
diff --git a/wrap/otk_timer.i b/wrap/otk_timer.i
new file mode 100644
index 00000000..9f9eb77e
--- /dev/null
+++ b/wrap/otk_timer.i
@@ -0,0 +1,78 @@
+// -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
+
+%module otk_timer
+
+%{
+#include "config.h"
+#include "timer.hh"
+%}
+
+%{
+ struct PythonCallbackData {
+ PyObject *pyfunc;
+ void *data;
+ };
+
+ /*
+ Calls a python callback for the TimeoutHandler function type
+ */
+ static void PythonCallback(PythonCallbackData *calldata) {
+ PyObject *arglist, *result;
+
+ arglist = Py_BuildValue("(O)", calldata->data);
+
+ // call the callback
+ result = PyEval_CallObject((PyObject*)calldata->pyfunc, arglist);
+ if (!result || PyErr_Occurred()) {
+ // an exception occured in the script, display it
+ PyErr_Print();
+ }
+
+ Py_XDECREF(result);
+ Py_DECREF(arglist);
+ }
+%}
+
+// Grab a Python function object as a Python object.
+%typemap(python,in) PyObject *func {
+ if (!PyCallable_Check($input)) {
+ PyErr_SetString(PyExc_TypeError, "Excepting a callable object.");
+ return NULL;
+ }
+ $1 = $input;
+}
+
+namespace otk {
+
+%ignore Timer::Timer(long, TimeoutHandler, void*);
+%ignore Timer::operator delete(void*);
+%ignore Timer::initialize();
+%ignore Timer::destroy();
+%ignore Timer::dispatchTimers(bool);
+%ignore Timer::nearestTimeout(struct timeval&);
+
+%extend Timer {
+ Timer(long, PyObject*, PyObject*);
+
+ // if you don't call stop() before the object disappears, the timer will
+ // keep firing forever
+ void stop() {
+ delete self;
+ }
+}
+
+}
+
+%{
+ static otk::Timer *new_otk_Timer(long delay,
+ PyObject *func, PyObject *data) {
+ PythonCallbackData *d = new PythonCallbackData;
+ d->pyfunc = func;
+ d->data = data;
+ return new otk::Timer(delay,
+ (otk::Timer::TimeoutHandler)&PythonCallback, d);
+ // the PythonCallbackData is leaked.. XXX
+ }
+%}
+
+%include "timer.hh"