diff options
author | Johan Dahlin <johan@gnome.org> | 2008-07-21 17:27:22 +0000 |
---|---|---|
committer | Johan Dahlin <johan@src.gnome.org> | 2008-07-21 17:27:22 +0000 |
commit | bf49647a03923975eb24ce634dae8254553db8de (patch) | |
tree | fac72b5b605789d7fa566332bd6a986b148a1ca5 /gobject/pygsource.c | |
parent | 39cf2d9ca4fc9b50984ec172282d33b1843fceee (diff) | |
download | pygobject-bf49647a03923975eb24ce634dae8254553db8de.tar.gz pygobject-bf49647a03923975eb24ce634dae8254553db8de.tar.xz pygobject-bf49647a03923975eb24ce634dae8254553db8de.zip |
Move over Source, IOChannel, Idle, Timeout and PollFD to glib from
2008-07-21 Johan Dahlin <johan@gnome.org>
* glib/Makefile.am:
* glib/glibmodule.c (pyg_idle_add), (pyg_timeout_add),
(pyg_timeout_add_seconds), (pyg_io_add_watch),
(pyglib_register_api), (pyglib_register_error),
(pyglib_register_version_tuples), (init_glib):
* glib/pygiochannel.c (py_io_channel_next),
(py_io_channel_shutdown), (py_io_channel_set_encoding),
(py_io_channel_read_chars), (py_io_channel_write_chars),
(py_io_channel_write_lines), (py_io_channel_flush),
(py_io_channel_set_flags), (py_io_channel_read_line),
(py_io_channel_read_lines), (py_io_channel_seek),
(py_io_channel_init), (pyglib_iochannel_register_types):
* glib/pygiochannel.h:
* glib/pyglib-private.h:
* glib/pyglib.c (pyglib_threads_enabled),
(pyglib_gil_state_ensure), (pyglib_gil_state_release),
(pyglib_enable_threads), (pyglib_block_threads),
(pyglib_unblock_threads), (pyglib_set_thread_block_funcs),
(pyglib_handler_marshal), (pyglib_destroy_notify):
* glib/pyglib.h:
* glib/pygsource.c (pyg_source_set_callback),
(pyglib_source_register_types):
* glib/pygsource.h:
* glib/pygspawn.c (pyglib_spawn_register_types):
* glib/pygspawn.h:
* gobject/Makefile.am:
* gobject/__init__.py:
* gobject/gobjectmodule.c (pyg_set_thread_block_funcs),
(init_gobject):
* gobject/pygiochannel.c:
* gobject/pygobject-private.h:
* gobject/pygsource.c:
Move over Source, IOChannel, Idle, Timeout and PollFD to glib from
gobject.
Clean up and add a bit of new api for glib.
svn path=/trunk/; revision=846
Diffstat (limited to 'gobject/pygsource.c')
-rw-r--r-- | gobject/pygsource.c | 847 |
1 files changed, 0 insertions, 847 deletions
diff --git a/gobject/pygsource.c b/gobject/pygsource.c deleted file mode 100644 index ae667dc..0000000 --- a/gobject/pygsource.c +++ /dev/null @@ -1,847 +0,0 @@ -/* -*- Mode: C; c-basic-offset: 4 -*- - * pygtk- Python bindings for the GTK toolkit. - * Copyright (C) 1998-2003 James Henstridge - * Copyright (C) 2005 Oracle - * - * Author: Manish Singh <manish.singh@oracle.com> - * - * pygsource.c: GSource wrapper - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include "pygobject-private.h" -#include "pythread.h" -#include <structmember.h> -#include <pyglib.h> - - -#define CHECK_DESTROYED(self, ret) G_STMT_START { \ - if ((self)->source == NULL) { \ - PyErr_SetString(PyExc_RuntimeError, "source is destroyed"); \ - return (ret); \ - } \ -} G_STMT_END - - -typedef struct { - PyObject_HEAD - GSource *source; - PyObject *inst_dict; - PyObject *weakreflist; - gboolean python_source; -} PyGSource; - -typedef struct -{ - GSource source; - PyObject *obj; -} PyGRealSource; - -static PyObject * -source_repr(PyGSource *self, const char *type) -{ - gchar buf[256], *desc; - - if (self->source) { - if (g_source_get_context(self->source)) - desc = "attached"; - else - desc = "unattached"; - } else { - desc = "destroyed"; - } - - if (type) - g_snprintf(buf, sizeof(buf), "<%s glib %s source at 0x%lx>", - desc, type, (long) self); - else - g_snprintf(buf, sizeof(buf), "<%s glib source at 0x%lx>", - desc, (long) self); - - return PyString_FromString(buf); -} - -static PyObject * -pyg_source_attach(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "context", NULL }; - PyGMainContext *py_context = NULL; - GMainContext *context = NULL; - guint id; - - if (!PyArg_ParseTupleAndKeywords (args, kwargs, - "|O!:attach", kwlist, - &PyGMainContext_Type, &py_context)) - return NULL; - - if (py_context) - context = py_context->context; - - CHECK_DESTROYED(self, NULL); - - if (self->python_source) { - PyGRealSource *pysource = (PyGRealSource *)self->source; - Py_INCREF(pysource->obj); - } - - id = g_source_attach(self->source, context); - return PyInt_FromLong(id); -} - -static PyObject * -pyg_source_destroy(PyGSource *self) -{ - CHECK_DESTROYED(self, NULL); - - if (self->python_source && self->source->context) { - PyGRealSource *pysource = (PyGRealSource *)self->source; - Py_DECREF(pysource->obj); - } - - g_source_destroy(self->source); - self->source = NULL; - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -pyg_source_set_callback(PyGSource *self, PyObject *args) -{ - PyObject *first, *callback, *cbargs = NULL, *data; - gint len; - - CHECK_DESTROYED(self, NULL); - - len = PyTuple_Size (args); - if (len < 1) { - PyErr_SetString(PyExc_TypeError, - "set_callback requires at least 1 argument"); - return NULL; - } - - first = PySequence_GetSlice(args, 0, 1); - if (!PyArg_ParseTuple(first, "O:set_callback", &callback)) { - Py_DECREF (first); - return NULL; - } - Py_DECREF(first); - - if (!PyCallable_Check(callback)) { - PyErr_SetString(PyExc_TypeError, "first argument not callable"); - return NULL; - } - - cbargs = PySequence_GetSlice(args, 1, len); - if (cbargs == NULL) - return NULL; - - data = Py_BuildValue("(ON)", callback, cbargs); - if (data == NULL) - return NULL; - - g_source_set_callback(self->source, pyg_handler_marshal, data, - pyg_destroy_notify); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -pyg_source_get_context(PyGSource *self) -{ - GMainContext *context; - - CHECK_DESTROYED(self, NULL); - - context = g_source_get_context(self->source); - - if (context) { - return pyglib_main_context_new(context); - } else { - Py_INCREF(Py_None); - return Py_None; - } -} - -static PyObject * -pyg_source_add_poll(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "fd", NULL }; - PyGPollFD *fd; - - if (!self->python_source) { - PyErr_SetString(PyExc_TypeError, - "add_poll can only be used with sources " - "implemented in python"); - return NULL; - } - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O!:add_poll", kwlist, - &PyGPollFD_Type, &fd)) - return NULL; - - CHECK_DESTROYED(self, NULL); - - g_source_add_poll(self->source, &fd->pollfd); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -pyg_source_remove_poll(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "fd", NULL }; - PyGPollFD *fd; - - if (!self->python_source) { - PyErr_SetString(PyExc_TypeError, - "remove_poll can only be used with sources " - "implemented in python"); - return NULL; - } - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "O!:remove_poll", kwlist, - &PyGPollFD_Type, &fd)) - return NULL; - - CHECK_DESTROYED(self, NULL); - - g_source_remove_poll(self->source, &fd->pollfd); - - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -pyg_source_get_current_time(PyGSource *self) -{ - GTimeVal timeval; - double ret; - - CHECK_DESTROYED(self, NULL); - - g_source_get_current_time(self->source, &timeval); - ret = (double)timeval.tv_sec + (double)timeval.tv_usec * 0.000001; - return PyFloat_FromDouble(ret); -} - -static PyMethodDef pyg_source_methods[] = { - { "attach", (PyCFunction)pyg_source_attach, METH_KEYWORDS }, - { "destroy", (PyCFunction)pyg_source_destroy, METH_NOARGS }, - { "set_callback", (PyCFunction)pyg_source_set_callback, METH_VARARGS }, - { "get_context", (PyCFunction)pyg_source_get_context, METH_NOARGS }, - { "add_poll", (PyCFunction)pyg_source_add_poll, METH_KEYWORDS }, - { "remove_poll", (PyCFunction)pyg_source_remove_poll, METH_KEYWORDS }, - { "get_current_time", (PyCFunction)pyg_source_get_current_time, METH_NOARGS }, - { NULL, NULL, 0 } -}; - -static PyObject * -pyg_source_get_dict(PyGSource *self, void *closure) -{ - if (self->inst_dict == NULL) { - self->inst_dict = PyDict_New(); - if (self->inst_dict == NULL) - return NULL; - } - - Py_INCREF(self->inst_dict); - return self->inst_dict; -} - -static PyObject * -pyg_source_get_priority(PyGSource *self, void *closure) -{ - CHECK_DESTROYED(self, NULL); - - return PyInt_FromLong(g_source_get_priority(self->source)); -} - -static int -pyg_source_set_priority(PyGSource *self, PyObject *value, void *closure) -{ - CHECK_DESTROYED(self, -1); - - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, "cannot delete priority"); - return -1; - } - - if (!PyInt_Check(value)) { - PyErr_SetString(PyExc_TypeError, "type mismatch"); - return -1; - } - - g_source_set_priority(self->source, PyInt_AsLong(value)); - - return 0; -} - -static PyObject * -pyg_source_get_can_recurse(PyGSource *self, void *closure) -{ - CHECK_DESTROYED(self, NULL); - - return PyBool_FromLong(g_source_get_can_recurse(self->source)); -} - -static int -pyg_source_set_can_recurse(PyGSource *self, PyObject *value, void *closure) -{ - CHECK_DESTROYED(self, -1); - - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, "cannot delete can_recurse"); - return -1; - } - - g_source_set_can_recurse(self->source, PyObject_IsTrue(value)); - - return 0; -} - -static PyObject * -pyg_source_get_id(PyGSource *self, void *closure) -{ - CHECK_DESTROYED(self, NULL); - - if (g_source_get_context(self->source) == NULL) { - PyErr_SetString(PyExc_RuntimeError, "source is not attached"); - return NULL; - } - - return PyInt_FromLong(g_source_get_id(self->source)); -} - -static PyGetSetDef pyg_source_getsets[] = { - { "__dict__", (getter)pyg_source_get_dict, (setter)0 }, - {"priority", (getter)pyg_source_get_priority, (setter)pyg_source_set_priority }, - {"can_recurse", (getter)pyg_source_get_can_recurse, (setter)pyg_source_set_can_recurse }, - {"id", (getter)pyg_source_get_id, (setter)0 }, - {NULL, 0, 0} -}; - -static PyObject * -pyg_source_repr(PyGSource *self) -{ - return source_repr(self, NULL); -} - -static int -pyg_source_traverse(PyGSource *self, visitproc visit, void *arg) -{ - int ret = 0; - - if (self->inst_dict) ret = visit(self->inst_dict, arg); - if (ret != 0) return ret; - - return 0; -} - -static int -pyg_source_clear(PyGSource *self) -{ - PyObject *tmp; - - tmp = self->inst_dict; - self->inst_dict = NULL; - Py_XDECREF(tmp); - - if (self->source) { - g_source_unref(self->source); - self->source = NULL; - } - - return 0; -} - -static void -pyg_source_dealloc(PyGSource *self) -{ - PyObject_ClearWeakRefs((PyObject *)self); - - PyObject_GC_UnTrack((PyObject *)self); - - pyg_source_clear(self); - - PyObject_GC_Del(self); -} - -static gboolean -pyg_source_prepare(GSource *source, gint *timeout) -{ - PyGRealSource *pysource = (PyGRealSource *)source; - PyObject *t; - gboolean ret = FALSE; - gboolean got_err = TRUE; - PyGILState_STATE state; - - state = pyglib_gil_state_ensure(); - - t = PyObject_CallMethod(pysource->obj, "prepare", NULL); - - if (t == NULL) { - goto bail; - } else if (!PyObject_IsTrue(t)) { - got_err = FALSE; - goto bail; - } else if (!PyTuple_Check(t)) { - PyErr_SetString(PyExc_TypeError, - "source prepare function must return a tuple or False"); - goto bail; - } else if (PyTuple_Size(t) != 2) { - PyErr_SetString(PyExc_TypeError, - "source prepare function return tuple must be exactly " - "2 elements long"); - goto bail; - } - - ret = PyObject_IsTrue(PyTuple_GET_ITEM(t, 0)); - *timeout = PyInt_AsLong(PyTuple_GET_ITEM(t, 1)); - - if (*timeout == -1 && PyErr_Occurred()) { - ret = FALSE; - goto bail; - } - - got_err = FALSE; - -bail: - if (got_err) - PyErr_Print(); - - Py_XDECREF(t); - - pyglib_gil_state_release(state); - - return ret; -} - -static gboolean -pyg_source_check(GSource *source) -{ - PyGRealSource *pysource = (PyGRealSource *)source; - PyObject *t; - gboolean ret; - PyGILState_STATE state; - - state = pyglib_gil_state_ensure(); - - t = PyObject_CallMethod(pysource->obj, "check", NULL); - - if (t == NULL) { - PyErr_Print(); - ret = FALSE; - } else { - ret = PyObject_IsTrue(t); - Py_DECREF(t); - } - - pyglib_gil_state_release(state); - - return ret; -} - -static gboolean -pyg_source_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) -{ - PyGRealSource *pysource = (PyGRealSource *)source; - PyObject *func, *args, *tuple, *t; - gboolean ret; - PyGILState_STATE state; - - state = pyglib_gil_state_ensure(); - - if (callback) { - tuple = user_data; - - func = PyTuple_GetItem(tuple, 0); - args = PyTuple_GetItem(tuple, 1); - } else { - func = Py_None; - args = Py_None; - } - - t = PyObject_CallMethod(pysource->obj, "dispatch", "OO", func, args); - - if (t == NULL) { - PyErr_Print(); - ret = FALSE; - } else { - ret = PyObject_IsTrue(t); - Py_DECREF(t); - } - - pyglib_gil_state_release(state); - - return ret; -} - -static void -pyg_source_finalize(GSource *source) -{ - PyGRealSource *pysource = (PyGRealSource *)source; - PyObject *func, *t; - PyGILState_STATE state; - - state = pyglib_gil_state_ensure(); - - func = PyObject_GetAttrString(pysource->obj, "finalize"); - if (func) { - t = PyObject_CallObject(func, NULL); - Py_DECREF(func); - - if (t == NULL) { - PyErr_Print(); - } else { - Py_DECREF(t); - } - } - - pyglib_gil_state_release(state); -} - -static GSourceFuncs pyg_source_funcs = -{ - pyg_source_prepare, - pyg_source_check, - pyg_source_dispatch, - pyg_source_finalize -}; - -static int -pyg_source_init(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - PyGRealSource *pysource; - - self->source = g_source_new(&pyg_source_funcs, sizeof(PyGRealSource)); - - pysource = (PyGRealSource *)self->source; - pysource->obj = (PyObject*)self; - - self->inst_dict = NULL; - self->weakreflist = NULL; - - self->python_source = TRUE; - - return 0; -} - -static void -pyg_source_free(PyObject *op) -{ - PyObject_GC_Del(op); -} - -PyTypeObject PyGSource_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ - "gobject.Source", /* tp_name */ - sizeof(PyGSource), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pyg_source_dealloc, /* tp_dealloc */ - (printfunc)0, /* tp_print */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)0, /* tp_compare */ - (reprfunc)pyg_source_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)0, /* tp_str */ - (getattrofunc)0, /* tp_getattro */ - (setattrofunc)0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | - Py_TPFLAGS_HAVE_GC, /* tp_flags */ - NULL, /* tp_doc */ - (traverseproc)pyg_source_traverse, /* tp_traverse */ - (inquiry)pyg_source_clear, /* tp_clear */ - (richcmpfunc)0, /* tp_richcompare */ - offsetof(PyGSource, weakreflist), /* tp_weaklistoffset */ - (getiterfunc)0, /* tp_iter */ - (iternextfunc)0, /* tp_iternext */ - pyg_source_methods, /* tp_methods */ - 0, /* tp_members */ - pyg_source_getsets, /* tp_getset */ - (PyTypeObject *)0, /* tp_base */ - (PyObject *)0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - offsetof(PyGSource, inst_dict), /* tp_dictoffset */ - (initproc)pyg_source_init, /* tp_init */ - (allocfunc)0, /* tp_alloc */ - (newfunc)0, /* tp_new */ - (freefunc)pyg_source_free, /* tp_free */ - (inquiry)0, /* tp_is_gc */ - (PyObject *)0, /* tp_bases */ -}; - -static PyObject * -pyg_idle_repr(PyGSource *self) -{ - return source_repr(self, "idle"); -} - -static int -pyg_idle_init(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "priority", NULL }; - gint priority = G_PRIORITY_DEFAULT_IDLE; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "|i:gobject.Idle.__init__", kwlist, - &priority)) - return -1; - - self->source = g_idle_source_new (); - - if (priority != G_PRIORITY_DEFAULT_IDLE) - g_source_set_priority(self->source, priority); - - self->inst_dict = NULL; - self->weakreflist = NULL; - - self->python_source = FALSE; - - return 0; -} - -PyTypeObject PyGIdle_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ - "gobject.Idle", /* tp_name */ - sizeof(PyGSource), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)0, /* tp_dealloc */ - (printfunc)0, /* tp_print */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)0, /* tp_compare */ - (reprfunc)pyg_idle_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)0, /* tp_str */ - (getattrofunc)0, /* tp_getattro */ - (setattrofunc)0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - NULL, /* tp_doc */ - (traverseproc)0, /* tp_traverse */ - (inquiry)0, /* tp_clear */ - (richcmpfunc)0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)0, /* tp_iter */ - (iternextfunc)0, /* tp_iternext */ - NULL, /* tp_methods */ - NULL, /* tp_members */ - NULL, /* tp_getset */ - (PyTypeObject *)&PyGSource_Type, /* tp_base */ - (PyObject *)0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pyg_idle_init, /* tp_init */ - (allocfunc)0, /* tp_alloc */ - (newfunc)0, /* tp_new */ - (freefunc)0, /* tp_free */ - (inquiry)0, /* tp_is_gc */ - (PyObject *)0, /* tp_bases */ -}; - -static PyObject * -pyg_timeout_repr(PyGSource *self) -{ - return source_repr(self, "timeout"); -} - -static int -pyg_timeout_init(PyGSource *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "interval", "priority", NULL }; - gint priority = G_PRIORITY_DEFAULT; - guint interval; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "I|i:gobject.Timeout.__init__", kwlist, - &interval, &priority)) - return -1; - - self->source = g_timeout_source_new(interval); - - if (priority != G_PRIORITY_DEFAULT) - g_source_set_priority(self->source, priority); - - self->inst_dict = NULL; - self->weakreflist = NULL; - - self->python_source = FALSE; - - return 0; -} - -PyTypeObject PyGTimeout_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ - "gobject.Timeout", /* tp_name */ - sizeof(PyGSource), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)0, /* tp_dealloc */ - (printfunc)0, /* tp_print */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)0, /* tp_compare */ - (reprfunc)pyg_timeout_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)0, /* tp_str */ - (getattrofunc)0, /* tp_getattro */ - (setattrofunc)0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ - NULL, /* tp_doc */ - (traverseproc)0, /* tp_traverse */ - (inquiry)0, /* tp_clear */ - (richcmpfunc)0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)0, /* tp_iter */ - (iternextfunc)0, /* tp_iternext */ - NULL, /* tp_methods */ - NULL, /* tp_members */ - NULL, /* tp_getset */ - (PyTypeObject *)&PyGSource_Type, /* tp_base */ - (PyObject *)0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pyg_timeout_init, /* tp_init */ - (allocfunc)0, /* tp_alloc */ - (newfunc)0, /* tp_new */ - (freefunc)0, /* tp_free */ - (inquiry)0, /* tp_is_gc */ - (PyObject *)0, /* tp_bases */ -}; - -static PyMemberDef pyg_poll_fd_members[] = { - { "fd", T_INT, offsetof(PyGPollFD, pollfd.fd), RO }, - { "events", T_USHORT, offsetof(PyGPollFD, pollfd.events), RO }, - { "revents", T_USHORT, offsetof(PyGPollFD, pollfd.revents), RO }, - { NULL, 0, 0, 0 } -}; - -static void -pyg_poll_fd_dealloc(PyGPollFD *self) -{ - Py_XDECREF(self->fd_obj); - PyObject_DEL(self); -} - -static PyObject * -pyg_poll_fd_repr(PyGPollFD *self) -{ - return PyString_FromFormat("<GPollFD %d (%d) at 0x%lx>", - self->pollfd.fd, self->pollfd.events, - (long)self); -} - -static int -pyg_poll_fd_init(PyGPollFD *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = { "fd", "events", NULL }; - PyObject *o; - gint fd; - gushort events; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, - "OH:gobject.PollFD.__init__", kwlist, - &o, &events)) - return -1; - - fd = PyObject_AsFileDescriptor(o); - if (fd == -1) - return -1; - - self->pollfd.fd = fd; - self->pollfd.events = events; - self->pollfd.revents = 0; - - Py_INCREF(o); - self->fd_obj = o; - - return 0; -} - -PyTypeObject PyGPollFD_Type = { - PyObject_HEAD_INIT(NULL) - 0, /* ob_size */ - "gobject.PollFD", /* tp_name */ - sizeof(PyGPollFD), /* tp_basicsize */ - 0, /* tp_itemsize */ - (destructor)pyg_poll_fd_dealloc, /* tp_dealloc */ - (printfunc)0, /* tp_print */ - (getattrfunc)0, /* tp_getattr */ - (setattrfunc)0, /* tp_setattr */ - (cmpfunc)0, /* tp_compare */ - (reprfunc)pyg_poll_fd_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)0, /* tp_hash */ - (ternaryfunc)0, /* tp_call */ - (reprfunc)0, /* tp_str */ - (getattrofunc)0, /* tp_getattro */ - (setattrofunc)0, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT, /* tp_flags */ - NULL, /* tp_doc */ - (traverseproc)0, /* tp_traverse */ - (inquiry)0, /* tp_clear */ - (richcmpfunc)0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - (getiterfunc)0, /* tp_iter */ - (iternextfunc)0, /* tp_iternext */ - 0, /* tp_methods */ - pyg_poll_fd_members, /* tp_members */ - 0, /* tp_getset */ - (PyTypeObject *)0, /* tp_base */ - (PyObject *)0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)pyg_poll_fd_init, /* tp_init */ - (allocfunc)0, /* tp_alloc */ - (newfunc)0, /* tp_new */ - (freefunc)0, /* tp_free */ - (inquiry)0, /* tp_is_gc */ - (PyObject *)0, /* tp_bases */ -}; |