summaryrefslogtreecommitdiff
path: root/wrap/otk_timer.i
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-02-17 21:25:52 +0000
committerDana Jansens <danakj@orodu.net>2003-02-17 21:25:52 +0000
commit4534151926c4f3887ba9e37ae67df16f1eb039ef (patch)
treeb375f8ce60754639795ae99d59e1be44d52f9b0b /wrap/otk_timer.i
parent1741bddecb23bfc401397222c9961233bb30a87a (diff)
split up the otk stuff into separate files.
wrap otk::Property properly with typemaps so that it is usable. wrap otk::Timer properly so that you can use it with a python callback
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"