summaryrefslogtreecommitdiffstats
path: root/gobject
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-07-21 17:27:22 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-07-21 17:27:22 +0000
commitbf49647a03923975eb24ce634dae8254553db8de (patch)
treefac72b5b605789d7fa566332bd6a986b148a1ca5 /gobject
parent39cf2d9ca4fc9b50984ec172282d33b1843fceee (diff)
downloadpygobject-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')
-rw-r--r--gobject/Makefile.am2
-rw-r--r--gobject/__init__.py4
-rw-r--r--gobject/gobjectmodule.c10
-rw-r--r--gobject/pygiochannel.c812
-rw-r--r--gobject/pygobject-private.h29
-rw-r--r--gobject/pygsource.c847
6 files changed, 12 insertions, 1692 deletions
diff --git a/gobject/Makefile.am b/gobject/Makefile.am
index dfd0f50..74c2e4c 100644
--- a/gobject/Makefile.am
+++ b/gobject/Makefile.am
@@ -53,8 +53,6 @@ _gobject_la_SOURCES = \
pygobject-private.h \
pygparamspec.c \
pygpointer.c \
- pygiochannel.c \
- pygsource.c \
pygtype.c \
pygoptioncontext.c \
pygoptiongroup.c
diff --git a/gobject/__init__.py b/gobject/__init__.py
index 19bdd0c..eba3eaf 100644
--- a/gobject/__init__.py
+++ b/gobject/__init__.py
@@ -32,7 +32,9 @@ from glib import spawn_async, idle_add, timeout_add, timeout_add_seconds, \
get_current_time, filename_display_name, filename_display_basename, \
filename_from_utf8, get_application_name, set_application_name, \
get_prgname, set_prgname, main_depth, Pid, GError, glib_version, \
- MainLoop, MainContext, main_context_default
+ MainLoop, MainContext, main_context_default, IOChannel, Source, Idle, \
+ Timeout, PollFD
+
from gobject.constants import *
from _gobject import *
_PyGObject_API = _gobject._PyGObject_API
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
index 5af2c38..a5bf3aa 100644
--- a/gobject/gobjectmodule.c
+++ b/gobject/gobjectmodule.c
@@ -79,6 +79,8 @@ pyg_set_thread_block_funcs (PyGThreadBlockFunc block_threads_func,
pygobject_api_functions.block_threads = block_threads_func;
pygobject_api_functions.unblock_threads = unblock_threads_func;
+ pyglib_set_thread_block_funcs(block_threads_func,
+ unblock_threads_func);
}
static void
@@ -2753,13 +2755,6 @@ init_gobject(void)
PyGFlags_Type.tp_base = &PyInt_Type;
REGISTER_GTYPE(d, PyGFlags_Type, "GFlags", G_TYPE_FLAGS);
- REGISTER_TYPE(d, PyGIOChannel_Type, "IOChannel");
-
- REGISTER_TYPE(d, PyGSource_Type, "Source");
- REGISTER_TYPE(d, PyGIdle_Type, "Idle");
- REGISTER_TYPE(d, PyGTimeout_Type, "Timeout");
- REGISTER_TYPE(d, PyGPollFD_Type, "PollFD");
-
PyType_Ready(&PyGObjectWeakRef_Type);
PyDict_SetItemString(d, "GObjectWeakRef", (PyObject *) &PyGObjectWeakRef_Type);
@@ -2781,7 +2776,6 @@ init_gobject(void)
o=PyCObject_FromVoidPtr(&pygobject_api_functions,NULL));
Py_DECREF(o);
-
/* features */
features = PyDict_New();
#ifdef HAVE_FFI_H
diff --git a/gobject/pygiochannel.c b/gobject/pygiochannel.c
deleted file mode 100644
index 34ef837..0000000
--- a/gobject/pygiochannel.c
+++ /dev/null
@@ -1,812 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4 -*- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <pyglib.h>
-#include "pygobject-private.h"
-#include "pythread.h"
-#include <structmember.h> /* for PyMemberDef */
-
-
-typedef struct {
- PyObject_HEAD
- GIOChannel *channel;
- int softspace; /* to make print >> chan, "foo" ... work */
-} PyGIOChannel;
-
-static PyObject*
-py_io_channel_next(PyGIOChannel *self)
-{
- PyObject* ret_obj = NULL;
- gsize length = 0, terminator_pos;
- gchar *str_return = NULL;
- GError *error = NULL;
- GIOStatus status;
-
- status = g_io_channel_read_line(self->channel, &str_return, &length,
- &terminator_pos, &error);
- if (pyg_error_check(&error))
- return NULL;
-
- if (status == G_IO_STATUS_EOF) {
- PyErr_SetString(PyExc_StopIteration, "EOF");
- return NULL;
- }
-
- ret_obj = PyString_FromStringAndSize(str_return, length);
- g_free(str_return);
- return ret_obj;
-
-}
-
-static int
-py_io_channel_compare(PyGIOChannel *self, PyGIOChannel *v)
-{
- if (self->channel == v->channel) return 0;
- if (self->channel > v->channel) return -1;
- return 1;
-}
-
-static PyObject*
-py_io_channel_get_iter(PyObject *self)
-{
- Py_INCREF(self);
- return self;
-}
-
-static long
-py_io_channel_hash(PyGIOChannel *self)
-{
- return (long) self->channel;
-}
-
-static void
-py_io_channel_dealloc(PyGIOChannel *self)
-{
- if (self->channel)
- g_io_channel_unref(self->channel);
- PyObject_DEL(self);
-}
-
-static PyObject*
-py_io_channel_shutdown(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "flush", NULL };
- GIOStatus ret;
- PyObject* flush = Py_True;
- GError* error = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:gobject.IOChannel.shutdown", kwlist, &flush))
- return NULL;
-
- ret = g_io_channel_shutdown(self->channel, PyObject_IsTrue(flush), &error);
- if (pyg_error_check(&error))
- return NULL;
-
- return PyInt_FromLong(ret);
-}
-
-/* character encoding conversion involved functions.
- */
-
-static PyObject*
-py_io_channel_set_buffer_size(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "size", NULL };
- int size;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:gobject.IOChannel.set_buffer_size", kwlist, &size))
- return NULL;
-
- g_io_channel_set_buffer_size(self->channel, size);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject*
-py_io_channel_get_buffer_size(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- int size;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:gobject.IOChannel.get_buffer_size", kwlist))
- return NULL;
-
- size = g_io_channel_get_buffer_size(self->channel);
-
- return PyInt_FromLong(size);
-}
-
-static PyObject*
-py_io_channel_set_buffered(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "buffered", NULL };
- int buffered;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:gobject.IOChannel.set_buffered", kwlist, &buffered))
- return NULL;
-
- g_io_channel_set_buffered(self->channel, buffered);
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject*
-py_io_channel_get_buffered(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- int buffered;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":gobject.IOChannel.get_buffered", kwlist))
- return NULL;
-
- buffered = g_io_channel_get_buffered(self->channel);
-
- return PyInt_FromLong(buffered);
-}
-
-static PyObject*
-py_io_channel_set_encoding(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "encoding", NULL };
- const char* encoding;
- GError* error = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "z:gobject.IOChannel.set_encoding", kwlist, &encoding))
- return NULL;
-
- g_io_channel_set_encoding(self->channel, encoding, &error);
- if (pyg_error_check(&error))
- return NULL;
-
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject*
-py_io_channel_get_encoding(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- const char* encoding;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":gobject.IOChannel.get_encoding", kwlist))
- return NULL;
-
- encoding = g_io_channel_get_encoding(self->channel);
-
- if (encoding == NULL) {
- Py_INCREF(Py_None);
- return Py_None;
- }
-
- return PyString_FromString(encoding);
-}
-
-#define CHUNK_SIZE (8 * 1024)
-
-static PyObject*
-py_io_channel_read_chars(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "max_count", NULL };
- int max_count = -1;
- PyObject* ret_obj = NULL;
- gsize total_read = 0;
- GError* error = NULL;
- GIOStatus status = G_IO_STATUS_NORMAL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:gobject.IOChannel.read", kwlist, &max_count))
- return NULL;
-
- if (max_count == 0)
- return PyString_FromString("");
-
- while (status == G_IO_STATUS_NORMAL
- && (max_count == -1 || total_read < max_count)) {
- gsize single_read;
- char* buf;
- gsize buf_size;
-
- if (max_count == -1)
- buf_size = CHUNK_SIZE;
- else {
- buf_size = max_count - total_read;
- if (buf_size > CHUNK_SIZE)
- buf_size = CHUNK_SIZE;
- }
-
- if ( ret_obj == NULL ) {
- ret_obj = PyString_FromStringAndSize((char *)NULL, buf_size);
- if (ret_obj == NULL)
- goto failure;
- }
- else if (buf_size + total_read > PyString_GET_SIZE(ret_obj)) {
- if (_PyString_Resize(&ret_obj, buf_size + total_read) == -1)
- goto failure;
- }
-
- buf = PyString_AS_STRING(ret_obj) + total_read;
-
- pyg_unblock_threads();
- status = g_io_channel_read_chars(self->channel, buf, buf_size,
- &single_read, &error);
- pyg_block_threads();
- if (pyg_error_check(&error))
- goto failure;
-
- total_read += single_read;
- }
-
- if ( total_read != PyString_GET_SIZE(ret_obj) ) {
- if (_PyString_Resize(&ret_obj, total_read) == -1)
- goto failure;
- }
- return ret_obj;
-
- failure:
- Py_XDECREF(ret_obj);
- return NULL;
-}
-
-static PyObject*
-py_io_channel_write_chars(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "buf", NULL };
- const char* buf;
- Py_ssize_t buf_len;
- gsize count;
- GError* error = NULL;
- GIOStatus status;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#:gobject.IOChannel.write",
- kwlist, &buf, &buf_len))
- return NULL;
-
- pyg_unblock_threads();
- status = g_io_channel_write_chars(self->channel, buf, buf_len, &count, &error);
- pyg_block_threads();
- if (pyg_error_check(&error))
- return NULL;
-
- return PyInt_FromLong(count);
-}
-
-static PyObject*
-py_io_channel_write_lines(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "lines", NULL };
- char *buf;
- Py_ssize_t buf_len;
- gsize count;
- GError* error = NULL;
- GIOStatus status;
- PyObject *iter, *value, *pylines;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:gobject.IOChannel.writelines",
- kwlist, &pylines))
- return NULL;
-
- iter = PyObject_GetIter(pylines);
-
- while (1) {
- value = PyIter_Next(iter);
- if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
- PyErr_Clear();
- goto normal_exit;
- }
- if (!PyString_Check(value)) {
- PyErr_SetString(PyExc_TypeError, "gobject.IOChannel.writelines must"
- " be sequence/iterator of strings");
- Py_DECREF(iter);
- return NULL;
- }
- PyString_AsStringAndSize(value, &buf, &buf_len);
- pyg_unblock_threads();
- status = g_io_channel_write_chars(self->channel, buf, buf_len, &count, &error);
- pyg_unblock_threads();
- Py_DECREF(value);
- if (pyg_error_check(&error)) {
- Py_DECREF(iter);
- return NULL;
- }
- }
-normal_exit:
- Py_DECREF(iter);
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject*
-py_io_channel_flush(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- GError* error = NULL;
- GIOStatus status;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":gobject.IOChannel.flush",
- kwlist))
- return NULL;
-
- pyg_unblock_threads();
- status = g_io_channel_flush(self->channel, &error);
- pyg_block_threads();
- if (pyg_error_check(&error))
- return NULL;
-
- return PyInt_FromLong(status);
-}
-
-static PyObject*
-py_io_channel_set_flags(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "flags", NULL };
- GIOFlags flags;
- GIOStatus status;
- GError* error = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i:gobject.IOChannel.set_flags",
- kwlist, &flags))
- return NULL;
-
- status = g_io_channel_set_flags(self->channel, flags, &error);
- if (pyg_error_check(&error))
- return NULL;
-
- return PyInt_FromLong(status);
-}
-
-static PyObject*
-py_io_channel_get_flags(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- GIOFlags flags;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":gobject.IOChannel.get_flags",
- kwlist))
- return NULL;
-
- flags = g_io_channel_get_flags(self->channel);
- return PyInt_FromLong(flags);
-}
-
-static PyObject*
-py_io_channel_get_buffer_condition(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { NULL };
- GIOCondition cond;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, ":gobject.IOChannel.get_buffer_condition",
- kwlist))
- return NULL;
-
- cond = g_io_channel_get_buffer_condition(self->channel);
- return PyInt_FromLong(cond);
-}
-
-static PyObject*
-py_io_channel_set_close_on_unref(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "do_close", NULL };
- PyObject *do_close;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O:gobject.IOChannel.set_close_on_unref",
- kwlist, &do_close))
- return NULL;
-
- g_io_channel_set_close_on_unref(self->channel, PyObject_IsTrue(do_close));
- Py_INCREF(Py_None);
- return Py_None;
-}
-
-static PyObject*
-py_io_channel_get_close_on_unref(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- if (g_io_channel_get_close_on_unref(self->channel)) {
- Py_INCREF(Py_True);
- return Py_True;
- } else {
- Py_INCREF(Py_False);
- return Py_False;
- }
-}
-
-typedef struct {
- PyObject *callback;
- PyObject *iochannel;
- PyObject *user_data;
-} PyGIOWatchData;
-
-static void
-pyg_iowatch_data_free(PyGIOWatchData *data)
-{
- Py_DECREF(data->callback);
- Py_XDECREF(data->user_data);
- Py_DECREF(data->iochannel);
- g_free(data);
-}
-
-static gboolean
-pyg_iowatch_marshal(GIOChannel *source,
- GIOCondition condition,
- gpointer user_data)
-{
- PyObject *ret;
- gboolean res;
- PyGIOWatchData *data = (PyGIOWatchData *) user_data;
- PyGILState_STATE state;
-
- g_return_val_if_fail(user_data != NULL, FALSE);
- g_return_val_if_fail(((PyGIOChannel *) data->iochannel)->channel == source,
- FALSE);
-
- state = pyglib_gil_state_ensure();
-
- if (data->user_data)
- ret = PyObject_CallFunction(data->callback, "OiO", data->iochannel,
- condition, data->user_data);
- else
- ret = PyObject_CallFunction(data->callback, "Oi", data->iochannel,
- condition);
-
- if (!ret) {
- PyErr_Print();
- res = FALSE;
- } else {
- res = PyObject_IsTrue(ret);
- Py_DECREF(ret);
- }
- pyglib_gil_state_release(state);
-
- return res;
-}
-
-
-
-static PyObject *
-py_io_channel_add_watch(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "condition", "callback", "user_data", "priority", NULL };
- PyObject *callback, *user_data = NULL;
- int priority = G_PRIORITY_DEFAULT, condition;
- GIOChannel *iochannel = NULL;
- guint handler_id;
- PyGIOWatchData *data;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,
- "iO|Oi:gobject.IOChannel.add_watch",
- kwlist, &condition, &callback,
- &user_data, &priority))
- return NULL;
-
- iochannel = ((PyGIOChannel *) self)->channel;
-
- if (!PyCallable_Check(callback)) {
- PyErr_SetString(PyExc_TypeError, "second must be callable");
- return NULL;
- }
-
- data = g_new(PyGIOWatchData, 1);
- data->callback = callback; Py_INCREF(callback);
- data->user_data = user_data; Py_XINCREF(user_data);
- data->iochannel = self; Py_INCREF(self);
-
- handler_id = g_io_add_watch_full(((PyGIOChannel *) self)->channel,
- priority, condition,
- pyg_iowatch_marshal, data,
- (GDestroyNotify) pyg_iowatch_data_free);
- return PyLong_FromUnsignedLong(handler_id);
-}
-
-
-#ifdef G_OS_WIN32
-
-static PyObject *
-py_io_channel_win32_poll(PyObject *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "fds", "timeout", NULL };
- GPollFD *pollfd;
- PyObject *pyfds, *pyfd;
- guint len, i;
- gint timeout = -1;
- gint result;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs,
- "O!|i:gobject.IOChannel.win32_poll",
- kwlist, &PyList_Type, &pyfds, &timeout))
- return NULL;
-
- len = PyList_Size(pyfds);
- pollfd = g_newa(GPollFD, len);
- for (i = 0; i < len; ++i) {
- pyfd = PyList_GET_ITEM(pyfds, i);
- 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);
- for (i = 0; i < len; ++i) {
- pyfd = PyList_GET_ITEM(pyfds, i);
- ((PyGPollFD *) pyfd)->pollfd = pollfd[i];
- }
- return PyInt_FromLong(result);
-}
-
-static PyObject *
-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",
- kwlist, &condition))
- return NULL;
-
- g_io_channel_win32_make_pollfd(((PyGIOChannel *) self)->channel,
- condition, &pollfd);
- pypollfd = PyObject_NEW(PyGPollFD, &PyGPollFD_Type);
- pypollfd->pollfd = pollfd;
- return (PyObject *) pypollfd;
-}
-#endif /* def G_OS_WIN32 */
-
-
-static PyObject*
-py_io_channel_read_line(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "size", NULL };
- PyObject* ret_obj = NULL;
- gsize length = 0, terminator_pos;
- gchar *str_return = NULL;
- GError *error = NULL;
- gint size_hint = -1;
- GIOStatus status;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:gobject.IOChannel.readline", kwlist,
- &size_hint))
- return NULL;
-
- status = g_io_channel_read_line(self->channel, &str_return, &length,
- &terminator_pos, &error);
- if (pyg_error_check(&error))
- return NULL;
- ret_obj = PyString_FromStringAndSize(str_return, length);
- g_free(str_return);
- return ret_obj;
-}
-
-static PyObject*
-py_io_channel_read_lines(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "size", NULL };
- PyObject *line = NULL;
- gsize length = 0, terminator_pos;
- gchar *str_return = NULL;
- GError *error = NULL;
- gint size_hint = -1;
- GIOStatus status = G_IO_STATUS_NORMAL;
- PyObject *list;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i:gobject.IOChannel.readlines", kwlist,
- &size_hint))
- return NULL;
-
- list = PyList_New(0);
- while (status == G_IO_STATUS_NORMAL) {
- status = g_io_channel_read_line(self->channel, &str_return, &length,
- &terminator_pos, &error);
- if (pyg_error_check(&error)) {
- Py_DECREF(line);
- return NULL;
- }
- line = PyString_FromStringAndSize(str_return, length);
- g_free(str_return);
- if (PyList_Append(list, line)) {
- Py_DECREF(line);
- Py_DECREF(list);
- return NULL;
- }
- }
- return list;
-}
-
-
-static PyObject*
-py_io_channel_seek(PyGIOChannel* self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "offset", "whence", NULL };
- gint64 offset;
- int whence = 0;
- GIOStatus status;
- GSeekType seek_type;
- GError* error = NULL;
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "L|i:gobject.IOChannel.seek",
- kwlist, &offset, &whence))
- return NULL;
-
- switch (whence)
- {
- case 0: seek_type = G_SEEK_SET; break;
- case 1: seek_type = G_SEEK_CUR; break;
- case 2: seek_type = G_SEEK_END; break;
- default:
- PyErr_SetString(PyExc_ValueError, "invalid 'whence' value");
- return NULL;
- }
-
- status = g_io_channel_seek_position(self->channel, offset,
- seek_type, &error);
- if (pyg_error_check(&error))
- return NULL;
-
- return PyInt_FromLong(status);
-}
-
-#if 0 // Not wrapped
-void g_io_channel_set_line_term (GIOChannel *channel,
- const gchar *line_term,
- gint length);
-
-G_CONST_RETURN gchar* g_io_channel_get_line_term (GIOChannel *channel,
- gint *length);
-
-
-
-GIOStatus g_io_channel_read_line_string (GIOChannel *channel,
- GString *buffer,
- gsize *terminator_pos,
- GError **error);
-GIOStatus g_io_channel_read_to_end (GIOChannel *channel,
- gchar **str_return,
- gsize *length,
- GError **error);
-GIOStatus g_io_channel_read_unichar (GIOChannel *channel,
- gunichar *thechar,
- GError **error);
-GIOStatus g_io_channel_write_unichar (GIOChannel *channel,
- gunichar thechar,
- GError **error);
-#endif // Not wrapped
-
-static PyMemberDef py_io_channel_members[] = {
- { "softspace", T_INT, offsetof(PyGIOChannel, softspace), 0, NULL },
- { NULL, 0, 0, 0, NULL }
-};
-
-static PyMethodDef py_io_channel_methods[] = {
- { "close", (PyCFunction)py_io_channel_shutdown, METH_KEYWORDS },
- { "flush", (PyCFunction)py_io_channel_flush, METH_KEYWORDS },
- { "set_encoding", (PyCFunction)py_io_channel_set_encoding, METH_KEYWORDS },
- { "get_encoding", (PyCFunction)py_io_channel_get_encoding, METH_KEYWORDS },
- { "set_buffered", (PyCFunction)py_io_channel_set_buffered, METH_KEYWORDS },
- { "get_buffered", (PyCFunction)py_io_channel_get_buffered, METH_KEYWORDS },
- { "set_buffer_size", (PyCFunction)py_io_channel_set_buffer_size, METH_KEYWORDS },
- { "get_buffer_size", (PyCFunction)py_io_channel_get_buffer_size, METH_KEYWORDS },
- { "read", (PyCFunction)py_io_channel_read_chars, METH_KEYWORDS },
- { "readline", (PyCFunction)py_io_channel_read_line, METH_KEYWORDS },
- { "readlines", (PyCFunction)py_io_channel_read_lines, METH_KEYWORDS },
- { "write", (PyCFunction)py_io_channel_write_chars, METH_KEYWORDS },
- { "writelines", (PyCFunction)py_io_channel_write_lines, METH_KEYWORDS },
- { "set_flags", (PyCFunction)py_io_channel_set_flags, METH_KEYWORDS },
- { "get_flags", (PyCFunction)py_io_channel_get_flags, METH_KEYWORDS },
- { "get_buffer_condition", (PyCFunction)py_io_channel_get_buffer_condition, METH_KEYWORDS },
- { "set_close_on_unref", (PyCFunction)py_io_channel_set_close_on_unref, METH_NOARGS },
- { "get_close_on_unref", (PyCFunction)py_io_channel_get_close_on_unref, METH_KEYWORDS },
- { "add_watch", (PyCFunction)py_io_channel_add_watch, METH_KEYWORDS },
- { "seek", (PyCFunction)py_io_channel_seek, METH_KEYWORDS },
-#ifdef G_OS_WIN32
- { "win32_make_pollfd", (PyCFunction)py_io_channel_win32_make_pollfd, METH_KEYWORDS },
- { "win32_poll", (PyCFunction)py_io_channel_win32_poll, METH_KEYWORDS|METH_STATIC },
-#endif
- { NULL, NULL, 0 }
-};
-
-
-static int
-py_io_channel_init(PyGIOChannel *self, PyObject *args, PyObject *kwargs)
-{
- static char *kwlist[] = { "filedes", "filename", "mode",
-#ifdef G_OS_WIN32
- "hwnd",
-#endif
- NULL };
- int fd = -1;
- char *mode = "r", *filename = NULL;
- GError *error = NULL;
-#ifdef G_OS_WIN32
- guint hwnd = 0;
-#endif
-
- if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|iss"
-#ifdef G_OS_WIN32
- "I"
-#endif
- ":gobject.IOChannel.__init__",
- kwlist, &fd, &filename, &mode
-#ifdef G_OS_WIN32
- , &hwnd
-#endif
- ))
- return -1;
-
- if (fd != -1)
- self->channel = g_io_channel_unix_new(fd);
- else if (filename != NULL) {
- self->channel = g_io_channel_new_file(filename, mode, &error);
- if (pyg_error_check(&error))
- return -1;
- }
-#ifdef G_OS_WIN32
- else if (hwnd != 0) {
- self->channel = g_io_channel_win32_new_messages(hwnd);
- }
-#endif
- else {
-#ifdef G_OS_WIN32
- PyErr_SetString(PyExc_TypeError, "either a valid file descriptor, "
- "file name, or window handle must be supplied");
-#else
- PyErr_SetString(PyExc_TypeError, "either a valid file descriptor "
- "or file name must be supplied");
-#endif
- return -1;
- }
- return 0;
-}
-
-
-PyTypeObject PyGIOChannel_Type = {
- PyObject_HEAD_INIT(NULL)
- 0, /* ob_size */
- "gobject.IOChannel", /* tp_name */
- sizeof(PyGIOChannel), /* tp_basicsize */
- 0, /* tp_itemsize */
- /* methods */
- (destructor)py_io_channel_dealloc, /* tp_dealloc */
- (printfunc)0, /* tp_print */
- (getattrfunc)NULL, /* tp_getattr */
- (setattrfunc)0, /* tp_setattr */
- (cmpfunc)py_io_channel_compare, /* tp_compare */
- (reprfunc)0, /* tp_repr */
- 0, /* tp_as_number */
- 0, /* tp_as_sequence */
- 0, /* tp_as_mapping */
- (hashfunc)py_io_channel_hash, /* 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, /* Documentation string */
- (traverseproc)0, /* tp_traverse */
- (inquiry)0, /* tp_clear */
- (richcmpfunc)0, /* tp_richcompare */
- 0, /* tp_weaklistoffset */
- (getiterfunc)py_io_channel_get_iter,/* tp_iter */
- (iternextfunc)py_io_channel_next, /* tp_iternext */
- py_io_channel_methods, /* tp_methods */
- py_io_channel_members, /* tp_members */
- NULL, /* tp_getset */
- (PyTypeObject *)0, /* tp_base */
- (PyObject *)0, /* tp_dict */
- 0, /* tp_descr_get */
- 0, /* tp_descr_set */
- 0, /* tp_dictoffset */
- (initproc)py_io_channel_init, /* tp_init */
- (allocfunc)0, /* tp_alloc */
- (newfunc)0, /* tp_new */
- 0, /* tp_free */
- (inquiry)0, /* tp_is_gc */
- (PyObject *)0, /* tp_bases */
-};
-
diff --git a/gobject/pygobject-private.h b/gobject/pygobject-private.h
index 5b71ed5..1b2255b 100644
--- a/gobject/pygobject-private.h
+++ b/gobject/pygobject-private.h
@@ -145,6 +145,13 @@ extern PyTypeObject PyGInterface_Type;
extern PyTypeObject PyGProps_Type;
extern PyTypeObject PyGPropsDescr_Type;
extern PyTypeObject PyGPropsIter_Type;
+
+ /* Data that belongs to the GObject instance, not the Python wrapper */
+struct _PyGObjectData {
+ PyTypeObject *type; /* wrapper type for this instance */
+ GSList *closures;
+};
+
void pygobject_register_class (PyObject *dict,
const gchar *type_name,
GType gtype, PyTypeObject *type,
@@ -236,28 +243,6 @@ PyTypeObject *_PyGMainContext_Type;
extern PyTypeObject PyGParamSpec_Type;
PyObject * pyg_param_spec_new (GParamSpec *pspec);
-/* pygiochannel.c */
-extern PyTypeObject PyGIOChannel_Type;
-
-/* pygsource.c */
-extern PyTypeObject PyGSource_Type;
-extern PyTypeObject PyGIdle_Type;
-extern PyTypeObject PyGTimeout_Type;
-extern PyTypeObject PyGPollFD_Type;
-
-typedef struct
-{
- PyObject_HEAD
- GPollFD pollfd;
- PyObject *fd_obj;
-} PyGPollFD;
-
- /* Data that belongs to the GObject instance, not the Python wrapper */
-struct _PyGObjectData {
- PyTypeObject *type; /* wrapper type for this instance */
- GSList *closures;
-};
-
/* pygoption.c */
extern PyTypeObject PyGOptionContext_Type;
extern PyTypeObject PyGOptionGroup_Type;
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 */
-};