RE: Unable to get all child widgets



I finally found the root case of my inablility to find the widgets contained
within the hbox.  GTK_IS_HBOX() returns TRUE for a gtkcombo.  When the for
loop ran, the widgets were encountered in this order: hbox, table, combo.
Since combo was last, it overwrote the hbox address.  Using ddd/gdb I was
able to confim that the variables hbox and test_list_combo were pointing to
the same widget.  The fix was to logically AND GTK_IS_HBOX() with hbox ==
(GtkWidget *) NULL.  Thanks to all who responded.

				-- Stupid Genius
P.S.
Havoc, would you say that this is, or at least should be, considered a bug
in gtk+1.2.8?
  
> ----------
> From: 	Dugas, Alan[SMTP:alan dugas analog com]
> Sent: 	Thursday, September 21, 2000 2:18 PM
> To: 	Havoc Pennington
> Cc: 	gtk-app-devel-list gnome org; gtk-list gnome org
> Subject: 	RE: Unable to get all child widgets
> 
> An interesting discovery, the code below is finding two (2) gtkentries and
> two (2) gtkbuttons instead of two (2) gtklabels and two (2) gtkcombos!
> Stranger still is the fact that when function draw_histogram (see code
> snippet below) is called after a widget is manipulated or redrawn, only
> the
> widget manipulated or redrawn is found by gtk_container_children().  This
> is
> rather confusing since it should be finding two (2) gtklabels and (2)
> gtkcombos all the time.  The fact that I'm finding the components of both
> combos instead of the combos themselves makes me wonder if I've stumbled
> across a bug in gtk+.  If anyone has any idea as to what may be happening
> I
> would really appreciate your input.  Thanks in advance.
> 
> 
> 
> 				-- Stupid Genius
> > ----------
> > From: 	Dugas, Alan[SMTP:alan dugas analog com]
> > Sent: 	Thursday, September 21, 2000 11:00 AM
> > To: 	Havoc Pennington
> > Cc: 	gtk-app-devel-list gnome org; gtk-list gnome org
> > Subject: 	RE: Unable to get all child widgets
> > 
> > Thanks Havoc, I tried your suggestion... unfortunately it didn't fix my
> > problem.  Is there some special way that I need to pack the hbox and its
> > child widgets?  The code works fine to create the window and the widgets
> > are
> > packed as programmed.  Below are the code snippets that are used for the
> > hbox and subwidgets creation and subsequent attempt to retreive them by
> > recursively searching the window, then vbox, then hbox, then widgets of
> > interest.  The really strange part of this is that I can correctly
> > retrieve
> > the widget pointers to a vruler, hruler, and drawingarea contained with
> a
> > table, an hbox, table, and, combo contained within a vbox, but not a
> combo
> > within an hbox.  Again any and all help from anyone would be greatly
> > appreciated.
> > 
> > code snippet creating the window and populating it with widgets:
> > 
> > /* Function to create a histogram window */
> > void create_histogram(void)
> > {
> > 	/* Declaring local defines */
> > 	#define EVENT_METHOD(i, x) GTK_WIDGET_CLASS(GTK_OBJECT(i)->klass)->x
> > 
> > 
> > 
> > 	/* Declaring local variables */
> > 	GtkWidget	*histogram_window,
> > 			*vbox,
> > 			*hbox,
> > 			*label,
> > 			*table,
> > 			*hruler,
> > 			*vruler,
> > 			*drawing_area,
> > 			*combo;
> > 
> > 	GList		*glist = (GList *) NULL;
> > 
> > 	int		index,
> > 			number_of_tests;
> > 
> > 	static char	**glist_items = (char **) NULL;
> > 
> > 
> > 
> > 	/* Creating histogram window */
> > 	histogram_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
> > 	gtk_window_set_title(GTK_WINDOW(histogram_window), "STDF
> > Histogram");
> > 	gtk_container_set_border_width(GTK_CONTAINER(histogram_window), 5);
> > 
> > 
> > 
> > 	/* Creating vbox to hold window widgets */
> > 	vbox = gtk_vbox_new(FALSE, 2);
> > 	gtk_container_add(GTK_CONTAINER(histogram_window),
> > GTK_WIDGET(vbox));
> > 	gtk_widget_show(GTK_WIDGET(vbox));
> > 
> > 
> > 
> > 	/* Creating hbox to hold window widgets */
> > 	hbox = gtk_hbox_new(FALSE, 2);
> > 	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hbox), FALSE, FALSE,
> > 0);
> > 	gtk_widget_show(GTK_WIDGET(hbox));
> > 
> > 
> > 
> > 	/* Creating label for histogram display mode option */
> > 	label = gtk_label_new("Histogram Display: ");
> > 	gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE,
> > 0);
> > 	gtk_widget_show(GTK_WIDGET(label));
> > 
> > 
> > 
> > 	/* Creating Glist to hold histogram display mode options */
> > 	glist = g_list_append(glist, "Data Only");
> > 	glist = g_list_append(glist, "Up to test limits");
> > 	glist = g_list_append(glist, "Data and test limits");
> > 
> > 
> > 
> > 	/* Creating combo box to hold histogram display mode selections */
> > 	combo = gtk_combo_new();
> > 	gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist);
> > 	g_list_free(glist);
> > 	glist = (GList *) NULL;
> > 	gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE);
> > 	gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(combo)->entry),
> > FALSE);
> > 	gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->list),
> > "select_child", GTK_SIGNAL_FUNC(set_histogram_display_mode), NULL);
> > 	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), (gint) 2);
> > 	gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->entry), "changed",
> > GTK_SIGNAL_FUNC(draw_histogram), histogram_window);
> > 	gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(combo), FALSE, FALSE,
> > 0);
> > 	gtk_widget_show(GTK_WIDGET(combo));
> > 
> > 
> > 
> > 	/* Creating label for number of bins option */
> > 	label = gtk_label_new("Histogram Bins: ");
> > 	gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(label), FALSE, FALSE,
> > 0);
> > 	gtk_widget_show(GTK_WIDGET(label));
> > 
> > 
> > 
> > 	/* Creating Glist to hold number of bin options */
> > 	glist = g_list_append(glist, "5");
> > 	glist = g_list_append(glist, "10");
> > 	glist = g_list_append(glist, "15");
> > 	glist = g_list_append(glist, "20");
> > 	glist = g_list_append(glist, "25");
> > 	glist = g_list_append(glist, "30");
> > 	glist = g_list_append(glist, "35");
> > 	glist = g_list_append(glist, "40");
> > 	glist = g_list_append(glist, "45");
> > 	glist = g_list_append(glist, "50");
> > 
> > 
> > 
> > 	/* Creating combo box to hold histogram bin selections */
> > 	combo = gtk_combo_new();
> > 	gtk_combo_set_popdown_strings(GTK_COMBO(combo), glist);
> > 	g_list_free(glist);
> > 	glist = (GList *) NULL;
> > 	gtk_combo_set_use_arrows_always(GTK_COMBO(combo), TRUE);
> > 	gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(combo)->entry),
> > FALSE);
> > 	gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->entry), "changed",
> > GTK_SIGNAL_FUNC(set_number_of_bins), NULL);
> > 	gtk_list_select_item(GTK_LIST(GTK_COMBO(combo)->list), (gint) 3);
> > 	gtk_signal_connect(GTK_OBJECT(GTK_COMBO(combo)->entry), "changed",
> > GTK_SIGNAL_FUNC(draw_histogram), histogram_window);
> > 	gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(combo), FALSE, FALSE,
> > 0);
> > 	gtk_widget_show(GTK_WIDGET(combo));
> > 
> > 
> > code snippet searching for combo contained within the hbox and the combo
> > call resulting in an invalid pointer segfault (last line):
> > 
> > 
> > /* Function to plot histogram */
> > void draw_histogram(GtkWidget *calling_widget, GtkWidget
> > *histogram_window)
> > {
> > /* Declaring local variables */
> > 	gint	left_edge = 0,
> > 		top_edge = 0,
> > 		rectangle_width,
> > 		rectangle_height,
> > 		x_start, y_start, x_end, y_end;
> > 
> > 	gchar	*entry_text;
> > 
> > 	int	index;
> > 
> > 	GtkWidget	*vbox = (GtkWidget *) NULL,
> > 			*hbox = (GtkWidget *) NULL,
> > 			*table = (GtkWidget *) NULL,
> > 			*drawing_area = (GtkWidget *) NULL,
> > 			*test_list_combo = (GtkWidget *) NULL,
> > 			*histogram_bins_combo = (GtkWidget *) NULL,
> > 			*vruler = (GtkWidget *) NULL,
> > 			*hruler = (GtkWidget *) NULL;
> > 
> > 	GList		*widget_list;
> > 
> > 	double		*results = (double *) NULL,
> > 			scalar,
> > 			upper_limit,
> > 			lower_limit;
> > 
> > 	static double	lower_bin_limit,
> > 			upper_bin_limit,
> > 			bin_width;
> > 
> > 	int		number_of_data_values,
> > 			memory_index,
> > 			bin_index;
> > 
> > 	static GtkStyle	*test_limit_style = (GtkStyle *) NULL;
> > 
> > 	GdkColor	red = {0, 0xffff, 0x0000, 0x0000};
> > 
> > 	gboolean	color_allocation_ok;
> > 
> > 
> > 
> > 	/* Setting widget address' to local variable names */
> > 	for ( widget_list =
> > gtk_container_children(GTK_CONTAINER(histogram_window)) ; widget_list !=
> > NULL ; widget_list = widget_list->next )
> > 	{
> > 		if ( GTK_IS_VBOX(GTK_OBJECT(widget_list->data)) )
> > 			vbox = GTK_WIDGET(widget_list->data);
> > 	}
> > 	g_list_free(widget_list);
> > 	for ( widget_list = gtk_container_children(GTK_CONTAINER(vbox)) ;
> > widget_list != NULL ; widget_list = widget_list->next )
> > 	{
> > 		if ( GTK_IS_HBOX(GTK_OBJECT(widget_list->data)) )
> > 			hbox = GTK_WIDGET(widget_list->data);
> > 		if ( GTK_IS_TABLE(GTK_OBJECT(widget_list->data)) )
> > 			table = GTK_WIDGET(widget_list->data);
> > 		if ( GTK_IS_COMBO(GTK_OBJECT(widget_list->data)) )
> > 			test_list_combo = GTK_WIDGET(widget_list->data);
> > 	}
> > 	g_list_free(widget_list);
> > 	for ( widget_list = gtk_container_children(GTK_CONTAINER(hbox)) ;
> > widget_list != NULL ; widget_list = widget_list->next )
> > 	{
> > 		if ( GTK_IS_COMBO(GTK_OBJECT(widget_list->data)) )
> > 			histogram_bins_combo =
> > GTK_WIDGET(widget_list->data);
> > 	}
> > 	g_list_free(widget_list);
> > 	for ( widget_list = gtk_container_children(GTK_CONTAINER(table)) ;
> > widget_list != NULL ; widget_list = widget_list->next )
> > 	{
> > 		if ( GTK_IS_DRAWING_AREA(GTK_OBJECT(widget_list->data)) )
> > 			drawing_area = GTK_WIDGET(widget_list->data);
> > 		if ( GTK_IS_HRULER(GTK_OBJECT(widget_list->data)) )
> > 			hruler = GTK_WIDGET(widget_list->data);
> > 		if ( GTK_IS_VRULER(GTK_OBJECT(widget_list->data)) )
> > 			vruler = GTK_WIDGET(widget_list->data);
> > 	}
> > 	g_list_free(widget_list);
> > 
> > 
> > 
> > 	/* Clearing GtkDrawingArea widget */
> > 	rectangle_width = GTK_WIDGET(drawing_area)->allocation.width;
> > 	rectangle_height = GTK_WIDGET(drawing_area)->allocation.height;
> > 	gdk_draw_rectangle(GTK_WIDGET(drawing_area)->window,
> > GTK_WIDGET(drawing_area)->style->white_gc, TRUE,
> > 			   0, 0, rectangle_width, rectangle_height);
> > 
> > 
> > 
> > 	/* Checking wheither to refresh image or recalculate histogram */
> > 	entry_text =
> > gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(test_list_combo)->entry));
> > 	if ( strcmp(entry_text, "Select a test") == 0 )
> > 		return;
> > 
> > 
> > 
> > 	/* Changing cursor to let user know application is busy */
> > 	gdk_window_set_cursor(GTK_WIDGET(drawing_area)->window,
> > watch_cursor);
> > 
> > 
> > 
> > 	/* Setting up x-axis boundaries */
> > 	results = test_data[atoi(entry_text)]->results;
> > 	number_of_data_values = test_data[atoi(entry_text)]->exec_cnt;
> > 	histogram_data.number_of_bins =
> >
> atoi(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(histogram_bins_combo)->entry))
> > );
> > 
> > 
> > > ----------
> > > From: 	Havoc Pennington[SMTP:hp redhat com]
> > > Sent: 	Thursday, September 21, 2000 12:13 AM
> > > To: 	Dugas, Alan
> > > Cc: 	gtk-app-devel-list gnome org; gtk-list gnome org
> > > Subject: 	Re: Unable to get all child widgets
> > > 
> > > 
> > > "Dugas, Alan" <alan dugas analog com> writes:
> > > > g_free(widget_list);
> > > 
> > > Use g_list_free(widget_list), the above line corrupts memory so could
> > > cause all sorts of fun effects.
> > > 
> > > Havoc
> > > 
> > > _______________________________________________
> > > gtk-list mailing list
> > > gtk-list gnome org
> > > http://mail.gnome.org/mailman/listinfo/gtk-list
> > > 
> > 
> > _______________________________________________
> > gtk-list mailing list
> > gtk-list gnome org
> > http://mail.gnome.org/mailman/listinfo/gtk-list
> > 
> 
> _______________________________________________
> gtk-list mailing list
> gtk-list gnome org
> http://mail.gnome.org/mailman/listinfo/gtk-list
> 




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]