diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-02-17 21:25:52 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-02-17 21:25:52 +0000 |
| commit | 4534151926c4f3887ba9e37ae67df16f1eb039ef (patch) | |
| tree | b375f8ce60754639795ae99d59e1be44d52f9b0b /wrap/otk_timer.i | |
| parent | 1741bddecb23bfc401397222c9961233bb30a87a (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.i | 78 |
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" |
