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
/* Properties enumeration */
39
static GParamSpec * obj_properties[N_PROPERTIES] = { NULL, };
43
/* * Override the default constructor and destructor **************************/
44
GObject * gpump_settings_data_construct (GType type,
45
guint n_construct_params,
46
GObjectConstructParam * construct_params);
48
void gpump_settings_data_dispose (GObject * object);
50
/* * internal private functions ***********************************************/
51
void _print_errors (GError ** err_arr);
53
void gpump_settings_data_set_property (GObject * object,
58
void gpump_settings_data_get_property (GObject * object,
63
/* * **************************************************************************/
64
GPumpSettingsData * gpump_settings_data_get_default () {
65
GPumpSettingsData * self = g_object_new (GPUMP_TYPE_SETTINGS_DATA,
71
void gpump_settings_data_init (GPumpSettingsData * self) {
72
g_print ("Init GPumpSettingsData\n");
74
self->priv = GPUMP_SETTINGS_DATA_GET_PRIVATE (self);
76
#if GPUMP_USE_GSETTINGS
77
/* This will not be compiled, this will have to be implemented later...
80
self->ui_settings = g_settings_new ("org.gego.gpump.ui");
81
self->gpump_settings = g_settings_new ("org.gego.gpump");
84
/* Construct the path for the files, 1) the GPump settings 2) the GPump UI
87
* The file names are defined static, so they do not need to be re-created,
88
* each and every time to object is re-created.
90
self->priv->gpump_settings = g_key_file_new ();
92
static gchar * gpump_settings_file_uri = NULL;
93
static gchar * settings_basedir = NULL;
95
if (!(gpump_settings_file_uri)) {
97
g_print ("Constructing path!\n");
99
const gchar * base_config_dir = g_get_user_config_dir ();
101
settings_basedir = g_strdup_printf ("%s/%s",
104
g_free ((gchar*)base_config_dir);
106
gpump_settings_file_uri = g_strdup_printf ("%s/%s",
111
self->priv->gpump_settings_file = g_file_new_for_path (
112
gpump_settings_file_uri);
113
GError ** err_arr = NULL;
114
/* Dose the file exist? */
115
if (!g_file_test (gpump_settings_file_uri, G_FILE_TEST_EXISTS )) {
116
/* Nope, it did not exist */
117
g_debug ("Config file does not exist, creating it.\n");
119
g_mkdir_with_parents (settings_basedir, 0700);
121
GFileOutputStream * file_stream = g_file_create (
122
self->priv->gpump_settings_file,
123
G_FILE_CREATE_PRIVATE,
127
_print_errors (err_arr);
129
/* Construct a set of default settings */
132
/* -1 is undefined, these are set when the main window is displayed */
133
g_key_file_set_integer (self->priv->gpump_settings, "ui","x", -1);
134
g_key_file_set_integer (self->priv->gpump_settings, "ui","y", -1);
135
/* 500x500 is the default window size */
136
g_key_file_set_integer (self->priv->gpump_settings, "ui","h", 500);
137
g_key_file_set_integer (self->priv->gpump_settings, "ui","w", 500);
139
g_key_file_set_boolean (self->priv->gpump_settings,
143
g_key_file_set_boolean (self->priv->gpump_settings,
148
g_assert (err_arr == NULL);
150
gchar * buff = g_key_file_to_data (self->priv->gpump_settings,
154
_print_errors (err_arr);
156
g_output_stream_write (G_OUTPUT_STREAM (file_stream),
162
_print_errors (err_arr);
164
g_object_unref (file_stream);
166
/* yes, the file did exit */
168
g_debug ("Reading data from file:\n");
169
g_key_file_load_from_file (self->priv->gpump_settings,
170
gpump_settings_file_uri,
173
g_debug ("%s\n", g_key_file_to_data (self->priv->gpump_settings,NULL, NULL));
174
_print_errors (err_arr);
181
void gpump_settings_data_class_init (GPumpSettingsDataClass * klass) {
182
GObjectClass * parent = G_OBJECT_CLASS (klass);
184
parent->constructor = gpump_settings_data_construct;
185
parent->dispose = gpump_settings_data_dispose;
187
parent->get_property = gpump_settings_data_get_property;
188
parent->set_property = gpump_settings_data_set_property;
190
obj_properties[PROP_UI_X] = g_param_spec_int ("ui-x",
192
"The x coordinate of the window",
199
obj_properties[PROP_UI_Y] = g_param_spec_int ("ui-y",
201
"The Y coordinate of the window",
208
obj_properties[PROP_UI_H] = g_param_spec_int ("ui-h",
210
"The x coordinate of the window",
217
obj_properties[PROP_UI_W] = g_param_spec_int ("ui-w",
219
"The x coordinate of the window",
226
obj_properties[PROP_MAIN_USE_DARK] = g_param_spec_boolean ("main-use-dark",
228
"Weather or not to use dark theme.",
233
obj_properties[PROP_MAIN_FIRST_RUN] = g_param_spec_boolean ("main-first-run",
235
"Weather or not this is the first time that the app is run.",
240
g_object_class_install_properties (parent, N_PROPERTIES,
243
g_type_class_add_private (klass, sizeof (GPumpSettingsDataPrivate));
246
void gpump_settings_data_set (GPumpSettingsData * self,
249
g_object_set_property (G_OBJECT (self),
255
GValue * gpump_settings_data_get (GPumpSettingsData * self,
257
GValue * data = NULL;
258
g_object_set_property (G_OBJECT (self),
265
gboolean gpump_settings_data_commit (GPumpSettingsData * self,
267
g_object_ref (G_OBJECT(self));
268
#if GPUMP_USE_GSETTINGS
273
g_debug ("Committing data to file!\n");
274
g_assert ( err_arr == NULL);
276
GFileOutputStream * out_stream = g_file_replace (
277
self->priv->gpump_settings_file,
280
G_FILE_CREATE_PRIVATE,
284
g_object_unref (out_stream);
288
gchar * buff = g_key_file_to_data (self->priv->gpump_settings, NULL, err_arr);
291
g_object_unref (out_stream);
295
gssize buff_size = strlen (buff);
296
gssize out_size = g_output_stream_write (G_OUTPUT_STREAM (out_stream),
304
g_object_unref (out_stream);
309
g_object_unref (out_stream);
312
g_debug ("Data commited: %i of %i bytes written!\n", (int)out_size, (int)buff_size);
316
g_object_unref (G_OBJECT (self));
319
/* * **************************************************************************
320
* * Implementation of the constructor ****************************************
322
* See: blogs.gnome.org/xclaesse/2010/02/11/how-to-make-a-gobject-singleton/
323
* for more information.
325
GObject *gpump_settings_data_construct (GType type,
326
guint n_construct_params,
327
GObjectConstructParam * construct_params) {
328
g_print ("GPumpSettingsData contructor is run\n");
329
static GObject * self = NULL;
332
g_mutex_lock (&mutex);
334
self = G_OBJECT_CLASS (gpump_settings_data_parent_class)->constructor (
335
type, n_construct_params, construct_params);
336
g_object_add_weak_pointer (self, (gpointer) &self);
337
g_mutex_unlock (&mutex);
338
g_print ("GPumpSettingsData contructor has run\n");
341
g_mutex_unlock (&mutex);
342
g_print ("GPumpSettingsData contructor has run\n");
343
return g_object_ref (self);
347
void gpump_settings_data_dispose (GObject * object) {
348
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
349
#if GPUMP_USE_GSETTIGS
350
/* do nothing, not implemented yet */
352
if (!(gpump_settings_data_commit (self, NULL))) {
353
g_print ("Could not commit data\n");
356
g_key_file_free (self->priv->gpump_settings);
357
g_object_unref (G_OBJECT(self->priv->gpump_settings_file));
360
G_OBJECT_CLASS (gpump_settings_data_parent_class)->dispose (object);
364
/* * Internal private functions ***********************************************/
365
void _print_errors (GError ** err_arr) {
367
for (int i = 0; err_arr[i] != NULL; i++) {
368
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
369
g_quark_to_string (err_arr[i]->domain),
370
err_arr[i]->message);
376
/* * **************************************************************************
377
* * Getting and setting properties *******************************************
378
* For more information see:
379
* https://developer.gnome.org/gobject/stable/gobject-properties.html
382
/* * declarations of setting functions */
383
void _set_ui_x (GPumpSettingsData * self,
384
const GValue * value);
385
void _set_ui_y (GPumpSettingsData * self,
386
const GValue * value);
387
void _set_ui_h (GPumpSettingsData * self,
388
const GValue * value);
389
void _set_ui_w (GPumpSettingsData * self,
390
const GValue * value);
392
void _set_main_use_dark (GPumpSettingsData * self,
393
const GValue * value);
394
void _set_main_first_run (GPumpSettingsData * self,
395
const GValue * value);
398
/* * declarations of getting functions */
399
void _get_ui_x (GPumpSettingsData * self,
401
void _get_ui_y (GPumpSettingsData * self,
403
void _get_ui_h (GPumpSettingsData * self,
405
void _get_ui_w (GPumpSettingsData * self,
408
void _get_main_use_dark (GPumpSettingsData * self,
410
void _get_main_first_run (GPumpSettingsData * self,
415
/* * Setting props */
416
void gpump_settings_data_set_property (GObject * object,
418
const GValue * value,
419
GParamSpec * pspec) {
420
g_object_ref (object);
422
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
424
switch (property_id) {
428
_set_ui_x (self, value);
431
_set_ui_x (self, value);
434
_set_ui_x (self, value);
437
_set_ui_x (self, value);
440
/* GPump generic props */
441
case PROP_MAIN_USE_DARK:
442
_set_main_use_dark (self, value);
444
case PROP_MAIN_FIRST_RUN:
445
_set_main_first_run (self, value);
450
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
454
g_object_unref (object);
458
void gpump_settings_data_get_property (GObject * object,
461
GParamSpec * pspec) {
462
g_object_ref (object);
464
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
466
switch (property_id) {
470
_get_ui_x (self, value);
473
_get_ui_x (self, value);
476
_get_ui_x (self, value);
479
_get_ui_x (self, value);
482
/* GPump generic props */
483
case PROP_MAIN_USE_DARK:
484
_get_main_use_dark (self, value);
486
case PROP_MAIN_FIRST_RUN:
487
_get_main_first_run (self, value);
492
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
496
g_object_unref (object);
500
/* * implimentations of setting functions *************************************/
501
void _set_ui_x (GPumpSettingsData * self,
502
const GValue * value) {
503
#if GPUMP_USE_GSETTINGS
506
g_key_file_set_integer (self->priv->gpump_settings,
509
g_value_get_int (value));
513
void _set_ui_y (GPumpSettingsData * self,
514
const GValue * value) {
515
#if GPUMP_USE_GSETTINGS
518
g_key_file_set_integer (self->priv->gpump_settings,
521
g_value_get_int (value));
525
void _set_ui_h (GPumpSettingsData * self,
526
const GValue * value) {
527
#if GPUMP_USE_GSETTINGS
530
g_key_file_set_integer (self->priv->gpump_settings,
533
g_value_get_int (value));
537
void _set_ui_w (GPumpSettingsData * self,
538
const GValue * value) {
539
#if GPUMP_USE_GSETTINGS
542
g_key_file_set_integer (self->priv->gpump_settings,
545
g_value_get_int (value));
549
void _set_main_use_dark (GPumpSettingsData * self,
550
const GValue * value) {
551
#if GPUMP_USE_GSETTINGS
554
g_key_file_set_integer (self->priv->gpump_settings,
557
g_value_get_boolean (value));
561
void _set_main_first_run (GPumpSettingsData * self,
562
const GValue * value) {
563
#if GPUMP_USE_GSETTINGS
566
g_key_file_set_integer (self->priv->gpump_settings,
569
g_value_get_boolean (value));
574
/* * implimentations of getting functions *************************************/
575
void _get_ui_x (GPumpSettingsData * self,
577
#if GPUMP_USE_GSETTINGS
580
GError ** err_arr = NULL;
581
g_value_set_int (value,
582
g_key_file_get_integer (self->priv->gpump_settings,
586
_print_errors (err_arr);
587
g_clear_error (err_arr);
591
void _get_ui_y (GPumpSettingsData * self,
593
#if GPUMP_USE_GSETTINGS
596
GError ** err_arr = NULL;
597
g_value_set_int (value,
598
g_key_file_get_integer (self->priv->gpump_settings,
602
_print_errors (err_arr);
603
g_clear_error (err_arr);
607
void _get_ui_h (GPumpSettingsData * self,
609
#if GPUMP_USE_GSETTINGS
612
GError ** err_arr = NULL;
613
g_value_set_int (value,
614
g_key_file_get_integer (self->priv->gpump_settings,
618
_print_errors (err_arr);
619
g_clear_error (err_arr);
623
void _get_ui_w (GPumpSettingsData * self,
625
#if GPUMP_USE_GSETTINGS
628
GError ** err_arr = NULL;
629
g_value_set_int (value,
630
g_key_file_get_integer (self->priv->gpump_settings,
634
_print_errors (err_arr);
635
g_clear_error (err_arr);
639
void _get_main_use_dark (GPumpSettingsData * self,
641
#if GPUMP_USE_GSETTINGS
644
GError ** err_arr = NULL;
645
g_value_set_int (value,
646
g_key_file_get_integer (self->priv->gpump_settings,
650
_print_errors (err_arr);
651
g_clear_error (err_arr);
655
void _get_main_first_run (GPumpSettingsData * self,
657
#if GPUMP_USE_GSETTINGS
660
GError ** err_arr = NULL;
661
g_value_set_int (value,
662
g_key_file_get_integer (self->priv->gpump_settings,
666
_print_errors (err_arr);
667
g_clear_error (err_arr);