X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d9b15094136238a0b679e8b0c8c67a991fe5040a..76347f46fb70138ad34af07b2ab00625600931f1:/unix/gtkpanel.c diff --git a/unix/gtkpanel.c b/unix/gtkpanel.c index 5167eadd..591c8608 100644 --- a/unix/gtkpanel.c +++ b/unix/gtkpanel.c @@ -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) @@ -277,9 +287,9 @@ void panels_add(Panels *panels, GtkWidget *child) void panels_switch_to(Panels *panels, GtkWidget *target) { - GtkWidget *child; + GtkWidget *child = NULL; GList *children; - gboolean changed; + gboolean changed = FALSE; g_return_if_fail(panels != NULL); g_return_if_fail(IS_PANELS(panels)); @@ -375,10 +385,6 @@ static void panels_size_allocate(GtkWidget *widget, GtkAllocation *alloc) children = children->next) { GtkAllocation call; - /* Only take visible widgets into account. */ - if (!GTK_WIDGET_VISIBLE(child)) - continue; - call.x = alloc->x + border; call.width = alloc->width - 2*border; call.y = alloc->y + border;