[Glade-users] Gnome Glade 0.5.10 core dumping on Solaris with GnomeMessageBox

Damon Chaplin damon@helixcode.com
Tue, 26 Sep 2000 15:35:54 +0100


This is a multi-part message in MIME format.
--------------94069FFEC792518DFFBE737F
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Graham Williams wrote:
> 
> I've just upgraded from 0.5.9 to 0.5.10 and my glade file is crashing
> Glade.  I've narrowed it down to the inclusion of the following
> GnomeMessageBox (in fact all of my GnomeMessageBoxes cause a crash,
> but then they are all similar).  I haven't looked any further.

It's a bug which was added to gnome-libs on 30th May. It was fixed in
CVS gnome-libs on 14th July. I don't know which released versions of
gnome-libs it appears in. (It is in 1.2.3 which I'm using, and which I
think is still the last stable release.)

It only affects things like Glade & libglade which build the
GnomeMessageBox bit by bit.

Here's a patch which I hope works around it.

I'll probably put up 0.5.11 in a few days. I'll just see if any more
major problems turn up.

Thanks for the report (I'll let James know about the problem in libglade),

Damon
--------------94069FFEC792518DFFBE737F
Content-Type: text/plain; charset=us-ascii;
 name="patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch"

--- gnomemessagebox.c.orig	Sat May 20 16:24:21 2000
+++ gnomemessagebox.c	Tue Sep 26 15:05:14 2000
@@ -80,9 +80,6 @@
 };
 
 
-/* Copied from gnome-dialog.c to workaround initialization problems. */
-static void gnome_dialog_init_action_area (GnomeDialog * dialog);
-
 static void get_message_box_widgets (GtkWidget *dialog,
 				     GtkWidget **pixmap,
 				     GtkWidget **label);
@@ -123,11 +120,15 @@
     }
   else
     {
-      new_widget = gnome_message_box_new ("",  GNOME_MESSAGE_BOX_INFO, NULL);
+      /* FIXME: We create it with an OK button, and then remove the button,
+	 to work around a bug in gnome_message_box_new() - it tries to set the
+	 keyboard focus to the last button, which may not exist. It also
+	 ensures that gnome_dialog_init_action_area() has been called. */
+      new_widget = gnome_message_box_new ("",  GNOME_MESSAGE_BOX_INFO,
+					  GNOME_STOCK_BUTTON_OK, NULL);
 
-      /* FIXME: Kludge to initialize the action area so we can refer to it
-	 below. */
-      gnome_dialog_init_action_area (GNOME_DIALOG (new_widget));
+      gtk_container_remove (GTK_CONTAINER (GNOME_DIALOG (new_widget)->action_area), GNOME_DIALOG (new_widget)->buttons->data);
+      GNOME_DIALOG (new_widget)->buttons = NULL;
     }
 
   gb_widget_create_from (GNOME_DIALOG (new_widget)->vbox,
@@ -153,35 +154,6 @@
 }
 
 
-/* FIXME: A kludge to initialize the action area, needed because
-   gnome_message_box_new() doesn't do this. Copied from gnome-dialog.c */
-static void
-gnome_dialog_init_action_area (GnomeDialog * dialog)
-{
-  GtkWidget * separator;
-
-  if (dialog->action_area)
-    return;
-
-  dialog->action_area = gtk_hbutton_box_new ();
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog->action_area),
-			     gnome_preferences_get_button_layout());
-
-  gtk_button_box_set_spacing (GTK_BUTTON_BOX (dialog->action_area), 
-			      GNOME_PAD);
-
-  gtk_box_pack_end (GTK_BOX (dialog->vbox), dialog->action_area, 
-		    FALSE, TRUE, 0);
-  gtk_widget_show (dialog->action_area);
-
-  separator = gtk_hseparator_new ();
-  gtk_box_pack_end (GTK_BOX (dialog->vbox), separator, 
-		      FALSE, TRUE,
-		      GNOME_PAD_SMALL);
-  gtk_widget_show (separator);
-}
-
-
 /*
  * Creates the components needed to edit the extra properties of this widget.
  */
@@ -392,11 +364,19 @@
   if (data->create_widget)
     {
       source_add (data,
+		  "  /* We create it with an OK button, and then remove the button, to work\n"
+		  "     around a bug in gnome-libs. */\n"
 		  "  %s = gnome_message_box_new (%s,\n"
-		  "                              %s, NULL);\n",
+		  "                              %s,\n"
+		  "                              GNOME_STOCK_BUTTON_OK, NULL);\n",
 		  data->wname,
 		  source_make_string (label_text, data->use_gettext),
 		  GbMessageBoxTypeSymbols[type_index]);
+
+      source_add (data,
+		  "  gtk_container_remove (GTK_CONTAINER (GNOME_DIALOG (%s)->action_area), GNOME_DIALOG (%s)->buttons->data);\n"
+		  "  GNOME_DIALOG (%s)->buttons = NULL;\n",
+		  data->wname, data->wname, data->wname);
     }
 
   gb_widget_write_standard_source (widget, data);

--------------94069FFEC792518DFFBE737F--