summaryrefslogtreecommitdiff
path: root/gtk/pygtkcellrenderer.c
diff options
context:
space:
mode:
authorJohan Dahlin <zilch@src.gnome.org>2002-12-28 14:38:45 +0000
committerJohan Dahlin <zilch@src.gnome.org>2002-12-28 14:38:45 +0000
commit3c903d887ceb4a796e40ed23a61634a6665131fc (patch)
tree8d906cc092cc7f3ebdb9ee1c1de940e7fb102e5e /gtk/pygtkcellrenderer.c
parent599e8cc502f9f2f2daf5bdf6e30cdf9e4e8892fd (diff)
downloadpygtk-3c903d887ceb4a796e40ed23a61634a6665131fc.tar.gz
Improve threading support by adding pyg_thread_block/unblock around all
* gobjectmodule.c, gtk/gtk.override, gtk/pygtkcellrenderer.c, gtk/pygtktreemodel: Improve threading support by adding pyg_thread_block/unblock around all PyObject_Call* and g_object_refs. Based upon patch by Jon Trowbridge. Fixes #99102.
Diffstat (limited to 'gtk/pygtkcellrenderer.c')
-rw-r--r--gtk/pygtkcellrenderer.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/gtk/pygtkcellrenderer.c b/gtk/pygtkcellrenderer.c
index d19f2d59..222ee311 100644
--- a/gtk/pygtkcellrenderer.c
+++ b/gtk/pygtkcellrenderer.c
@@ -98,6 +98,8 @@ pygtk_generic_cell_renderer_get_size (GtkCellRenderer *cell,
g_return_if_fail(PYGTK_IS_GENERIC_CELL_RENDERER (cell));
+ pyg_block_threads();
+
self = pygobject_new((GObject *)cell);
#ifdef DEBUG_CELL_RENDERER
@@ -105,14 +107,15 @@ pygtk_generic_cell_renderer_get_size (GtkCellRenderer *cell,
#endif
py_widget = pygobject_new((GObject *)widget);
py_cell_area = pyg_boxed_new(GDK_TYPE_RECTANGLE, cell_area, TRUE, TRUE);
+
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_size", "OO",
py_widget, py_cell_area);
-
if (!py_ret) {
PyErr_Print();
PyErr_Clear();
Py_DECREF(py_widget);
Py_DECREF(py_cell_area);
+ pyg_unblock_threads();
return;
}
Py_DECREF(py_widget);
@@ -122,11 +125,14 @@ pygtk_generic_cell_renderer_get_size (GtkCellRenderer *cell,
&my_x, &my_y, &my_width, &my_height)) {
PyErr_Clear();
Py_DECREF(py_ret);
+ pyg_unblock_threads();
g_warning("could not parse return value of get_size() method. "
"Should be of form (x_offset, y_offset, width, height)");
return;
}
+ pyg_unblock_threads();
+
/* success */
if (x_offset)
*x_offset = my_x;
@@ -139,6 +145,7 @@ pygtk_generic_cell_renderer_get_size (GtkCellRenderer *cell,
if (height)
*height = my_height;
+
}
static void
@@ -155,6 +162,8 @@ pygtk_generic_cell_renderer_render (GtkCellRenderer *cell,
g_return_if_fail(PYGTK_IS_GENERIC_CELL_RENDERER (cell));
+ pyg_block_threads();
+
self = pygobject_new((GObject *)cell);
#ifdef DEBUG_CELL_RENDERER
@@ -172,11 +181,14 @@ pygtk_generic_cell_renderer_render (GtkCellRenderer *cell,
PyErr_Print();
PyErr_Clear();
}
+
Py_DECREF(py_window);
Py_DECREF(py_widget);
Py_DECREF(py_background_area);
Py_DECREF(py_cell_area);
Py_DECREF(py_expose_area);
+
+ pyg_unblock_threads();
}
static gboolean
@@ -194,6 +206,8 @@ pygtk_generic_cell_renderer_activate (GtkCellRenderer *cell,
g_return_val_if_fail(PYGTK_IS_GENERIC_CELL_RENDERER (cell), FALSE);
+ pyg_block_threads();
+
self = pygobject_new((GObject *)cell);
#ifdef DEBUG_CELL_RENDERER
@@ -203,6 +217,7 @@ pygtk_generic_cell_renderer_activate (GtkCellRenderer *cell,
py_widget = pygobject_new((GObject *)widget);
py_background_area = pyg_boxed_new(GDK_TYPE_RECTANGLE, background_area, TRUE, TRUE);
py_cell_area = pyg_boxed_new(GDK_TYPE_RECTANGLE, cell_area, TRUE, TRUE);
+
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "activate", "OOzOOi",
py_event, py_widget, path, py_background_area,
py_cell_area, flags);
@@ -213,6 +228,7 @@ pygtk_generic_cell_renderer_activate (GtkCellRenderer *cell,
Py_DECREF(py_widget);
Py_DECREF(py_background_area);
Py_DECREF(py_cell_area);
+ pyg_unblock_threads();
return FALSE;
}
Py_DECREF(py_event);
@@ -221,6 +237,7 @@ pygtk_generic_cell_renderer_activate (GtkCellRenderer *cell,
Py_DECREF(py_cell_area);
ret = PyObject_IsTrue(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
}
@@ -240,6 +257,8 @@ pygtk_generic_cell_renderer_start_editing (GtkCellRenderer *cell,
g_return_val_if_fail(PYGTK_IS_GENERIC_CELL_RENDERER (cell), NULL);
+ pyg_block_threads();
+
self = pygobject_new((GObject *)cell);
#ifdef DEBUG_CELL_RENDERER
@@ -249,6 +268,7 @@ pygtk_generic_cell_renderer_start_editing (GtkCellRenderer *cell,
py_widget = pygobject_new((GObject *)widget);
py_background_area = pyg_boxed_new(GDK_TYPE_RECTANGLE, background_area, TRUE, TRUE);
py_cell_area = pyg_boxed_new(GDK_TYPE_RECTANGLE, cell_area, TRUE, TRUE);
+
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "start_editing", "OOzOOi",
py_event, py_widget, path, py_background_area,
py_cell_area, flags);
@@ -259,6 +279,7 @@ pygtk_generic_cell_renderer_start_editing (GtkCellRenderer *cell,
Py_DECREF(py_widget);
Py_DECREF(py_background_area);
Py_DECREF(py_cell_area);
+ pyg_unblock_threads();
return NULL;
}
Py_DECREF(py_event);
@@ -271,6 +292,7 @@ pygtk_generic_cell_renderer_start_editing (GtkCellRenderer *cell,
g_warning("return of start_editing() was not a GtkCellEditable");
}
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
}