pspp-dev
[Top][All Lists]
Advanced

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

[PATCH 1/4] gui: Fix Glib-GObject-WARNING when closing the active datase


From: Ben Pfaff
Subject: [PATCH 1/4] gui: Fix Glib-GObject-WARNING when closing the active dataset.
Date: Sat, 7 Jul 2012 23:49:13 -0700

The DATASET CLOSE command, when it act on the active dataset, just
removes the active dataset's name, changing it to the empty string.
(This is the documented behavior.)  However, the GUI relies on
every dataset having a name, so this caused the following warning:

GLib-GObject-WARNING **: value """" of type `gchararray' is invalid
or out of range for property `id' of type `gchararray'

This commit fixes the problem by giving any unnamed dataset a name
after running syntax.
---
 src/data/session.c               |   17 ++++++++++++++++-
 src/data/session.h               |    4 +++-
 src/ui/gui/executor.c            |   18 +++++++++++++++++-
 src/ui/gui/psppire-data-window.c |    5 +----
 4 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/src/data/session.c b/src/data/session.c
index 24c22b2..71ded6a 100644
--- a/src/data/session.c
+++ b/src/data/session.c
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -35,6 +35,7 @@ struct session
     struct hmapx datasets;
     struct dataset *active;
     char *syntax_encoding;      /* Default encoding for syntax files. */
+    int n_dataset_names;        /* For session_generate_dataset_name(). */
   };
 
 static struct hmapx_node *session_lookup_dataset__ (const struct session *,
@@ -49,6 +50,7 @@ session_create (void)
   hmapx_init (&s->datasets);
   s->active = NULL;
   s->syntax_encoding = xstrdup ("Auto");
+  s->n_dataset_names = 0;
   return s;
 }
 
@@ -164,6 +166,19 @@ session_get_dataset_by_seqno (const struct session *s, 
unsigned int seqno)
       return ds;
   return NULL;
 }
+
+/* Returns an identifier that is is not currently in use as a dataset name. */
+char *
+session_generate_dataset_name (struct session *s)
+{
+  for (;;)
+    {
+      char *name = xasprintf ("DataSet%d", ++s->n_dataset_names);
+      if (!session_lookup_dataset (s, name))
+        return name;
+      free (name);
+    }
+}
 
 static struct hmapx_node *
 session_lookup_dataset__ (const struct session *s_, const char *name)
diff --git a/src/data/session.h b/src/data/session.h
index f45cceb..b61c394 100644
--- a/src/data/session.h
+++ b/src/data/session.h
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -44,4 +44,6 @@ void session_for_each_dataset (const struct session *,
 struct dataset *session_get_dataset_by_seqno (const struct session *,
                                               unsigned int seqno);
 
+char *session_generate_dataset_name (struct session *);
+
 #endif /* session.h */
diff --git a/src/ui/gui/executor.c b/src/ui/gui/executor.c
index 8fb4c26..ee83c2c 100644
--- a/src/ui/gui/executor.c
+++ b/src/ui/gui/executor.c
@@ -1,5 +1,5 @@
 /* PSPPIRE - a graphical user interface for PSPP.
-   Copyright (C) 2007, 2009, 2010, 2011  Free Software Foundation
+   Copyright (C) 2007, 2009, 2010, 2011, 2012  Free Software Foundation
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -36,6 +36,20 @@ create_casereader_from_data_store (void *data_store_)
   return psppire_data_store_get_reader (data_store);
 }
 
+/* Ensures that dataset DS has a name, because some parts of the GUI insist
+   upon this. */
+static void
+name_dataset_cb (struct dataset *ds, void *aux UNUSED)
+{
+  if (dataset_name (ds)[0] == '\0')
+    {
+      struct session *session = dataset_session (ds);
+      char *dataset_name = session_generate_dataset_name (session);
+      dataset_set_name (ds, dataset_name);
+      free (dataset_name);
+    }
+}
+
 static void
 new_pdw_cb (struct dataset *ds, void *aux UNUSED)
 {
@@ -131,6 +145,8 @@ execute_syntax (PsppireDataWindow *window, struct 
lex_reader *lex_reader)
        break;
     }
 
+  session_for_each_dataset (the_session, name_dataset_cb, NULL);
+
   ll_for_each_safe (pdw, next_pdw, PsppireDataWindow, ll, &all_data_windows)
     {
       struct dataset *ds;
diff --git a/src/ui/gui/psppire-data-window.c b/src/ui/gui/psppire-data-window.c
index 6dc422e..c22f7bb 100644
--- a/src/ui/gui/psppire-data-window.c
+++ b/src/ui/gui/psppire-data-window.c
@@ -1288,10 +1288,7 @@ psppire_data_window_new (struct dataset *ds)
 
   if (ds == NULL)
     {
-      static int n_datasets;
-      char *dataset_name;
-
-      dataset_name = xasprintf ("DataSet%d", ++n_datasets);
+      char *dataset_name = session_generate_dataset_name (the_session);
       ds = dataset_create (the_session, dataset_name);
       free (dataset_name);
     }
-- 
1.7.2.5




reply via email to

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