On 8/5/07, Patrick Hallinan <[EMAIL PROTECTED]> wrote:
>
> On 7/22/07, Steffen Macke <[EMAIL PROTECTED]> wrote:
> >
> > Hi Patrick,
> >
> > the patch looks fine, I've applied it to the SVN repository.
> >
> > The "x" to close a tab is still not working for me.
>
>
> I've attached a patch to fix the "x" close tab problem.  It couldn't work
> on any system the way it was.  I must have made a last minute change and
> tested the change without compiling or something.
>
> This is a cleanup patch that fixes memory management for the exit_dialog
and changes the the integrated ui diagram_modified_handler to use dia's
diagram_get_name() instead of making up my own.  It should not introduce any
visible changes.

As of now I am not aware of any bugs in my changes (I'm not counting pending
tasks).  Please let me know if you know of any.

Pat.
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 <glib.h>
 
-#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);
+
   /* <from GEdit> */
   /* 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 |
_______________________________________________
Dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://live.gnome.org/Dia/Faq
Main page at http://live.gnome.org/Dia

Reply via email to