Index: app_procs.c =================================================================== --- app_procs.c (revision 3734) +++ app_procs.c (working copy) @@ -1039,6 +1039,7 @@ const gchar * name = diagram_get_name (diagram); const gchar * path = diagram->filename; exit_dialog_add_item (dialog, name, path, diagram); + g_free (name); } list = g_slist_next (list); Index: exit_dialog.c =================================================================== --- exit_dialog.c (revision 3734) +++ exit_dialog.c (working copy) @@ -31,7 +31,7 @@ #include -#define EXIT_DIALOG_ITEM_DATA _("EXIT_DIALOG_ITEM_DATA") +#define EXIT_DIALOG_TREEVIEW "EXIT_DIALOG_TREEVIEW" enum { CHECK_COL, @@ -41,13 +41,6 @@ NUM_COL }; -typedef struct -{ - GSList * item_list; - GtkTreeView * treeview; - -} exit_dialog_item_data_t; - static void selected_state_set_all (GtkTreeView * treeview, gboolean state); @@ -55,6 +48,9 @@ exit_dialog_item_array_t ** items); /* Event Handlers */ +static void exit_dialog_destroy (GtkWidget * exit_dialog, + gpointer data); + static void select_all_clicked (GtkButton * button, gpointer data); @@ -100,8 +96,6 @@ GtkCellRenderer * renderer; GtkTreeViewColumn * column; - exit_dialog_item_data_t * data; - gtk_box_pack_start (vbox, label, FALSE, FALSE, 0); gtk_widget_show (label); @@ -165,16 +159,14 @@ g_object_unref (model); gtk_widget_show (GTK_WIDGET (treeview)); - list = g_slist_alloc (); - - data = g_malloc (sizeof (exit_dialog_item_data_t)); - data->item_list = list; - data->treeview = GTK_TREE_VIEW (treeview); - gtk_widget_show_all (GTK_WIDGET(vbox)); - g_object_set_data (G_OBJECT (dialog), EXIT_DIALOG_ITEM_DATA, data); + g_object_set_data (G_OBJECT (dialog), EXIT_DIALOG_TREEVIEW, treeview); + g_signal_connect (G_OBJECT (dialog), "destroy", + G_CALLBACK (exit_dialog_destroy), + treeview); + return dialog; } @@ -191,20 +183,22 @@ const gchar * path, const gpointer optional_data) { + GtkTreeView * treeview; GtkTreeIter iter; GtkListStore * model; + const gchar * name_copy = g_strdup (name); + const gchar * path_copy = g_strdup (path); - exit_dialog_item_data_t * data = - g_object_get_data (G_OBJECT (dialog), EXIT_DIALOG_ITEM_DATA); + treeview = g_object_get_data (G_OBJECT (dialog), EXIT_DIALOG_TREEVIEW); - model = GTK_LIST_STORE (gtk_tree_view_get_model (data->treeview)); + model = GTK_LIST_STORE (gtk_tree_view_get_model (treeview)); gtk_list_store_append (model, &iter); gtk_list_store_set (model, &iter, CHECK_COL, 1, - NAME_COL, name, - PATH_COL, path, + NAME_COL, name_copy, + PATH_COL, path_copy, DATA_COL, optional_data, -1); } @@ -267,7 +261,7 @@ get_selected_items (GtkWidget * dialog, exit_dialog_item_array_t ** items) { - exit_dialog_item_data_t * data; + GtkTreeView * treeview; GtkTreeIter iter; GtkListStore * model; gboolean valid; @@ -276,9 +270,9 @@ gint selected_count; gint i; - data = g_object_get_data (G_OBJECT (dialog), EXIT_DIALOG_ITEM_DATA); + treeview = g_object_get_data (G_OBJECT (dialog), EXIT_DIALOG_TREEVIEW); - model = GTK_LIST_STORE (gtk_tree_view_get_model (data->treeview)); + model = GTK_LIST_STORE (gtk_tree_view_get_model (treeview)); /* Get the first iter in the list */ valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter); @@ -380,6 +374,44 @@ } } +/* + * Signal handler for "destroy" event to free memory allocated for the exit_dialog. + * + * @param exit_dialog + * @param data Exit dialog's treeview + */ +static void exit_dialog_destroy (GtkWidget * exit_dialog, + gpointer data) +{ + GtkTreeView * treeview; + GtkTreeIter iter; + GtkTreeModel * model; + gboolean valid; + + treeview = g_object_get_data (G_OBJECT (exit_dialog), EXIT_DIALOG_TREEVIEW); + + model = GTK_TREE_MODEL (gtk_tree_view_get_model (treeview)); + + /* Get the first iter in the list */ + valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter); + + while (valid) + { + gchar * name = NULL; + gchar * path = NULL; + + gtk_tree_model_get (model, &iter, + NAME_COL, &name, + PATH_COL, &path, + -1); + + g_free (name); + g_free (path); + + valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter); + } +} + /** * Sets the state of the save checkbox in the treeview to the * state specified by the caller. Index: interface.c =================================================================== --- interface.c (revision 3734) +++ interface.c (working copy) @@ -447,19 +447,9 @@ { GtkLabel * label = g_object_get_data (G_OBJECT (ddisp->container), "tab-label"); const gchar * name; - const gchar * sep; - sep = g_strrstr (ddisp->diagram->filename,G_DIR_SEPARATOR_S); + name = diagram_get_name (ddisp->diagram); - if (sep) - { - name = sep + 1; /* IS THIS PORTABLE??? */ - } - else - { - name = ddisp->diagram->filename; - } - if (diagram_is_modified (ddisp->diagram)) { const gchar * text = g_strdup_printf ("*%s",name); @@ -470,6 +460,8 @@ { gtk_label_set_text (label,name); } + + g_free (name); } /** @@ -505,6 +497,9 @@ gtk_box_pack_start( GTK_BOX(tab_label_container), label, FALSE, FALSE, 0 ); gtk_widget_show (label); + /* Create a new tab page */ + ddisp->container = gtk_vbox_new(FALSE, 0); + /* */ /* don't allow focus on the close button */ close_button = gtk_button_new(); @@ -529,8 +524,7 @@ gtk_widget_show (close_button); gtk_widget_show (image); - /* Create a new tab page */ - ddisp->container = gtk_vbox_new(FALSE, 0); + /* Set events for new tab page */ gtk_widget_set_events (ddisp->container, GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK |