diff options
author | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-07-10 22:50:46 +0000 |
---|---|---|
committer | Gustavo J. A. M. Carneiro <gjc@src.gnome.org> | 2005-07-10 22:50:46 +0000 |
commit | 390cf05739daa16960de00675fa4e6e328778802 (patch) | |
tree | b1c90b437f334106aca15e988b9eefc81a54f354 | |
parent | f8e6488638ea21d73cbe8eb8e8b996b17ed0ea76 (diff) | |
download | pygtk-390cf05739daa16960de00675fa4e6e328778802.tar.gz |
make iochannel api use new PyGPollFD type instead of tuples
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gobject/pygiochannel.c | 20 | ||||
-rw-r--r-- | gobject/pygobject-private.h | 7 | ||||
-rw-r--r-- | gobject/pygsource.c | 10 |
4 files changed, 30 insertions, 17 deletions
@@ -1,3 +1,13 @@ +2005-07-10 Gustavo J. A. M. Carneiro <gjc@gnome.org> + + * gobject/pygiochannel.c (py_io_channel_win32_poll) + (py_io_channel_win32_make_pollfd): Change to use the new PyGPollFD + type instead of tuples. + + * gobject/pygsource.c (pyg_poll_fd_dealloc): Change DECREF to + XDECREF on self->fd_obj. Moved PyGPollFD structure into + pygobject-private.h, to make it accessible from pygiochannel.c. + 2005-07-10 Johan Dahlin <johan@gnome.org> * gtk/gtkwidget.override (_wrap_gtk_widget_list_accel_closures): diff --git a/gobject/pygiochannel.c b/gobject/pygiochannel.c index ba3cfa1e..ad56a6fb 100644 --- a/gobject/pygiochannel.c +++ b/gobject/pygiochannel.c @@ -518,17 +518,18 @@ py_io_channel_win32_poll(PyObject *self, PyObject *args, PyObject *kwargs) pollfd = g_newa(GPollFD, len); for (i = 0; i < len; ++i) { pyfd = PyList_GET_ITEM(pyfds, i); - if (!PyArg_ParseTuple(pyfd, "iii", &pollfd[i].fd, &pollfd[i].events, - &pollfd[i].revents)) + if (!PyObject_TypeCheck(pyfd, &PyGPollFD_Type)) { + PyErr_SetString(PyExc_TypeError, "'fds' must be a list of gobject.PollFD objects"); return NULL; + } + pollfd[i] = ((PyGPollFD *) pyfd)->pollfd; } result = g_io_channel_win32_poll(pollfd, len, timeout); - pyfds = PyList_New(len); - for (i = 0; i < len; ++i) - PyList_SET_ITEM(pyfds, i, Py_BuildValue("(iii)", pollfd[i].fd, - pollfd[i].events, - pollfd[i].revents)); + for (i = 0; i < len; ++i) { + pyfd = PyList_GET_ITEM(pyfds, i); + ((PyGPollFD *) pyfd)->pollfd = pollfd[i]; + } return PyInt_FromLong(result); } @@ -538,6 +539,7 @@ py_io_channel_win32_make_pollfd(PyObject *self, PyObject *args, PyObject *kwargs static char *kwlist[] = { "condition", NULL }; int condition; GPollFD pollfd; + PyGPollFD *pypollfd; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:gobject.IOChannel.win32_make_pollfd", @@ -546,7 +548,9 @@ py_io_channel_win32_make_pollfd(PyObject *self, PyObject *args, PyObject *kwargs g_io_channel_win32_make_pollfd(((PyGIOChannel *) self)->channel, condition, &pollfd); - return Py_BuildValue("[iii]", pollfd.fd, pollfd.events, pollfd.revents); + pypollfd = PyObject_NEW(PyGPollFD, &PyGPollFD_Type); + pypollfd->pollfd = pollfd; + return (PyObject *) pypollfd; } #endif /* def G_OS_WIN32 */ diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h index 192fde9d..cb7e8923 100644 --- a/gobject/pygobject-private.h +++ b/gobject/pygobject-private.h @@ -203,5 +203,12 @@ extern PyTypeObject PyGIdle_Type; extern PyTypeObject PyGTimeout_Type; extern PyTypeObject PyGPollFD_Type; +typedef struct +{ + PyObject_HEAD + GPollFD pollfd; + PyObject *fd_obj; +} PyGPollFD; + #endif diff --git a/gobject/pygsource.c b/gobject/pygsource.c index 2e49596f..08ca4583 100644 --- a/gobject/pygsource.c +++ b/gobject/pygsource.c @@ -54,14 +54,6 @@ typedef struct PyObject *obj; } PyGRealSource; -typedef struct -{ - PyObject_HEAD - GPollFD pollfd; - PyObject *fd_obj; -} PyGPollFD; - - static PyObject * source_repr(PyGSource *self, const char *type) { @@ -780,7 +772,7 @@ static PyMemberDef pyg_poll_fd_members[] = { static void pyg_poll_fd_dealloc(PyGPollFD *self) { - Py_DECREF(self->fd_obj); + Py_XDECREF(self->fd_obj); PyObject_DEL(self); } |