1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-10 07:38:06 -05:00

Fix a _very_ subtle segfault in my two GTK container classes: the

`forall' function has to be prepared for the list of widgets to
change along the way if (for example) the callback function destroys
its input widget.

[originally from svn r3029]
This commit is contained in:
Simon Tatham 2003-03-31 11:22:06 +00:00
parent 823f52c540
commit a7e6d60915
2 changed files with 24 additions and 4 deletions

View File

@ -250,7 +250,7 @@ static void columns_forall(GtkContainer *container, gboolean include_internals,
{
Columns *cols;
ColumnsChild *child;
GList *children;
GList *children, *next;
g_return_if_fail(container != NULL);
g_return_if_fail(IS_COLUMNS(container));
@ -260,9 +260,19 @@ static void columns_forall(GtkContainer *container, gboolean include_internals,
for (children = cols->children;
children && (child = children->data);
children = children->next)
children = next) {
/*
* We can't wait until after the callback to assign
* `children = children->next', because the callback might
* be gtk_widget_destroy, which would remove the link
* `children' from the list! So instead we must get our
* hands on the value of the `next' pointer _before_ the
* callback.
*/
next = children->next;
if (child->widget)
callback(child->widget, callback_data);
}
}
static GtkType columns_child_type(GtkContainer *container)

View File

@ -225,7 +225,7 @@ static void panels_forall(GtkContainer *container, gboolean include_internals,
{
Panels *panels;
GtkWidget *child;
GList *children;
GList *children, *next;
g_return_if_fail(container != NULL);
g_return_if_fail(IS_PANELS(container));
@ -235,9 +235,19 @@ static void panels_forall(GtkContainer *container, gboolean include_internals,
for (children = panels->children;
children && (child = children->data);
children = children->next)
children = next) {
/*
* We can't wait until after the callback to assign
* `children = children->next', because the callback might
* be gtk_widget_destroy, which would remove the link
* `children' from the list! So instead we must get our
* hands on the value of the `next' pointer _before_ the
* callback.
*/
next = children->next;
if (child)
callback(child, callback_data);
}
}
static GtkType panels_child_type(GtkContainer *container)