1 /* PSPPIRE - a graphical user interface for PSPP.
2 Copyright (C) 2009, 2010 Free Software Foundation
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 This module provides an interface for simple user preference config
29 #include "psppire-conf.h"
31 static void psppire_conf_init (PsppireConf *conf);
32 static void psppire_conf_class_init (PsppireConfClass *class);
34 static void psppire_conf_finalize (GObject *object);
35 static void psppire_conf_dispose (GObject *object);
37 static GObjectClass *parent_class = NULL;
41 psppire_conf_get_type (void)
43 static GType conf_type = 0;
47 static const GTypeInfo conf_info =
49 sizeof (PsppireConfClass),
51 NULL, /* base_finalize */
52 (GClassInitFunc) psppire_conf_class_init,
53 NULL, /* class_finalize */
54 NULL, /* class_data */
57 (GInstanceInitFunc) psppire_conf_init,
60 conf_type = g_type_register_static (G_TYPE_OBJECT,
70 conf_read (PsppireConf *conf)
72 g_key_file_load_from_file (conf->keyfile,
74 G_KEY_FILE_KEEP_COMMENTS,
79 flush_conf (PsppireConf *conf)
83 gchar *kf = g_key_file_to_data (conf->keyfile, &length, NULL);
85 if (! g_file_set_contents (conf->filename, kf, length, NULL))
87 char *msg = strerror (errno);
88 g_warning ("Cannot open %s for writing: %s", conf->filename, msg);
97 conf_write (PsppireConf *conf)
100 conf->idle = g_idle_add_full (G_PRIORITY_LOW,
101 (GSourceFunc) flush_conf, conf, NULL);
106 psppire_conf_dispose (GObject *object)
111 psppire_conf_finalize (GObject *object)
113 PsppireConf *conf = PSPPIRE_CONF (object);
114 g_key_file_free (conf->keyfile);
115 g_free (conf->filename);
119 static PsppireConf *the_instance = NULL;
122 psppire_conf_construct (GType type,
123 guint n_construct_params,
124 GObjectConstructParam *construct_params)
130 object = G_OBJECT_CLASS (parent_class)->constructor (type,
133 the_instance = PSPPIRE_CONF (object);
136 object = g_object_ref (G_OBJECT (the_instance));
142 psppire_conf_class_init (PsppireConfClass *class)
144 GObjectClass *object_class;
146 parent_class = g_type_class_peek_parent (class);
147 object_class = (GObjectClass*) class;
149 object_class->finalize = psppire_conf_finalize;
150 object_class->dispose = psppire_conf_dispose;
151 object_class->constructor = psppire_conf_construct;
156 psppire_conf_init (PsppireConf *conf)
158 const gchar *dirname;
161 /* Get the name of the directory for user configuration files, then, if it
162 doesn't already exist, create it, since we might be the first program
163 to want to put files there. */
164 dirname = g_get_user_config_dir ();
165 if (stat (dirname, &s) == -1 && errno == ENOENT)
166 mkdir (dirname, 0700);
168 conf->filename = g_strdup_printf ("%s/%s", dirname, "psppirerc");
170 conf->keyfile = g_key_file_new ();
177 psppire_conf_new (void)
179 return g_object_new (psppire_conf_get_type (), NULL);
185 psppire_conf_get_int (PsppireConf *conf, const gchar *base,
186 const gchar *name, gint *value)
191 *value = g_key_file_get_integer (conf->keyfile,
203 psppire_conf_get_boolean (PsppireConf *conf, const gchar *base,
204 const gchar *name, gboolean *value)
210 b = g_key_file_get_boolean (conf->keyfile,
227 psppire_conf_get_string (PsppireConf *conf, const gchar *base,
228 const gchar *name, gchar **value)
234 b = g_key_file_get_string (conf->keyfile,
252 psppire_conf_get_variant (PsppireConf *conf, const gchar *base,
253 const gchar *name, GVariant **v)
259 b = g_key_file_get_string (conf->keyfile,
269 *v = g_variant_parse (NULL, b, NULL, NULL, NULL);
277 psppire_conf_get_enum (PsppireConf *conf, const gchar *base,
286 b = g_key_file_get_string (conf->keyfile,
296 GEnumClass *ec = g_type_class_ref (t);
297 GEnumValue *ev = g_enum_get_value_by_nick (ec, b);
299 g_type_class_unref (ec);
307 psppire_conf_set_int (PsppireConf *conf,
308 const gchar *base, const gchar *name,
311 g_key_file_set_integer (conf->keyfile, base, name, value);
316 psppire_conf_set_boolean (PsppireConf *conf,
317 const gchar *base, const gchar *name,
320 g_key_file_set_boolean (conf->keyfile, base, name, value);
326 psppire_conf_set_string (PsppireConf *conf,
327 const gchar *base, const gchar *name,
330 g_key_file_set_string (conf->keyfile, base, name, value);
335 psppire_conf_set_variant (PsppireConf *conf,
336 const gchar *base, const gchar *name,
339 gchar *v = g_variant_print (value, FALSE);
340 g_key_file_set_string (conf->keyfile, base, name, v);
346 psppire_conf_set_enum (PsppireConf *conf,
347 const gchar *base, const gchar *name,
351 GEnumClass *ec = g_type_class_ref (enum_type);
352 GEnumValue *ev = g_enum_get_value (ec, value);
354 g_key_file_set_string (conf->keyfile, base, name,
357 g_type_class_unref (ec);
365 A convenience function to set the geometry of a
366 window from from a saved config
369 psppire_conf_set_window_geometry (PsppireConf *conf,
377 if (psppire_conf_get_int (conf, base, "height", &height)
379 psppire_conf_get_int (conf, base, "width", &width))
381 gtk_window_set_default_size (window, width, height);
384 if (psppire_conf_get_int (conf, base, "x", &x)
386 psppire_conf_get_int (conf, base, "y", &y))
388 gtk_window_move (window, x, y);
391 if (psppire_conf_get_boolean (conf, base, "maximize", &maximize))
394 gtk_window_maximize (window);
396 gtk_window_unmaximize (window);
402 A convenience function to save the window geometry.
403 This should typically be called from a window's
404 "configure-event" and "window-state-event" signal handlers
407 psppire_conf_save_window_geometry (PsppireConf *conf,
409 GtkWindow *gtk_window)
414 w = gtk_widget_get_window (GTK_WIDGET (gtk_window));
418 maximized = (gdk_window_get_state (w) & GDK_WINDOW_STATE_MAXIMIZED) != 0;
419 psppire_conf_set_boolean (conf, base, "maximize", maximized);
425 gint width = gdk_window_get_width (w);
426 gint height= gdk_window_get_height (w);
428 gdk_window_get_position (w, &x, &y);
430 psppire_conf_set_int (conf, base, "height", height);
431 psppire_conf_set_int (conf, base, "width", width);
432 psppire_conf_set_int (conf, base, "x", x);
433 psppire_conf_set_int (conf, base, "y", y);