From petm@scam.XCF.Berkeley.EDU Sat Apr 19 11:07:01 1997 Date: Fri, 18 Apr 1997 15:17:09 -0700 From: Peter Mattis To: gimp-developer@scam.XCF.Berkeley.EDU Subject: [gimp-devel]patch: layers dialog crashes There is a fairly neat little bug in GTK which causes the layers dialog to crash when a layer is deleted. This patch which is kindly provided by Owen Taylor (owt1@cornell.edu) fixes the problem. Peter diff -cr gimp-0.99.8.save/gtk+/gtk/gtkcontainer.c gimp-0.99.8/gtk+/gtk/gtkcontainer.c *** gimp-0.99.8.save/gtk+/gtk/gtkcontainer.c Wed Apr 9 03:42:18 1997 --- gimp-0.99.8/gtk+/gtk/gtkcontainer.c Fri Apr 18 16:20:12 1997 *************** *** 203,209 **** gtk_signal_emit (GTK_OBJECT (container), container_signals[REMOVE], widget); ! widget->parent = NULL; } void --- 203,209 ---- gtk_signal_emit (GTK_OBJECT (container), container_signals[REMOVE], widget); ! gtk_widget_unparent(widget); } void diff -cr gimp-0.99.8.save/gtk+/gtk/gtklist.c gimp-0.99.8/gtk+/gtk/gtklist.c *** gimp-0.99.8.save/gtk+/gtk/gtklist.c Sat Mar 15 20:53:39 1997 --- gimp-0.99.8/gtk+/gtk/gtklist.c Fri Apr 18 16:21:38 1997 *************** *** 297,303 **** if (GTK_WIDGET_MAPPED (widget)) gtk_widget_unmap (widget); ! widget->parent = NULL; } if (selected_widgets) --- 297,304 ---- if (GTK_WIDGET_MAPPED (widget)) gtk_widget_unmap (widget); ! ! gtk_widget_unparent(widget); } if (selected_widgets) diff -cr gimp-0.99.8.save/gtk+/gtk/gtkwidget.c gimp-0.99.8/gtk+/gtk/gtkwidget.c *** gimp-0.99.8.save/gtk+/gtk/gtkwidget.c Thu Apr 17 20:20:14 1997 --- gimp-0.99.8/gtk+/gtk/gtkwidget.c Fri Apr 18 16:48:00 1997 *************** *** 523,538 **** void gtk_widget_destroy (GtkWidget *widget) { GtkWidget *toplevel; ! if (GTK_WIDGET_HAS_FOCUS (widget)) { ! toplevel = gtk_widget_get_toplevel (widget); ! if (GTK_IS_WINDOW (toplevel)) gtk_window_set_focus (GTK_WINDOW (toplevel), NULL); } ! gtk_object_destroy (GTK_OBJECT (widget)); } /***************************************** --- 523,564 ---- void gtk_widget_destroy (GtkWidget *widget) { + if (widget->parent && !GTK_OBJECT_BEING_DESTROYED (widget->parent)) + gtk_container_remove (GTK_CONTAINER (widget->parent), widget); + + gtk_object_destroy (GTK_OBJECT (widget)); + } + + /***************************************** + * gtk_widget_unparent: do any cleanup necessary necessary before + * setting parent = NULL. In particular, remove + * the focus properly. + * + * arguments: + * + * results: + *****************************************/ + + void + gtk_widget_unparent (GtkWidget *widget) + { GtkWidget *toplevel; + GtkWidget *child; ! toplevel = gtk_widget_get_toplevel (widget); ! ! if (GTK_IS_WINDOW (toplevel)) { ! child = GTK_WINDOW(toplevel)->focus_widget; ! ! while (child && child != widget) ! child = child->parent; ! ! if (child == widget) gtk_window_set_focus (GTK_WINDOW (toplevel), NULL); } ! widget->parent = NULL; } /***************************************** *************** *** 2019,2037 **** if (widget->name) g_free (widget->name); - if (GTK_WIDGET_HAS_FOCUS (widget)) - { - } - aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key); if (aux_info) { gtk_widget_aux_info_destroy (aux_info); gtk_object_remove_data (GTK_OBJECT (widget), aux_info_key); } - - if (widget->parent && !GTK_OBJECT_BEING_DESTROYED (widget->parent)) - gtk_container_remove (GTK_CONTAINER (widget->parent), widget); events = gtk_object_get_data (GTK_OBJECT (object), event_key); if (events) --- 2045,2056 ---- diff -cr gimp-0.99.8.save/gtk+/gtk/gtkwidget.h gimp-0.99.8/gtk+/gtk/gtkwidget.h *** gimp-0.99.8.save/gtk+/gtk/gtkwidget.h Thu Apr 17 20:20:12 1997 --- gimp-0.99.8/gtk+/gtk/gtkwidget.h Fri Apr 18 16:22:54 1997 *************** *** 286,291 **** --- 286,292 ---- guint gtk_widget_get_type (void); void gtk_widget_destroy (GtkWidget *widget); + void gtk_widget_unparent (GtkWidget *widget); void gtk_widget_show (GtkWidget *widget); void gtk_widget_hide (GtkWidget *widget); void gtk_widget_map (GtkWidget *widget);