/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2009 Free Software Foundation
+ Copyright (C) 2009, 2010 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
*/
#include <config.h>
+#include <errno.h>
#include <stdio.h>
+#include <sys/stat.h>
+
+#include <glib.h>
#include "psppire-conf.h"
NULL);
}
-static void
-conf_write (PsppireConf *conf)
+static gboolean
+flush_conf (PsppireConf *conf)
{
gsize length = 0;
}
g_free (kf);
+ conf->idle = 0;
+ return FALSE;
+}
+
+static void
+conf_write (PsppireConf *conf)
+{
+ if ( conf->idle == 0)
+ conf->idle = g_idle_add_full (G_PRIORITY_LOW,
+ (GSourceFunc) flush_conf, conf, NULL);
}
+
static void
psppire_conf_dispose (GObject *object)
{
static void
psppire_conf_init (PsppireConf *conf)
{
- const gchar *dirname = g_get_user_config_dir ();
+ const gchar *dirname;
+ struct stat s;
+
+ /* Get the name of the directory for user configuration files, then, if it
+ doesn't already exist, create it, since we might be the first program
+ to want to put files there. */
+ dirname = g_get_user_config_dir ();
+ if (stat (dirname, &s) == -1 && errno == ENOENT)
+ mkdir (dirname, 0700);
conf->filename = g_strdup_printf ("%s/%s", dirname, "psppirerc");
conf->keyfile = g_key_file_new ();
conf->dispose_has_run = FALSE;
+ conf->idle = 0;
}
}
+
+gboolean
+psppire_conf_get_string (PsppireConf *conf, const gchar *base,
+ const gchar *name, gchar **value)
+{
+ gboolean ok;
+ gchar *b;
+ GError *err = NULL;
+ conf_read (conf);
+ b = g_key_file_get_string (conf->keyfile,
+ base,
+ name, &err);
+
+ ok = (err == NULL);
+ if ( err != NULL )
+ g_error_free (err);
+
+ if (ok)
+ *value = b;
+
+ return ok;
+}
+
+
+
+
+gboolean
+psppire_conf_get_variant (PsppireConf *conf, const gchar *base,
+ const gchar *name, GVariant **v)
+{
+ gboolean ok;
+ gchar *b;
+ GError *err = NULL;
+ conf_read (conf);
+ b = g_key_file_get_string (conf->keyfile,
+ base,
+ name, &err);
+
+ ok = (err == NULL);
+ if ( err != NULL )
+ g_error_free (err);
+
+ if (ok)
+ {
+ *v = g_variant_parse (NULL, b, NULL, NULL, NULL);
+ g_free (b);
+ }
+
+ return ok;
+}
+
+gboolean
+psppire_conf_get_enum (PsppireConf *conf, const gchar *base,
+ const gchar *name,
+ GType t,
+ int *v)
+{
+ gboolean ok;
+ gchar *b;
+ GError *err = NULL;
+ conf_read (conf);
+ b = g_key_file_get_string (conf->keyfile,
+ base,
+ name, &err);
+
+ ok = (err == NULL);
+ if ( err != NULL )
+ g_error_free (err);
+
+ if (ok)
+ {
+ GEnumClass *ec = g_type_class_ref (t);
+ GEnumValue *ev = g_enum_get_value_by_nick (ec, b);
+ *v = ev->value;
+ g_type_class_unref (ec);
+ g_free (b);
+ }
+
+ return ok;
+}
+
void
psppire_conf_set_int (PsppireConf *conf,
const gchar *base, const gchar *name,
conf_write (conf);
}
+
+void
+psppire_conf_set_string (PsppireConf *conf,
+ const gchar *base, const gchar *name,
+ const gchar *value)
+{
+ g_key_file_set_string (conf->keyfile, base, name, value);
+ conf_write (conf);
+}
+
+void
+psppire_conf_set_variant (PsppireConf *conf,
+ const gchar *base, const gchar *name,
+ GVariant *value)
+{
+ gchar *v = g_variant_print (value, FALSE);
+ g_key_file_set_string (conf->keyfile, base, name, v);
+ conf_write (conf);
+ g_free (v);
+}
+
+void
+psppire_conf_set_enum (PsppireConf *conf,
+ const gchar *base, const gchar *name,
+ GType enum_type,
+ int value)
+{
+ GEnumClass *ec = g_type_class_ref (enum_type);
+ GEnumValue *ev = g_enum_get_value (ec, value);
+
+ g_key_file_set_string (conf->keyfile, base, name,
+ ev->value_nick);
+
+ g_type_class_unref (ec);
+
+ conf_write (conf);
+}
+
+
+
/*
A convenience function to set the geometry of a
window from from a saved config
void
psppire_conf_save_window_geometry (PsppireConf *conf,
const gchar *base,
- GdkEvent *e)
+ GtkWindow *gtk_window)
{
- switch (e->type)
- {
- case GDK_CONFIGURE:
- {
- GdkEventConfigure *event = &e->configure;
+ gboolean maximized;
+ GdkWindow *w;
- if ( gdk_window_get_state (event->window) &
- GDK_WINDOW_STATE_MAXIMIZED )
- return;
+ w = gtk_widget_get_window (GTK_WIDGET (gtk_window));
+ if (w == NULL)
+ return;
- psppire_conf_set_int (conf, base, "height", event->height);
- psppire_conf_set_int (conf, base, "width", event->width);
+ maximized = (gdk_window_get_state (w) & GDK_WINDOW_STATE_MAXIMIZED) != 0;
+ psppire_conf_set_boolean (conf, base, "maximize", maximized);
- psppire_conf_set_int (conf, base, "x", event->x);
- psppire_conf_set_int (conf, base, "y", event->y);
- }
- break;
- case GDK_WINDOW_STATE:
- {
- GdkEventWindowState *event = &e->window_state;
+ if (!maximized)
+ {
+ gint x, y;
- psppire_conf_set_boolean (conf, base, "maximize",
- event->new_window_state &
- GDK_WINDOW_STATE_MAXIMIZED );
- }
- break;
- default:
- break;
- };
+ gint width = gdk_window_get_width (w);
+ gint height= gdk_window_get_height (w);
+ gdk_window_get_position (w, &x, &y);
+
+ psppire_conf_set_int (conf, base, "height", height);
+ psppire_conf_set_int (conf, base, "width", width);
+ psppire_conf_set_int (conf, base, "x", x);
+ psppire_conf_set_int (conf, base, "y", y);
+ }
}