mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-04-21 13:05:04 -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:
parent
823f52c540
commit
a7e6d60915
@ -250,7 +250,7 @@ static void columns_forall(GtkContainer *container, gboolean include_internals,
|
|||||||
{
|
{
|
||||||
Columns *cols;
|
Columns *cols;
|
||||||
ColumnsChild *child;
|
ColumnsChild *child;
|
||||||
GList *children;
|
GList *children, *next;
|
||||||
|
|
||||||
g_return_if_fail(container != NULL);
|
g_return_if_fail(container != NULL);
|
||||||
g_return_if_fail(IS_COLUMNS(container));
|
g_return_if_fail(IS_COLUMNS(container));
|
||||||
@ -260,9 +260,19 @@ static void columns_forall(GtkContainer *container, gboolean include_internals,
|
|||||||
|
|
||||||
for (children = cols->children;
|
for (children = cols->children;
|
||||||
children && (child = children->data);
|
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)
|
if (child->widget)
|
||||||
callback(child->widget, callback_data);
|
callback(child->widget, callback_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkType columns_child_type(GtkContainer *container)
|
static GtkType columns_child_type(GtkContainer *container)
|
||||||
|
@ -225,7 +225,7 @@ static void panels_forall(GtkContainer *container, gboolean include_internals,
|
|||||||
{
|
{
|
||||||
Panels *panels;
|
Panels *panels;
|
||||||
GtkWidget *child;
|
GtkWidget *child;
|
||||||
GList *children;
|
GList *children, *next;
|
||||||
|
|
||||||
g_return_if_fail(container != NULL);
|
g_return_if_fail(container != NULL);
|
||||||
g_return_if_fail(IS_PANELS(container));
|
g_return_if_fail(IS_PANELS(container));
|
||||||
@ -235,9 +235,19 @@ static void panels_forall(GtkContainer *container, gboolean include_internals,
|
|||||||
|
|
||||||
for (children = panels->children;
|
for (children = panels->children;
|
||||||
children && (child = children->data);
|
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)
|
if (child)
|
||||||
callback(child, callback_data);
|
callback(child, callback_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkType panels_child_type(GtkContainer *container)
|
static GtkType panels_child_type(GtkContainer *container)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user