2
#include "GPumpSettingsData.h"
4
#define GPUMP_SETTINGS_DATA_GET_PRIVATE(obj)\
5
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GPUMP_TYPE_SETTINGS_DATA,\
6
GPumpSettingsDataPrivate))
8
G_DEFINE_TYPE (GPumpSettingsData, gpump_settings_data, G_TYPE_OBJECT)
11
/* Private datastructure */
12
struct GPumpSettingsDataPrivate {
13
#if GPUMP_USE_GSETTINGS
14
/* org.gego.gpump.ui */
15
GSettings * ui_settings;
17
GSettings * gpump_settings;
19
GKeyFile * gpump_settings; /* Stores both UI and other settings... */
20
GFile * gpump_settings_file;
21
#endif /* GPUMP_USE_GSETTINGS */
24
/* * Override the default constructer *****************************************/
25
GObject * _constructor (GType type,
26
guint n_construct_params,
27
GObjectConstructParam * construct_params);
30
/******************************************************************************/
31
GPumpSettingsData * gpump_settings_data_get_default () {
32
GPumpSettingsData * self = g_object_new (GPUMP_TYPE_SETTINGS_DATA,
38
void gpump_settings_data_init (GPumpSettingsData * self) {
39
g_print ("Init GPumpSettingsData\n");
41
self->priv = GPUMP_SETTINGS_DATA_GET_PRIVATE (self);
43
#if GPUMP_USE_GSETTINGS
44
/* This will not be compiled, this will have to be implemented later...
47
self->ui_settings = g_settings_new ("org.gego.gpump.ui");
48
self->gpump_settings = g_settings_new ("org.gego.gpump");
51
/* Construct the path for the files, 1) the GPump settings 2) the GPump UI
54
* The file names are defined static, so they do not need to be re-created,
55
* each and every time te object is re-created.
57
self->priv->gpump_settings = g_key_file_new ();
59
static gchar * gpump_settings_file_uri = NULL;
60
gchar * settings_basedir = NULL;
62
if (!(gpump_settings_file_uri)) {
64
g_print ("Constructing path!\n");
66
gchar * base_config_dir = g_get_user_config_dir ();
68
settings_basedir = g_strdup_printf ("%s/%s",
71
g_free (base_config_dir);
73
gpump_settings_file_uri = g_strdup_printf ("%s/%s",
78
self->priv->gpump_settings_file = g_file_new_for_path (
79
gpump_settings_file_uri);
80
GError ** err_arr = NULL;
81
/* Dose the file exist? */
82
if (!g_file_test (gpump_settings_file_uri, G_FILE_TEST_EXISTS )) {
83
/* Nope, it did not exist */
84
g_print ("Config file does not exist, creating it.\n");
86
g_mkdir_with_parents (settings_basedir, 0700);
88
GFileOutputStream * file_stream = g_file_create (
89
self->priv->gpump_settings_file,
90
G_FILE_CREATE_PRIVATE,
94
for (int i = 0; err_arr[i] != NULL; i++) {
95
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
96
g_quark_to_string (err_arr[i]->domain),
101
/* Construct a set of default settings */
104
/* -1 is undefined, these are set when the main window is displayed */
105
g_key_file_set_integer (self->priv->gpump_settings, "ui","x", -1);
106
g_key_file_set_integer (self->priv->gpump_settings, "ui","y", -1);
107
/* 500x500 is the default window size */
108
g_key_file_set_integer (self->priv->gpump_settings, "ui","h", 500);
109
g_key_file_set_integer (self->priv->gpump_settings, "ui","w", 500);
111
g_key_file_set_boolean (self->priv->gpump_settings,
115
g_key_file_set_boolean (self->priv->gpump_settings,
120
g_assert (err_arr == NULL);
122
gchar * buff = g_key_file_to_data (self->priv->gpump_settings,
127
for (int i = 0; err_arr[i] != NULL; i++) {
128
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
129
g_quark_to_string (err_arr[i]->domain),
130
err_arr[i]->message);
135
gint written = g_output_stream_write (G_OUTPUT_STREAM (file_stream),
144
for (int i = 0; err_arr[i] != NULL; i++) {
145
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
146
g_quark_to_string (err_arr[i]->domain),
147
err_arr[i]->message);
153
g_object_unref (file_stream);
155
/* yes, the file did exit */
156
g_key_file_load_from_file (self->priv->gpump_settings,
157
gpump_settings_file_uri,
161
for (int i = 0; err_arr[i] != NULL; i++) {
162
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
163
g_quark_to_string (err_arr[i]->domain),
164
err_arr[i]->message);
169
g_free (settings_basedir);
174
void gpump_settings_data_class_init (GPumpSettingsDataClass * klass) {
175
GObjectClass * parent = G_OBJECT_CLASS (klass);
177
parent->constructor = _constructor;
179
g_type_class_add_private (klass, sizeof (GPumpSettingsDataPrivate));
183
void gpump_settings_data_set (GPumpSettingsData * self,
186
#if GPUMP_USE_GSETTINGS
194
GVariant * gpump_settings_data_get (GPumpSettingsData * self,
196
#if GPUMP_USE_GSETTINGS
204
gboolean gpump_settings_data_commit (GPumpSettingsData * self,
206
g_object_ref (G_OBJECT(self));
207
#if GPUMP_USE_GSETTINGS
212
g_print ("Commiting data to file!\n");
213
g_assert ( err_arr == NULL || *err_arr == NULL);
215
GFileOutputStream * out_stream = g_file_replace (
216
self->priv->gpump_settings_file,
219
G_FILE_CREATE_PRIVATE,
223
g_object_unref (out_stream);
227
gchar * buff = g_key_file_to_data (self->priv->gpump_settings, NULL, err_arr);
230
g_object_unref (out_stream);
235
g_output_stream_write (G_OUTPUT_STREAM (out_stream),
242
g_object_unref (out_stream);
247
g_object_unref (out_stream);
252
g_object_unref (G_OBJECT (self));
255
/* * Implementation of the constructor ****************************************
257
* See: blogs.gnome.org/xclaesse/2010/02/11/how-to-make-a-gobject-singleton/
258
* for more information.
260
GObject * _constructor (GType type,
261
guint n_construct_params,
262
GObjectConstructParam * construct_params) {
263
static GObject * self = NULL;
266
g_mutex_lock (&mutex);
268
self = G_OBJECT_CLASS (gpump_settings_data_parent_class)->constructor (
269
type, n_construct_params, construct_params);
270
g_object_add_weak_pointer (self, (gpointer) &self);
271
g_mutex_unlock (&mutex);
274
g_mutex_unlock (&mutex);
275
return g_object_ref (self);