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





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