pspp-cvs
[Top][All Lists]
Advanced

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

[Pspp-cvs] pspp lib/gtksheet/gtksheet.c src/ui/gui/ChangeL...


From: John Darrington
Subject: [Pspp-cvs] pspp lib/gtksheet/gtksheet.c src/ui/gui/ChangeL...
Date: Sun, 03 Feb 2008 12:09:25 +0000

CVSROOT:        /sources/pspp
Module name:    pspp
Changes by:     John Darrington <jmd>   08/02/03 12:09:25

Modified files:
        lib/gtksheet   : gtksheet.c 
        src/ui/gui     : ChangeLog compute-dialog.c data-editor.c 
                         psppire-case-file.c psppire-case-file.h 
                         psppire-data-store.c psppire-data-store.h 
                         psppire-dialog.c 

Log message:
        Fixed various memory leaks in GUI

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/pspp/lib/gtksheet/gtksheet.c?cvsroot=pspp&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/ChangeLog?cvsroot=pspp&r1=1.103&r2=1.104
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/compute-dialog.c?cvsroot=pspp&r1=1.13&r2=1.14
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/data-editor.c?cvsroot=pspp&r1=1.58&r2=1.59
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-case-file.c?cvsroot=pspp&r1=1.32&r2=1.33
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-case-file.h?cvsroot=pspp&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-data-store.c?cvsroot=pspp&r1=1.53&r2=1.54
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-data-store.h?cvsroot=pspp&r1=1.21&r2=1.22
http://cvs.savannah.gnu.org/viewcvs/pspp/src/ui/gui/psppire-dialog.c?cvsroot=pspp&r1=1.11&r2=1.12

Patches:
Index: lib/gtksheet/gtksheet.c
===================================================================
RCS file: /sources/pspp/pspp/lib/gtksheet/gtksheet.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- lib/gtksheet/gtksheet.c     2 Feb 2008 06:40:29 -0000       1.32
+++ lib/gtksheet/gtksheet.c     3 Feb 2008 12:09:24 -0000       1.33
@@ -136,10 +136,13 @@
        pango_context_get_metrics (context,
                                   widget->style->font_desc,
                                   pango_context_get_language (context));
+
       guint val = pango_font_metrics_get_descent (metrics) +
        pango_font_metrics_get_ascent (metrics);
+
       pango_font_metrics_unref (metrics);
-      return PANGO_PIXELS (val)+2 * CELLOFFSET;
+
+      return PANGO_PIXELS (val) + 2 * CELLOFFSET;
     }
 }
 
@@ -6702,7 +6705,7 @@
 {
   GdkWindow *window = NULL;
   GdkRectangle allocation;
-  GtkSheetButton *button = NULL;
+
   gboolean is_sensitive = FALSE;
 
   if (!GTK_WIDGET_REALIZED (GTK_WIDGET (sheet))) return;
@@ -6731,7 +6734,7 @@
     }
   else
     {
-      button = xxx_column_button (sheet, column);
+      GtkSheetButton *button = xxx_column_button (sheet, column);
       allocation.x = COLUMN_LEFT_XPIXEL (sheet, column) + CELL_SPACING;
       if (sheet->row_titles_visible)
        allocation.x -= sheet->row_title_area.width;
@@ -6741,6 +6744,12 @@
       is_sensitive = xxx_column_is_sensitive (sheet, column);
       gtk_sheet_button_draw (sheet, window, button,
                             is_sensitive, allocation);
+
+      /* FIXME: Not freeing this button is correct (sort of),
+      because in PSPP the model always returns a static copy */
+
+      /* gtk_sheet_button_free (button); */
+
     }
 }
 
@@ -7640,11 +7649,14 @@
 {
   GtkRequisition button_requisition;
   GList *children;
+  GtkSheetButton *button = xxx_column_button (sheet, col);
 
   gtk_sheet_button_size_request (sheet,
-                                xxx_column_button (sheet, col),
+                                button,
                                 &button_requisition);
 
+  gtk_sheet_button_free (button);
+
   *requisition = button_requisition.width;
 
   children = sheet->children;

Index: src/ui/gui/ChangeLog
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/ChangeLog,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -b -r1.103 -r1.104
--- src/ui/gui/ChangeLog        29 Jan 2008 11:12:59 -0000      1.103
+++ src/ui/gui/ChangeLog        3 Feb 2008 12:09:24 -0000       1.104
@@ -1,3 +1,11 @@
+2008-02-03  John Darrington <address@hidden>
+
+        * psppire-case-file.c psppire-case-file.h: Dont clone the casereader
+       before creating datasheet.  Add properties instead of direct code 
+        in _new function.
+
+        * psppire-data-store.c:  Implement proper dispose function.
+
 2008-01-29  John Darrington <address@hidden>
 
        * psppire-var-ptr.c psppire-var-ptr.h: New files

Index: src/ui/gui/compute-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/compute-dialog.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- src/ui/gui/compute-dialog.c 29 Jan 2008 11:12:59 -0000      1.13
+++ src/ui/gui/compute-dialog.c 3 Feb 2008 12:09:25 -0000       1.14
@@ -153,7 +153,7 @@
   gchar *text;
   GString *string ;
   const gchar *target_name ;
-  const gchar *expression;
+  gchar *expression;
   const gchar *label;
   GtkTextIter start, end;
   GtkWidget *target = get_widget_assert   (cd->xml, "compute-entry1");
@@ -208,6 +208,9 @@
 
   g_string_append (string, "EXECUTE.\n");
 
+
+  g_free (expression);
+
   text = string->str;
 
   g_string_free (string, FALSE);

Index: src/ui/gui/data-editor.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/data-editor.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- src/ui/gui/data-editor.c    29 Jan 2008 11:12:59 -0000      1.58
+++ src/ui/gui/data-editor.c    3 Feb 2008 12:09:25 -0000       1.59
@@ -1201,6 +1201,7 @@
                                  gtk_toggle_action_get_active (ta));
 }
 
+extern PsppireDataStore *the_data_store ;
 
 static void
 file_quit (GtkCheckMenuItem *menuitem, gpointer data)
@@ -1208,6 +1209,7 @@
   /* FIXME: Need to be more intelligent here.
      Give the user the opportunity to save any unsaved data.
   */
+  g_object_unref (the_data_store);
   gtk_main_quit ();
 }
 

Index: src/ui/gui/psppire-case-file.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-case-file.c,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -b -r1.32 -r1.33
--- src/ui/gui/psppire-case-file.c      2 Feb 2008 06:40:29 -0000       1.32
+++ src/ui/gui/psppire-case-file.c      3 Feb 2008 12:09:25 -0000       1.33
@@ -80,16 +80,91 @@
   return object_type;
 }
 
+/* Properties */
+enum
+{
+  PROP_0,
+  PROP_DATASHEET,
+  PROP_READER
+};
+
+
+
+
+static void
+psppire_case_file_set_property (GObject         *object,
+                               guint            prop_id,
+                               const GValue    *value,
+                               GParamSpec      *pspec)
+
+{
+  PsppireCaseFile *cf = PSPPIRE_CASE_FILE (object);
+
+  switch (prop_id)
+    {
+    case PROP_READER:
+      cf->datasheet = datasheet_create (g_value_get_pointer (value));
+      cf->accessible = TRUE;
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
+static void
+psppire_case_file_get_property (GObject         *object,
+                               guint            prop_id,
+                               GValue          *value,
+                               GParamSpec      *pspec)
+{
+  PsppireCaseFile *cf = PSPPIRE_CASE_FILE (object);
+
+  switch (prop_id)
+    {
+    case PROP_DATASHEET:
+      g_value_set_pointer (value, cf->datasheet);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+    };
+}
+
 
 static void
 psppire_case_file_class_init (PsppireCaseFileClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
+  GParamSpec *datasheet_spec ;
+  GParamSpec *reader_spec ;
 
   parent_class = g_type_class_peek_parent (class);
 
   object_class->finalize = psppire_case_file_finalize;
 
+  datasheet_spec =
+    g_param_spec_pointer ("datasheet",
+                         "Datasheet",
+                         "A pointer to the datasheet belonging to this object",
+                         G_PARAM_READABLE );
+  reader_spec =
+    g_param_spec_pointer ("casereader",
+                         "CaseReader",
+                         "A pointer to the case reader from which this object 
is constructed",
+                         G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE );
+
+  object_class->set_property = psppire_case_file_set_property;
+  object_class->get_property = psppire_case_file_get_property;
+
+  g_object_class_install_property (object_class,
+                                   PROP_DATASHEET,
+                                   datasheet_spec);
+
+  g_object_class_install_property (object_class,
+                                   PROP_READER,
+                                   reader_spec);
+
   signals [CASE_CHANGED] =
     g_signal_new ("case-changed",
                  G_TYPE_FROM_CLASS (class),
@@ -152,14 +227,11 @@
  * Creates a new #PsppireCaseFile.
  */
 PsppireCaseFile*
-psppire_case_file_new (const struct casereader *reader)
+psppire_case_file_new (struct casereader *reader)
 {
-  PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL);
-
-  cf->datasheet = datasheet_create (casereader_clone (reader));
-  cf->accessible = TRUE;
-
-  return cf;
+  return g_object_new (G_TYPE_PSPPIRE_CASE_FILE,
+                      "casereader", reader,
+                      NULL);
 }
 
 

Index: src/ui/gui/psppire-case-file.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-case-file.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- src/ui/gui/psppire-case-file.h      18 Jul 2007 05:32:22 -0000      1.19
+++ src/ui/gui/psppire-case-file.h      3 Feb 2008 12:09:25 -0000       1.20
@@ -67,7 +67,7 @@
 /* -- PsppireCaseFile --- */
 GType          psppire_case_file_get_type (void);
 
-PsppireCaseFile *psppire_case_file_new (const struct casereader *);
+PsppireCaseFile *psppire_case_file_new (struct casereader *);
 
 gboolean psppire_case_file_insert_case (PsppireCaseFile *cf, struct ccase *c, 
casenumber row);
 

Index: src/ui/gui/psppire-data-store.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-data-store.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -b -r1.53 -r1.54
--- src/ui/gui/psppire-data-store.c     19 Sep 2007 04:29:00 -0000      1.53
+++ src/ui/gui/psppire-data-store.c     3 Feb 2008 12:09:25 -0000       1.54
@@ -48,6 +48,7 @@
 static void psppire_data_store_sheet_row_init (GSheetRowIface *iface);
 
 static void psppire_data_store_finalize        (GObject           *object);
+static void psppire_data_store_dispose        (GObject           *object);
 
 static gboolean psppire_data_store_clear_datum (GSheetModel *model,
                                          glong row, glong column);
@@ -137,6 +138,7 @@
   object_class = (GObjectClass*) class;
 
   object_class->finalize = psppire_data_store_finalize;
+  object_class->dispose = psppire_data_store_dispose;
 
   signals [FONT_CHANGED] =
     g_signal_new ("font_changed",
@@ -182,10 +184,9 @@
 psppire_data_store_init (PsppireDataStore *data_store)
 {
   data_store->dict = 0;
-  data_store->case_file = 0;
+  data_store->case_file = NULL;
   data_store->width_of_m = 10;
-
-
+  data_store->dispose_has_run = FALSE;
 }
 
 const PangoFontDescription *
@@ -396,10 +397,8 @@
                                  PsppireCaseFile *cf)
 {
   gint i;
-  if ( ds->case_file)
-    {
-      g_object_unref (ds->case_file);
-    }
+  if ( ds->case_file)  g_object_unref (ds->case_file);
+
 
   ds->case_file = cf;
 
@@ -515,6 +514,24 @@
   (* parent_class->finalize) (object);
 }
 
+
+static void
+psppire_data_store_dispose (GObject *object)
+{
+  PsppireDataStore *ds = PSPPIRE_DATA_STORE (object);
+
+  if (ds->dispose_has_run)
+    return;
+
+  if (ds->case_file) g_object_unref (ds->case_file);
+
+  /* must chain up */
+  (* parent_class->dispose) (object);
+
+  ds->dispose_has_run = TRUE;
+}
+
+
 gboolean
 psppire_data_store_delete_cases (PsppireDataStore *ds,
                                 casenumber first, casenumber count)

Index: src/ui/gui/psppire-data-store.h
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-data-store.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -b -r1.21 -r1.22
--- src/ui/gui/psppire-data-store.h     19 Sep 2007 04:29:00 -0000      1.21
+++ src/ui/gui/psppire-data-store.h     3 Feb 2008 12:09:25 -0000       1.22
@@ -81,6 +81,7 @@
   GObject parent;
 
   /*< private >*/
+  gboolean dispose_has_run ;
   PsppireDict *dict;
   PsppireCaseFile *case_file;
   const PangoFontDescription *font_desc;

Index: src/ui/gui/psppire-dialog.c
===================================================================
RCS file: /sources/pspp/pspp/src/ui/gui/psppire-dialog.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -b -r1.11 -r1.12
--- src/ui/gui/psppire-dialog.c 29 Jan 2008 11:13:00 -0000      1.11
+++ src/ui/gui/psppire-dialog.c 3 Feb 2008 12:09:25 -0000       1.12
@@ -428,6 +428,8 @@
 
   g_main_loop_run (dialog->loop);
 
+  g_main_loop_unref (dialog->loop);
+
   return dialog->response;
 }
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]