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 g_warning ("Cannot open %s for writing", conf->filename);
96 conf_write (PsppireConf *conf)
99 conf->idle = g_idle_add_full (G_PRIORITY_LOW,
100 (GSourceFunc) flush_conf, conf, NULL);
105 psppire_conf_dispose (GObject *object)
110 psppire_conf_finalize (GObject *object)
112 PsppireConf *conf = PSPPIRE_CONF (object);
113 g_key_file_free (conf->keyfile);
114 g_free (conf->filename);
118 static PsppireConf *the_instance = NULL;
121 psppire_conf_construct (GType type,
122 guint n_construct_params,
123 GObjectConstructParam *construct_params)
129 object = G_OBJECT_CLASS (parent_class)->constructor (type,
132 the_instance = PSPPIRE_CONF (object);
135 object = g_object_ref (G_OBJECT (the_instance));
141 psppire_conf_class_init (PsppireConfClass *class)
143 GObjectClass *object_class;
145 parent_class = g_type_class_peek_parent (class);
146 object_class = (GObjectClass*) class;
148 object_class->finalize = psppire_conf_finalize;
149 object_class->dispose = psppire_conf_dispose;
150 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 ();
172 conf->dispose_has_run = FALSE;
178 psppire_conf_new (void)
180 return g_object_new (psppire_conf_get_type (), NULL);
186 psppire_conf_get_int (PsppireConf *conf, const gchar *base,
187 const gchar *name, gint *value)
192 *value = g_key_file_get_integer (conf->keyfile,
204 psppire_conf_get_boolean (PsppireConf *conf, const gchar *base,
205 const gchar *name, gboolean *value)
211 b = g_key_file_get_boolean (conf->keyfile,
227 psppire_conf_set_int (PsppireConf *conf,
228 const gchar *base, const gchar *name,
231 g_key_file_set_integer (conf->keyfile, base, name, value);
236 psppire_conf_set_boolean (PsppireConf *conf,
237 const gchar *base, const gchar *name,
240 g_key_file_set_boolean (conf->keyfile, base, name, value);
245 A convenience function to set the geometry of a
246 window from from a saved config
249 psppire_conf_set_window_geometry (PsppireConf *conf,
257 if (psppire_conf_get_int (conf, base, "height", &height)
259 psppire_conf_get_int (conf, base, "width", &width) )
261 gtk_window_set_default_size (window, width, height);
264 if ( psppire_conf_get_int (conf, base, "x", &x)
266 psppire_conf_get_int (conf, base, "y", &y) )
268 gtk_window_move (window, x, y);
271 if ( psppire_conf_get_boolean (conf, base, "maximize", &maximize))
274 gtk_window_maximize (window);
276 gtk_window_unmaximize (window);
282 A convenience function to save the window geometry.
283 This should typically be called from a window's
284 "configure-event" and "window-state-event" signal handlers
287 psppire_conf_save_window_geometry (PsppireConf *conf,
289 GtkWindow *gtk_window)
294 w = gtk_widget_get_window (GTK_WIDGET (gtk_window));
298 maximized = (gdk_window_get_state (w) & GDK_WINDOW_STATE_MAXIMIZED) != 0;
299 psppire_conf_set_boolean (conf, base, "maximize", maximized);
306 gdk_drawable_get_size (w, &width, &height);
307 gdk_window_get_position (w, &x, &y);
309 psppire_conf_set_int (conf, base, "height", height);
310 psppire_conf_set_int (conf, base, "width", width);
311 psppire_conf_set_int (conf, base, "x", x);
312 psppire_conf_set_int (conf, base, "y", y);