From 4d33c04f15e60e21a537edd635c9ac130312a3cb Mon Sep 17 00:00:00 2001 From: Christopher Davis Date: Fri, 23 Jun 2006 03:51:52 +0000 Subject: Began work on signal handler/map system. It seems to be working; however, events with varying text aren't handled because it does a straight lookup in the hashtable with the signal name to locate the argument list. Will need to change the system to accomodate the events. The basics for reference arg support is there but not well tested. git-svn-id: http://svn.irssi.org/repos/irssi-python@4289 dbcabf3a-b0e7-0310-adc4-f8d773084564 --- objects/pyscript-object.c | 63 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 16 deletions(-) (limited to 'objects/pyscript-object.c') diff --git a/objects/pyscript-object.c b/objects/pyscript-object.c index f74861f..d4ec5f1 100644 --- a/objects/pyscript-object.c +++ b/objects/pyscript-object.c @@ -65,24 +65,60 @@ static PyObject *PyScript_new(PyTypeObject *type, PyObject *args, PyObject *kwds return (PyObject *)self; } +//FIXME: add prioriety as arg +PyDoc_STRVAR(PyScript_command_bind_doc, + "Bind a command" +); static PyObject *PyScript_command_bind(PyScript *self, PyObject *args, PyObject *kwds) { - static char *kwlist[] = {"cmd", "func", "category", NULL}; + static char *kwlist[] = {"cmd", "func", "category", "priority", NULL}; char *cmd; PyObject *func; char *category = NULL; + int priority = SIGNAL_PRIORITY_DEFAULT; PY_SIGNAL_REC *srec; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|s", kwlist, &cmd, &func, &category)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|si", kwlist, + &cmd, &func, &category, &priority)) return NULL; if (!PyCallable_Check(func)) return PyErr_Format(PyExc_TypeError, "func must be callable"); - srec = py_command_bind(cmd, func, category); - + srec = pysignals_command_bind(cmd, func, category, priority); + if (!srec) + return PyErr_Format(PyExc_RuntimeError, "unable to bind command"); + /* add record to internal list*/ - self->signals = g_slist_append(self->signals, crec); + self->signals = g_slist_append(self->signals, srec); + + Py_RETURN_NONE; +} + +PyDoc_STRVAR(PyScript_signal_add_doc, + "add signal" +); +static PyObject *PyScript_signal_add(PyScript *self, PyObject *args, PyObject *kwds) +{ + static char *kwlist[] = {"signal", "func", "category", "priority", NULL}; + char *signal; + PyObject *func; + char *category = NULL; + int priority = SIGNAL_PRIORITY_DEFAULT; + PY_SIGNAL_REC *srec; + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "sO|si", kwlist, + &signal, &func, &category, &priority)) + return NULL; + + if (!PyCallable_Check(func)) + return PyErr_Format(PyExc_TypeError, "func must be callable"); + + srec = pysignals_signal_add(signal, func, priority); + if (!srec) + return PyErr_Format(PyExc_KeyError, "unable to find signal, '%s'", signal); + + self->signals = g_slist_append(self->signals, srec); Py_RETURN_NONE; } @@ -96,8 +132,10 @@ static PyMemberDef PyScript_members[] = { /* Methods for object */ static PyMethodDef PyScript_methods[] = { - {"command_bind", (PyCFunction)PyScript_command_bind, - METH_VARARGS | METH_KEYWORDS, "Bind a command"}, + {"command_bind", (PyCFunction)PyScript_command_bind, METH_VARARGS | METH_KEYWORDS, + PyScript_command_bind_doc}, + {"signal_add", (PyCFunction)PyScript_signal_add, METH_VARARGS | METH_KEYWORDS, + PyScript_signal_add_doc}, {NULL} /* Sentinel */ }; @@ -187,15 +225,8 @@ void pyscript_remove_signals(PyObject *script) self = (PyScript *) script; for (node = self->signals; node != NULL; node = node->next) - { - PY_SIGNAL_REC *crec = node->data; - - py_command_unbind(crec); - g_free(crec->name); - Py_DECREF(crec->handler); - g_free(crec); - } - + pysignals_remove_generic((PY_SIGNAL_REC *)node->data); + g_slist_free(self->signals); self->signals = NULL; } -- cgit