summaryrefslogtreecommitdiff
path: root/gtk/pygtktreemodel.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/pygtktreemodel.c')
-rw-r--r--gtk/pygtktreemodel.c803
1 files changed, 0 insertions, 803 deletions
diff --git a/gtk/pygtktreemodel.c b/gtk/pygtktreemodel.c
deleted file mode 100644
index a3f85805..00000000
--- a/gtk/pygtktreemodel.c
+++ /dev/null
@@ -1,803 +0,0 @@
-/* -*- Mode: C; c-basic-offset: 4 -*-
- * pygtk- Python bindings for the GTK toolkit.
- * Copyright (C) 1998-2003 James Henstridge
- *
- * pygtktreemodel.c: stub class to help implement tree models.
- *
- * 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 "pygtktreemodel.h"
-#include <Python.h>
-#include "pygtk-private.h"
-
-/* define this to print out debug messages */
-#undef DEBUG_TREE_MODEL
-
-#ifndef _
-# define _(s) (s)
-#endif
-
-#define VALID_ITER(iter, tree_model) \
- (iter != NULL && iter->stamp == PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp)
-
-enum {
- PROP_LEAK_REFERENCES = 1
-};
-
-static void pygtk_generic_tree_model_class_init(PyGtkGenericTreeModelClass *klass);
-static void pygtk_generic_tree_model_init(PyGtkGenericTreeModel *self);
-static void pygtk_generic_tree_model_iface_init(GtkTreeModelIface *iface);
-static void pygtk_generic_tree_model_set_property (GObject *object,
- guint property_id,
- const GValue *value,
- GParamSpec *pspec);
-static void pygtk_generic_tree_model_get_property (GObject *object,
- guint property_id,
- GValue *value,
- GParamSpec *pspec);
-
-
-GType
-pygtk_generic_tree_model_get_type(void)
-{
- static GType object_type = 0;
-
- if (!object_type) {
- static const GTypeInfo object_info = {
- sizeof(PyGtkGenericTreeModelClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) pygtk_generic_tree_model_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(PyGtkGenericTreeModel),
- 0, /* n_preallocs */
- (GInstanceInitFunc) pygtk_generic_tree_model_init,
- };
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) pygtk_generic_tree_model_iface_init,
- NULL,
- NULL,
- };
-
- object_type = g_type_register_static(G_TYPE_OBJECT,
- "PyGtkGenericTreeModel",
- &object_info, 0);
- g_type_add_interface_static(object_type,
- GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
- return object_type;
-}
-
-static void
-pygtk_generic_tree_model_class_init(PyGtkGenericTreeModelClass *klass)
-{
- GObjectClass *object_class = (GObjectClass*) klass;
-
- object_class->get_property = pygtk_generic_tree_model_get_property;
- object_class->set_property = pygtk_generic_tree_model_set_property;
-
- g_object_class_install_property (object_class,
- PROP_LEAK_REFERENCES,
- g_param_spec_boolean ("leak_references",
- _("Leak references"),
- _("Enable referencing iterator "
- "objects (this will cause a memory leak or at least a reference "
- "counting leak). You might need it though, if you return newly "
- "created objects."),
- TRUE,
- G_PARAM_READWRITE));
-}
-
-static guint pygtk_generic_tree_model_get_flags(GtkTreeModel *tree_model);
-static gint pygtk_generic_tree_model_get_n_columns(GtkTreeModel *tree_model);
-static GType pygtk_generic_tree_model_get_column_type(GtkTreeModel *tree_model,
- gint index);
-static gboolean pygtk_generic_tree_model_get_iter(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreePath *path);
-static GtkTreePath *pygtk_generic_tree_model_get_path(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static void pygtk_generic_tree_model_get_value(GtkTreeModel*tree_model,
- GtkTreeIter *iter,
- gint column, GValue *value);
-static gboolean pygtk_generic_tree_model_iter_next(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean pygtk_generic_tree_model_iter_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent);
-static gboolean pygtk_generic_tree_model_iter_has_child(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gint pygtk_generic_tree_model_iter_n_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static gboolean pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent,
- gint n);
-static gboolean pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child);
-static void pygtk_generic_tree_model_unref_node(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-static void pygtk_generic_tree_model_ref_node(GtkTreeModel *tree_model,
- GtkTreeIter *iter);
-
-static void
-pygtk_generic_tree_model_iface_init(GtkTreeModelIface *iface)
-{
- iface->get_flags = pygtk_generic_tree_model_get_flags;
- iface->get_n_columns = pygtk_generic_tree_model_get_n_columns;
- iface->get_column_type = pygtk_generic_tree_model_get_column_type;
- iface->get_iter = pygtk_generic_tree_model_get_iter;
- iface->get_path = pygtk_generic_tree_model_get_path;
- iface->get_value = pygtk_generic_tree_model_get_value;
- iface->iter_next = pygtk_generic_tree_model_iter_next;
- iface->iter_children = pygtk_generic_tree_model_iter_children;
- iface->iter_has_child = pygtk_generic_tree_model_iter_has_child;
- iface->iter_n_children = pygtk_generic_tree_model_iter_n_children;
- iface->iter_nth_child = pygtk_generic_tree_model_iter_nth_child;
- iface->iter_parent = pygtk_generic_tree_model_iter_parent;
- iface->ref_node = pygtk_generic_tree_model_ref_node;
- iface->unref_node = pygtk_generic_tree_model_unref_node;
-
-}
-
-static void
-pygtk_generic_tree_model_init(PyGtkGenericTreeModel *self)
-{
- self->leak_references = TRUE;
- do {
- self->stamp = g_random_int();
- } while (self->stamp == 0);
-}
-
-static void
-pygtk_generic_tree_model_set_property (GObject *object, guint property_id,
- const GValue *value, GParamSpec *pspec)
-{
- switch (property_id) {
- case PROP_LEAK_REFERENCES:
- PYGTK_GENERIC_TREE_MODEL (object)->leak_references = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
- }
-
-static void
-pygtk_generic_tree_model_get_property (GObject *object, guint property_id,
- GValue *value, GParamSpec *pspec)
-{
- switch (property_id) {
- case PROP_LEAK_REFERENCES:
- g_value_set_boolean (value,
- PYGTK_GENERIC_TREE_MODEL (object)->leak_references);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
- break;
- }
-}
-
-
-PyGtkGenericTreeModel *
-pygtk_generic_tree_model_new(void)
-{
- return PYGTK_GENERIC_TREE_MODEL(
- g_object_new(PYGTK_TYPE_GENERIC_TREE_MODEL, NULL));
-}
-
-
-/* format of GtkTreeIter's for PyGtkGenericTreeModel:
- * user_data == python object
- * user_data2 == floating reference?
- *
- * I haven't worked out how everything should work. For now I will
- * leak references.
- */
-
-#define METHOD_PREFIX "on_"
-
-static guint
-pygtk_generic_tree_model_get_flags(GtkTreeModel *tree_model)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret;
- guint ret = 0;
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), 0);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_flags()");
-#endif
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_flags", "");
- Py_DECREF(self);
- if (py_ret) {
- ret = PyInt_AsLong(py_ret);
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gint
-pygtk_generic_tree_model_get_n_columns(GtkTreeModel *tree_model)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret;
- gint ret = 0;
-
- g_return_val_if_fail(tree_model != NULL, 0);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), 0);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_n_columns()");
-#endif
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_n_columns", "");
- Py_DECREF(self);
- if (py_ret) {
- ret = PyInt_AsLong(py_ret);
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
- pyg_gil_state_release(state);
- return ret;
-}
-
-static GType
-pygtk_generic_tree_model_get_column_type(GtkTreeModel *tree_model, gint index)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret;
- GType ret = G_TYPE_INVALID;
-
- g_return_val_if_fail(tree_model != NULL, G_TYPE_INVALID);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), G_TYPE_INVALID);
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_column_type(%d)", index);
-#endif
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_column_type",
- "(i)", index);
- Py_DECREF(self);
- if (py_ret) {
- ret = pyg_type_from_object(py_ret);
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gboolean
-pygtk_generic_tree_model_get_iter(GtkTreeModel *tree_model,
- GtkTreeIter *iter, GtkTreePath *path)
-{
- PyGILState_STATE state;
- PyObject *self, *py_path, *py_ret;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(path != NULL, FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_iter(%p)", path);
-#endif
- py_path = pygtk_tree_path_to_pyobject(path);
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_iter",
- "(O)", py_path);
- Py_DECREF(self);
- Py_DECREF(py_path);
-
- if (py_ret) {
- if (py_ret != Py_None) {
- iter->user_data = py_ret;
- iter->stamp = PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp;
- if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
- Py_DECREF((PyObject *)iter->user_data);
- }
- ret = TRUE;
- } else {
- iter->user_data = NULL;
- Py_DECREF(py_ret);
- }
- } else {
- PyErr_Print();
- iter->user_data = NULL;
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static GtkTreePath *
-pygtk_generic_tree_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter;
- GtkTreePath *path = NULL;
-
- g_return_val_if_fail(tree_model != NULL, NULL);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), NULL);
- g_return_val_if_fail(VALID_ITER(iter, tree_model), NULL);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_path(%p)", iter);
-#endif
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
-
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_path", "(O)",
- py_iter);
- Py_DECREF(self);
- if (py_ret) {
- path = pygtk_tree_path_from_pyobject(py_ret);
-
- if (!path)
- g_warning("could not convert return value of get_path() to "
- "a GtkTreePath");
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return path;
-}
-
-static void
-pygtk_generic_tree_model_get_value(GtkTreeModel*tree_model, GtkTreeIter *iter,
- gint column, GValue *value)
-{
- PyGILState_STATE state;
- PyObject *self, *py_value, *py_iter;
-
- g_return_if_fail(tree_model != NULL);
- g_return_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model));
- g_return_if_fail(VALID_ITER(iter, tree_model));
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("get_value(%p, %d)", iter, column);
- _PyObject_Dump (iter->user_data);
-#endif
- /* init value to column type */
- g_value_init(value, pygtk_generic_tree_model_get_column_type(tree_model,
- column));
-
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
- py_value = PyObject_CallMethod(self, METHOD_PREFIX "get_value",
- "(Oi)", py_iter,column);
- Py_DECREF(self);
-
- if (py_value) {
- if (py_value != Py_None)
- pyg_value_from_pyobject(value, py_value);
- Py_DECREF(py_value);
- } else {
- PyErr_Print();
- }
- pyg_gil_state_release(state);
-}
-
-static gboolean
-pygtk_generic_tree_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(VALID_ITER(iter, tree_model), FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_next(%p)", iter);
-#endif
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
-
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_next", "(O)",
- py_iter);
- Py_DECREF(self);
- if (py_ret) {
- if (py_ret != Py_None) {
- /* XXXX handle reference counting here */
- iter->user_data = py_ret;
- if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
- Py_DECREF((PyObject *)iter->user_data);
- }
- ret = TRUE;
- } else {
- iter->user_data = NULL;
- Py_DECREF(py_ret);
- }
- } else {
- iter->user_data = NULL;
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gboolean
-pygtk_generic_tree_model_iter_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_parent = Py_None;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(parent == NULL || parent->stamp == PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp, FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_children(%p, %p)", iter, parent);
-#endif
- if (parent && parent->user_data != NULL)
- py_parent = (PyObject *)parent->user_data;
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_children",
- "(O)", py_parent);
- Py_DECREF(self);
- if (py_ret) {
- if (py_ret != Py_None) {
- /* XXXX handle reference counting here */
- iter->user_data = py_ret;
- iter->stamp = PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp;
- if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
- Py_DECREF((PyObject *)iter->user_data);
- }
- ret = TRUE;
- } else {
- iter->user_data = NULL;
- Py_DECREF(py_ret);
- }
- } else {
- iter->user_data = NULL;
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gboolean
-pygtk_generic_tree_model_iter_has_child(GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(VALID_ITER(iter, tree_model), FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_has_child(%p)", iter);
-#endif
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
-
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_has_child",
- "(O)", py_iter);
- Py_DECREF(self);
- if (py_ret) {
- ret = PyObject_IsTrue(py_ret);
-
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gint
-pygtk_generic_tree_model_iter_n_children(GtkTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter;
- guint ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, 0);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), 0);
- g_return_val_if_fail(iter == NULL || iter->stamp == PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp, 0);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_n_children(%p)", iter);
-#endif
-
- py_iter = iter != NULL ? (PyObject *)iter->user_data : Py_None;
-
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_n_children",
- "(O)", py_iter);
- Py_DECREF(self);
- if (py_ret) {
- ret = PyInt_AsLong(py_ret);
-
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gboolean
-pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *parent, gint n)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_parent = Py_None;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(parent == NULL || parent->stamp == PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp, FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_nth_child(%p, %p, %d)", iter, parent, n);
-#endif
- if (parent && parent->user_data != NULL)
- py_parent = (PyObject *)parent->user_data;
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_nth_child",
- "(Oi)", py_parent, n);
- Py_DECREF(self);
- if (py_ret) {
- if (py_ret != Py_None) {
- /* XXXX handle reference counting here */
- iter->user_data = py_ret;
- iter->stamp = PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp;
- if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
- Py_DECREF((PyObject *)iter->user_data);
- }
- ret = TRUE;
- } else {
- iter->user_data = NULL;
- Py_DECREF(py_ret);
- }
- } else {
- iter->user_data = NULL;
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static gboolean
-pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- GtkTreeIter *child)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_child = Py_None;
- gboolean ret = FALSE;
-
- g_return_val_if_fail(tree_model != NULL, FALSE);
- g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
- g_return_val_if_fail(iter != NULL, FALSE);
- g_return_val_if_fail(VALID_ITER(child, tree_model), FALSE);
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("iter_parent(%p, %p)", iter, child);
-#endif
- if (child && child->user_data != NULL)
- py_child = (PyObject *)child->user_data;
- py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_parent",
- "(O)", py_child);
- Py_DECREF(self);
- if (py_ret) {
- if (py_ret != Py_None) {
- /* XXXX handle reference counting here */
- iter->user_data = py_ret;
- iter->stamp = PYGTK_GENERIC_TREE_MODEL(tree_model)->stamp;
- if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
- Py_DECREF((PyObject *)iter->user_data);
- }
- ret = TRUE;
- } else {
- iter->user_data = NULL;
- Py_DECREF(py_ret);
- }
- } else {
- iter->user_data = NULL;
- PyErr_Print();
- }
-
- pyg_gil_state_release(state);
- return ret;
-}
-
-static void
-pygtk_generic_tree_model_unref_node(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter, *method;
-
- g_return_if_fail(tree_model != NULL);
- g_return_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model));
- g_return_if_fail(VALID_ITER(iter, tree_model));
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("unref_node(%p)", iter);
-#endif
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
-
- method = PyObject_GetAttrString(self, METHOD_PREFIX "unref_node");
- if (method == NULL)
- PyErr_Clear();
- else {
- py_ret = PyObject_CallFunction(method, "(O)", py_iter);
- if (py_ret) {
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
- }
- Py_DECREF(self);
-
- pyg_gil_state_release(state);
-}
-
-static void
-pygtk_generic_tree_model_ref_node(GtkTreeModel *tree_model, GtkTreeIter *iter)
-{
- PyGILState_STATE state;
- PyObject *self, *py_ret, *py_iter, *method;
-
- g_return_if_fail(tree_model != NULL);
- g_return_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model));
- g_return_if_fail(VALID_ITER(iter, tree_model));
-
- state = pyg_gil_state_ensure();
-
- /* this call finds the wrapper for this GObject */
- self = pygobject_new((GObject *)tree_model);
-
-#ifdef DEBUG_TREE_MODEL
- g_message("ref_node(%p)", iter);
-#endif
- py_iter = (PyObject *)iter->user_data;
- if (py_iter == NULL)
- py_iter = Py_None;
-
- method = PyObject_GetAttrString(self, METHOD_PREFIX "ref_node");
- if (method == NULL)
- PyErr_Clear();
- else {
- py_ret = PyObject_CallFunction(method, "(O)", py_iter);
- if (py_ret) {
- Py_DECREF(py_ret);
- } else {
- PyErr_Print();
- }
- }
- Py_DECREF(self);
-
- pyg_gil_state_release(state);
-}
-
-void
-pygtk_generic_tree_model_invalidate_iters(PyGtkGenericTreeModel *tree_model)
-{
- g_return_if_fail(tree_model != NULL);
-
- do {
- tree_model->stamp++;
- } while (tree_model->stamp == 0);
-}
-
-gboolean
-pygtk_generic_tree_model_iter_is_valid(PyGtkGenericTreeModel *tree_model,
- GtkTreeIter *iter)
-{
- g_return_val_if_fail(tree_model != NULL, FALSE);
-
- return VALID_ITER(iter, tree_model);
-}