TreeModel and/or TreeView are lost after a while (?)




Hi,

I've been doing a quite simple GUI to my other text based program with Glade-2 and C. Now I have a problem I just can't resolve. I'm a kind of newbie with GTK and glade.

If simplifying this problem, there is a textview and a treeview and a
button. When selecting a line from the tree view and pressing the button, the text appears to the text view and user can modify it. Pressing the button after modifying, the text is saved to the tree at the same place where it was selected.

It works fine about 5 times, but after that the tree view is messed up and some errors occur. When trying still use it, it surely will cause a segmentation fault.

It's hard to give any error messages, because they are not always exactly the same, but here's the code and the error messages which it gives right now.

It seems like it somehow looses the tree or model after a while and even if nothing is changed, it still complains that the tree and the model are not the same. It SHOULD upgrade the tree after modifying it... Or am I wrong?

I hope you can help me, I can't find anything reasonible from internet and I really can't say why it won't work. I tried it with two different Linux machines but the result is the same.

t.Noora

The code:
---------

// Global:
int JOB_MOD_ITER = 0;

void
on_modifyJobButton_clicked             (GtkButton       *button,
                                        gpointer         user_data)
{
  GtkWidget* tree;
  GtkWidget* text;
  GtkWidget* label;
  GtkListStore* store;
  GtkTreeModel* model;
  GtkTreeIter iter;
  gchar* buffer;
  GtkTextBuffer* textbuffer;
  GtkTreeSelection *selection;

  tree = lookup_widget(GTK_WIDGET(button),"jobsTreeview");
  text = lookup_widget(GTK_WIDGET(button),"jobTextview");
  label = lookup_widget(GTK_WIDGET(button),"label138");

  const gchar* which = gtk_label_get_text(GTK_LABEL(label));

  // If button is from tree to textview (it's text is "Modify"):
  if ( g_strrstr(which,"Modify") != NULL ) {
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
    gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);

    if ( gtk_tree_selection_get_selected (selection, &model, &iter) ) {
      gtk_tree_model_get(model,&iter,0,&buffer,-1);

      // Saving the line nbr. This could be GtkTreeIter, the result
      // is still the same - segmentation fault.
      JOB_MOD_ITER = nn_set_iter(model,buffer,iter);

      nn_save_text_to_textview(buffer, text);

      if ( model != NULL ) g_object_unref (model);
      g_free(buffer);

      nn_reset_modify_button(GTK_WIDGET(button),"Put back","gtk-media-forward");
    }

  // If button is from text to treeview (it's text is "Put Back"):
  } else {

    GtkTextBuffer* buf;
    GtkTextIter start, end;

    buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
    gtk_text_buffer_get_bounds (buf, &start, &end);
    buffer = gtk_text_buffer_get_text( buf, &start, &end, TRUE ));

    model  = gtk_tree_view_get_model(GTK_TREE_VIEW(tree));

    // If tree view has some values, use it or else create new one
    if ( model != NULL &&
         gtk_tree_model_get_iter_first(model,&iter) ) {

      store = GTK_LIST_STORE(model);
      int round = 0;
      do {
        if (JOB_MOD_ITER == round ) break;
        round++;
      } while ( gtk_tree_model_iter_next(model,&iter) );

    } else {
      store = gtk_list_store_new(1,G_TYPE_STRING);
      gtk_list_store_append(store, &iter);
    }

    gtk_list_store_set( store, &iter, 0, buffer, -1 );
    model = GTK_TREE_MODEL (store);
    tree = gtk_tree_view_new_with_model (model);

    nn_save_text_to_textview("\0",text);

    if ( model != NULL ) g_object_unref (model);
    g_free(buffer);

    nn_reset_modify_button(GTK_WIDGET(button),"Modify","gtk-media-rewind");
  }
}

// This just counts which line of tree we choosed.
int nn_set_iter(GtkTreeModel* model,
                gchar* buffer,
                GtkTreeIter iter) {

  GtkTreeIter miter;
  gchar* value;
  gboolean flag = FALSE;
  int round = 0;

  if ( model != NULL &&
       gtk_tree_model_get_iter_first(model,&miter) ) {

    do {
      gtk_tree_model_get(model,&miter,0,&value,-1);
      int s = 0;
      flag = TRUE;
      if ( g_strrstr(value, buffer) == NULL )
        flag = FALSE;
      else {
        while( value[s] != '\0' && buffer[s] != '\0' ) {
          if ( ( value[s] != buffer[s] ) ||
               ( value[s+1] == '\0' && buffer[s+1] != '\0' ) ||
               ( buffer[s+1] != '\0' && value[s+1] == '\0' ) ) {
            flag = FALSE;
            break;
          }
          s++;
        }
      }
      if ( flag ) return round;
      round++;
    } while ( gtk_tree_model_iter_next(model,&miter) );
  }
  return -1;
}

// This just sets the given string to text view:
void nn_save_text_to_textview(gchar* buffer, GtkWidget* textview) {
  GtkTextBuffer* buf;
  buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
  gtk_text_buffer_set_text( buf, buffer,  -1 );
}

// This changes the text of the button to show which is the issue;
// to modify the selected line from tree OR
// to save the modified line to the tree
void nn_reset_modify_button(GtkWidget* button,gchar* text,gchar* type){

  GtkWidget* butLabel;
  butLabel = lookup_widget(GTK_WIDGET(button), "label138");
  gtk_label_set_text(GTK_LABEL(butLabel),text);

  GtkWidget* butImg;
  butImg = lookup_widget(GTK_WIDGET(button), "image7");
  gtk_image_set_from_stock (GTK_IMAGE(butImg),type, GTK_ICON_SIZE_BUTTON);
}

Errors when using the GUI:
--------------------------

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_row_reference_new_proxy: assertion `GTK_IS_TREE_MODEL (model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): GLib-GObject-CRITICAL **: g_object_set_property: assertion `G_IS_VALUE (value)' failed

(jobitGUI:11255): GLib-GObject-CRITICAL **: g_value_unset: assertion `G_IS_VALUE (value)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_iter_nth_child: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_unref_node: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_row_reference_new_proxy: assertion `GTK_IS_TREE_MODEL (model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_row_reference_new_proxy: assertion `GTK_IS_TREE_MODEL (model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_get_iter: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): Gtk-CRITICAL **: gtk_tree_model_get_value: assertion `GTK_IS_TREE_MODEL (tree_model)' failed

(jobitGUI:11255): GLib-GObject-CRITICAL **: g_object_set_property: assertion `G_IS_VALUE (value)' failed

(jobitGUI:11255): GLib-GObject-CRITICAL **: g_value_unset: assertion `G_IS_VALUE (value)' failed

...and so on...




- Noora Nurminen                              - noora nurminen tut fi
- Tampere University of Technology            - room TC317
- Research Assistant, Digital Media Institute - gsm +358-40-7024-582

                               (o-
                               / \   -o"
                           ___ v_/_  (_) _____





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