diff options
author | Johan Dahlin <zilch@src.gnome.org> | 2002-12-28 14:38:45 +0000 |
---|---|---|
committer | Johan Dahlin <zilch@src.gnome.org> | 2002-12-28 14:38:45 +0000 |
commit | 3c903d887ceb4a796e40ed23a61634a6665131fc (patch) | |
tree | 8d906cc092cc7f3ebdb9ee1c1de940e7fb102e5e /gtk/pygtkcellrenderer.c | |
parent | 599e8cc502f9f2f2daf5bdf6e30cdf9e4e8892fd (diff) | |
download | pygtk-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.c | 24 |
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; } |