RE: Unable to get all child widgets
- From: "Dugas, Alan" <alan dugas analog com>
- To: Havoc Pennington <hp redhat com>
- Cc: gtk-app-devel-list gnome org, gtk-list gnome org
- Subject: RE: Unable to get all child widgets
- Date: Thu, 21 Sep 2000 15:55:35 -0400
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]