From kaz@hypercore.co.jp Wed Apr 23 11:18:22 1997 Date: 23 Apr 1997 20:30:23 +0900 From: Kazuhiro Sasayama To: gimp-developer@scam.xcf.berkeley.edu Subject: [gimp-devel][patch] gtk 0.99.8 These are my today's:-) changes to protect our gimp from some sporadic segmentation faults. With these changes: 1. the user_data member of a GdkWindow will be set to NULL before destruction, and 2. the focus_widget member of a GtkWindow will be set to NULL if it points to a GtkListItem that is about to be removed. I hope I have fixed most of the problems I had seen. --- gimp-0.99.8/gtk+/gtk/gtkentry.c 1997-04-23 11:25:16+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtkentry.c 1997-04-23 11:28:07+09 @@ -491,9 +491,15 @@ gtk_style_detach (widget->style); if (entry->text_area) - gdk_window_destroy (entry->text_area); + { + gdk_window_set_user_data (entry->text_area, NULL); + gdk_window_destroy (entry->text_area); + } if (widget->window) - gdk_window_destroy (widget->window); + { + gdk_window_set_user_data (widget->window, NULL); + gdk_window_destroy (widget->window); + } entry->text_area = NULL; widget->window = NULL; --- gimp-0.99.8/gtk+/gtk/gtklist.c 1997-04-23 14:54:15+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtklist.c 1997-04-23 17:22:19+09 @@ -19,6 +19,7 @@ #include "gtklistitem.h" #include "gtkmain.h" #include "gtksignal.h" +#include "gtkwindow.h" enum { @@ -275,6 +276,7 @@ GList *items) { GtkWidget *widget; + GtkWidget *window; GList *selected_widgets; GList *tmp_list; @@ -294,6 +296,11 @@ selected_widgets = g_list_prepend (selected_widgets, widget); list->children = g_list_remove (list->children, widget); + + /* WIDGET must lose the focus before it becomes an orphan. */ + window = gtk_widget_get_ancestor (widget, gtk_window_get_type ()); + if (GTK_WINDOW (window)->focus_widget == widget) + gtk_window_set_focus (GTK_WINDOW (window), NULL); if (GTK_WIDGET_MAPPED (widget)) gtk_widget_unmap (widget); --- gimp-0.99.8/gtk+/gtk/gtknotebook.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtknotebook.c 1997-04-23 11:28:53+09 @@ -465,6 +465,7 @@ GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED); gtk_style_detach (widget->style); + gdk_window_set_user_data (widget->window, NULL); gdk_window_destroy (widget->window); widget->window = NULL; } --- gimp-0.99.8/gtk+/gtk/gtkrange.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtkrange.c 1997-04-23 11:52:54+09 @@ -620,15 +620,30 @@ gtk_style_detach (widget->style); if (range->slider) - gdk_window_destroy (range->slider); + { + gdk_window_set_user_data (range->slider, NULL); + gdk_window_destroy (range->slider); + } if (range->trough) - gdk_window_destroy (range->trough); + { + gdk_window_set_user_data (range->trough, NULL); + gdk_window_destroy (range->trough); + } if (range->step_forw) - gdk_window_destroy (range->step_forw); + { + gdk_window_set_user_data (range->step_forw, NULL); + gdk_window_destroy (range->step_forw); + } if (range->step_back) - gdk_window_destroy (range->step_back); + { + gdk_window_set_user_data (range->step_back, NULL); + gdk_window_destroy (range->step_back); + } if (widget->window) - gdk_window_destroy (widget->window); + { + gdk_window_set_user_data (widget->window, NULL); + gdk_window_destroy (widget->window); + } range->slider = NULL; range->trough = NULL; --- gimp-0.99.8/gtk+/gtk/gtkruler.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtkruler.c 1997-04-23 11:29:55+09 @@ -196,6 +196,7 @@ GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED); gtk_style_detach (widget->style); + gdk_window_set_user_data (widget->window, NULL); gdk_window_destroy (widget->window); widget->window = NULL; --- gimp-0.99.8/gtk+/gtk/gtktext.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtktext.c 1997-04-23 11:31:06+09 @@ -680,7 +680,9 @@ GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED); gtk_style_detach (widget->style); + gdk_window_set_user_data (widget->window, NULL); gdk_window_destroy (widget->window); + gdk_window_set_user_data (text->text_area, NULL); gdk_window_destroy (text->text_area); gdk_gc_destroy (text->gc); --- gimp-0.99.8/gtk+/gtk/gtkviewport.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtkviewport.c 1997-04-23 11:38:04+09 @@ -331,8 +331,11 @@ gtk_style_detach (widget->style); + gdk_window_set_user_data (widget->window, NULL); gdk_window_destroy (widget->window); + gdk_window_set_user_data (viewport->view_window, NULL); gdk_window_destroy (viewport->view_window); + gdk_window_set_user_data (viewport->main_window, NULL); gdk_window_destroy (viewport->main_window); widget->window = NULL; --- gimp-0.99.8/gtk+/gtk/gtkwidget.c 1997-04-23 11:25:51+09 1.1 +++ gimp-0.99.8/gtk+/gtk/gtkwidget.c 1997-04-23 11:33:43+09 @@ -1005,7 +1005,10 @@ { GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED); if (!GTK_WIDGET_NO_WINDOW (widget)) - gdk_window_destroy (widget->window); + { + gdk_window_set_user_data (widget->window, NULL); + gdk_window_destroy (widget->window); + } widget->window = NULL; if (GTK_WIDGET_REALIZED (new_parent)) -- Kaz Sasayama, the designer of Hyperplay. PGP key fingerprint = 53 71 54 56 FB 3D 76 0B 92 5D 32 40 C5 34 38 00