summaryrefslogtreecommitdiff
path: root/gtk/pygtktreemodel.c
diff options
context:
space:
mode:
authorGustavo J. A. M. Carneiro <gcarneiro@src.gnome.org>2004-03-06 15:34:29 +0000
committerGustavo J. A. M. Carneiro <gcarneiro@src.gnome.org>2004-03-06 15:34:29 +0000
commitaaaa9f318f72a69fa7f421a5302fc7dd25e252a4 (patch)
tree7e5fe88b5958e3ea618f011fcdc161a916673da8 /gtk/pygtktreemodel.c
parentb3a86cd1faab156876f906fe58f65b891c2b1532 (diff)
downloadpygtk-aaaa9f318f72a69fa7f421a5302fc7dd25e252a4.tar.gz
Add support for optional TreeModel ref_node & unref_node callbacks. Fixes #136312.
Diffstat (limited to 'gtk/pygtktreemodel.c')
-rw-r--r--gtk/pygtktreemodel.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/gtk/pygtktreemodel.c b/gtk/pygtktreemodel.c
index e667b83a..f2d9227a 100644
--- a/gtk/pygtktreemodel.c
+++ b/gtk/pygtktreemodel.c
@@ -132,6 +132,10 @@ static gboolean pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model
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)
@@ -148,6 +152,9 @@ pygtk_generic_tree_model_iface_init(GtkTreeModelIface *iface)
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
@@ -663,3 +670,74 @@ pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter
}
}
+static void
+pygtk_generic_tree_model_unref_node(GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+ 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(iter != NULL);
+
+ pyg_block_threads();
+
+ /* 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();
+ }
+ }
+
+ pyg_unblock_threads();
+}
+
+static void
+pygtk_generic_tree_model_ref_node(GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+ 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(iter != NULL);
+
+ pyg_block_threads();
+
+ /* 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 "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();
+ }
+ }
+
+ pyg_unblock_threads();
+}