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