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 G_DEFINE_TYPE (PsppireConf, psppire_conf, G_TYPE_OBJECT)
33 static void psppire_conf_finalize (GObject *object);
34 static void psppire_conf_dispose (GObject *object);
36 static GObjectClass *parent_class = NULL;
39 conf_read (PsppireConf *conf)
41 g_key_file_load_from_file (conf->keyfile,
43 G_KEY_FILE_KEEP_COMMENTS,
48 flush_conf (PsppireConf *conf)
52 gchar *kf = g_key_file_to_data (conf->keyfile, &length, NULL);
54 if (! g_file_set_contents (conf->filename, kf, length, NULL))
56 char *msg = strerror (errno);
57 g_warning ("Cannot open %s for writing: %s", conf->filename, msg);
66 conf_write (PsppireConf *conf)
69 conf->idle = g_idle_add_full (G_PRIORITY_LOW,
70 (GSourceFunc) flush_conf, conf, NULL);
75 psppire_conf_dispose (GObject *object)
80 psppire_conf_finalize (GObject *object)
82 PsppireConf *conf = PSPPIRE_CONF (object);
83 g_key_file_free (conf->keyfile);
84 g_free (conf->filename);
88 static PsppireConf *the_instance = NULL;
91 psppire_conf_construct (GType type,
92 guint n_construct_params,
93 GObjectConstructParam *construct_params)
99 object = G_OBJECT_CLASS (parent_class)->constructor (type,
102 the_instance = PSPPIRE_CONF (object);
105 object = g_object_ref (G_OBJECT (the_instance));
111 psppire_conf_class_init (PsppireConfClass *class)
113 GObjectClass *object_class;
115 parent_class = g_type_class_peek_parent (class);
116 object_class = (GObjectClass*) class;
118 object_class->finalize = psppire_conf_finalize;
119 object_class->dispose = psppire_conf_dispose;
120 object_class->constructor = psppire_conf_construct;
125 psppire_conf_init (PsppireConf *conf)
127 const gchar *dirname;
130 /* Get the name of the directory for user configuration files, then, if it
131 doesn't already exist, create it, since we might be the first program
132 to want to put files there. */
133 dirname = g_get_user_config_dir ();
134 if (stat (dirname, &s) == -1 && errno == ENOENT)
135 mkdir (dirname, 0700);
137 conf->filename = g_strdup_printf ("%s/%s", dirname, "psppirerc");
139 conf->keyfile = g_key_file_new ();
146 psppire_conf_new (void)
148 return g_object_new (psppire_conf_get_type (), NULL);
154 psppire_conf_get_int (PsppireConf *conf, const gchar *base,
155 const gchar *name, gint *value)
160 *value = g_key_file_get_integer (conf->keyfile,
172 psppire_conf_get_boolean (PsppireConf *conf, const gchar *base,
173 const gchar *name, gboolean *value)
179 b = g_key_file_get_boolean (conf->keyfile,
196 psppire_conf_get_string (PsppireConf *conf, const gchar *base,
197 const gchar *name, gchar **value)
203 b = g_key_file_get_string (conf->keyfile,
221 psppire_conf_get_variant (PsppireConf *conf, const gchar *base,
222 const gchar *name, GVariant **v)
228 b = g_key_file_get_string (conf->keyfile,
238 *v = g_variant_parse (NULL, b, NULL, NULL, NULL);
246 psppire_conf_get_enum (PsppireConf *conf, const gchar *base,
255 b = g_key_file_get_string (conf->keyfile,
265 GEnumClass *ec = g_type_class_ref (t);
266 GEnumValue *ev = g_enum_get_value_by_nick (ec, b);
268 g_type_class_unref (ec);
276 psppire_conf_set_int (PsppireConf *conf,
277 const gchar *base, const gchar *name,
280 g_key_file_set_integer (conf->keyfile, base, name, value);
285 psppire_conf_set_boolean (PsppireConf *conf,
286 const gchar *base, const gchar *name,
289 g_key_file_set_boolean (conf->keyfile, base, name, value);
295 psppire_conf_set_string (PsppireConf *conf,
296 const gchar *base, const gchar *name,
299 g_key_file_set_string (conf->keyfile, base, name, value);
304 psppire_conf_set_variant (PsppireConf *conf,
305 const gchar *base, const gchar *name,
308 gchar *v = g_variant_print (value, FALSE);
309 g_key_file_set_string (conf->keyfile, base, name, v);
315 psppire_conf_set_enum (PsppireConf *conf,
316 const gchar *base, const gchar *name,
320 GEnumClass *ec = g_type_class_ref (enum_type);
321 GEnumValue *ev = g_enum_get_value (ec, value);
323 g_key_file_set_string (conf->keyfile, base, name,
326 g_type_class_unref (ec);
334 A convenience function to set the geometry of a
335 window from from a saved config
338 psppire_conf_set_window_geometry (PsppireConf *conf,
346 if (psppire_conf_get_int (conf, base, "height", &height)
348 psppire_conf_get_int (conf, base, "width", &width))
350 gtk_window_set_default_size (window, width, height);
353 if (psppire_conf_get_int (conf, base, "x", &x)
355 psppire_conf_get_int (conf, base, "y", &y))
357 gtk_window_move (window, x, y);
360 if (psppire_conf_get_boolean (conf, base, "maximize", &maximize))
363 gtk_window_maximize (window);
365 gtk_window_unmaximize (window);
371 A convenience function to save the window geometry.
372 This should typically be called from a window's
373 "configure-event" and "window-state-event" signal handlers
376 psppire_conf_save_window_geometry (PsppireConf *conf,
378 GtkWindow *gtk_window)
383 w = gtk_widget_get_window (GTK_WIDGET (gtk_window));
387 maximized = (gdk_window_get_state (w) & GDK_WINDOW_STATE_MAXIMIZED) != 0;
388 psppire_conf_set_boolean (conf, base, "maximize", maximized);
394 gint width = gdk_window_get_width (w);
395 gint height= gdk_window_get_height (w);
397 gdk_window_get_position (w, &x, &y);
399 psppire_conf_set_int (conf, base, "height", height);
400 psppire_conf_set_int (conf, base, "width", width);
401 psppire_conf_set_int (conf, base, "x", x);
402 psppire_conf_set_int (conf, base, "y", y);