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:[EMAIL PROTECTED]]
> Sent:         Thursday, September 21, 2000 2:18 PM
> To:   Havoc Pennington
> Cc:   [EMAIL PROTECTED]; [EMAIL PROTECTED]
> 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:[EMAIL PROTECTED]]
> > Sent:       Thursday, September 21, 2000 11:00 AM
> > To:         Havoc Pennington
> > Cc:         [EMAIL PROTECTED]; [EMAIL PROTECTED]
> > 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:[EMAIL PROTECTED]]
> > > Sent:     Thursday, September 21, 2000 12:13 AM
> > > To:       Dugas, Alan
> > > Cc:       [EMAIL PROTECTED]; [EMAIL PROTECTED]
> > > Subject:  Re: Unable to get all child widgets
> > > 
> > > 
> > > "Dugas, Alan" <[EMAIL PROTECTED]> 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
> > > [EMAIL PROTECTED]
> > > http://mail.gnome.org/mailman/listinfo/gtk-list
> > > 
> > 
> > _______________________________________________
> > gtk-list mailing list
> > [EMAIL PROTECTED]
> > http://mail.gnome.org/mailman/listinfo/gtk-list
> > 
> 
> _______________________________________________
> gtk-list mailing list
> [EMAIL PROTECTED]
> http://mail.gnome.org/mailman/listinfo/gtk-list
> 

_______________________________________________
gtk-list mailing list
[EMAIL PROTECTED]
http://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to