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-use-dark",
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
static GObject * self = NULL;
331
g_mutex_lock (&mutex);
333
self = G_OBJECT_CLASS (gpump_settings_data_parent_class)->constructor (
334
type, n_construct_params, construct_params);
335
g_object_add_weak_pointer (self, (gpointer) &self);
336
g_mutex_unlock (&mutex);
339
g_mutex_unlock (&mutex);
340
return g_object_ref (self);
344
void gpump_settings_data_dispose (GObject * object) {
345
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
346
#if GPUMP_USE_GSETTIGS
347
/* do nothing, not implemented yet */
349
gpump_settings_data_commit (self, NULL);
351
g_key_file_free (self->priv->gpump_settings);
352
g_object_unref (G_OBJECT(self->priv->gpump_settings_file));
355
G_OBJECT_CLASS (gpump_settings_data_parent_class)->dispose (object);
359
/* * Internal private functions ***********************************************/
360
void _print_errors (GError ** err_arr) {
362
for (int i = 0; err_arr[i] != NULL; i++) {
363
g_print ("GPumpSettingsData:\n An %s error occured:\n\t%s\n\n",
364
g_quark_to_string (err_arr[i]->domain),
365
err_arr[i]->message);
371
/* * **************************************************************************
372
* * Getting and setting properties *******************************************
373
* For more information see:
374
* https://developer.gnome.org/gobject/stable/gobject-properties.html
377
/* * declarations of setting functions */
378
void _set_ui_x (GPumpSettingsData * self,
379
const GValue * value);
380
void _set_ui_y (GPumpSettingsData * self,
381
const GValue * value);
382
void _set_ui_h (GPumpSettingsData * self,
383
const GValue * value);
384
void _set_ui_w (GPumpSettingsData * self,
385
const GValue * value);
387
void _set_main_use_dark (GPumpSettingsData * self,
388
const GValue * value);
389
void _set_main_first_run (GPumpSettingsData * self,
390
const GValue * value);
393
/* * declarations of getting functions */
394
void _get_ui_x (GPumpSettingsData * self,
396
void _get_ui_y (GPumpSettingsData * self,
398
void _get_ui_h (GPumpSettingsData * self,
400
void _get_ui_w (GPumpSettingsData * self,
403
void _get_main_use_dark (GPumpSettingsData * self,
405
void _get_main_first_run (GPumpSettingsData * self,
410
/* * Setting props */
411
void gpump_settings_data_set_property (GObject * object,
413
const GValue * value,
414
GParamSpec * pspec) {
415
g_object_ref (object);
417
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
419
switch (property_id) {
423
_set_ui_x (self, value);
426
_set_ui_x (self, value);
429
_set_ui_x (self, value);
432
_set_ui_x (self, value);
435
/* GPump generic props */
436
case PROP_MAIN_USE_DARK:
437
_set_main_use_dark (self, value);
439
case PROP_MAIN_FIRST_RUN:
440
_set_main_first_run (self, value);
445
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
449
g_object_unref (object);
453
void gpump_settings_data_get_property (GObject * object,
456
GParamSpec * pspec) {
457
g_object_ref (object);
459
GPumpSettingsData * self = GPUMP_SETTINGS_DATA (object);
461
switch (property_id) {
465
_get_ui_x (self, value);
468
_get_ui_x (self, value);
471
_get_ui_x (self, value);
474
_get_ui_x (self, value);
477
/* GPump generic props */
478
case PROP_MAIN_USE_DARK:
479
_get_main_use_dark (self, value);
481
case PROP_MAIN_FIRST_RUN:
482
_get_main_first_run (self, value);
487
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
491
g_object_unref (object);
495
/* * implimentations of setting functions *************************************/
496
void _set_ui_x (GPumpSettingsData * self,
497
const GValue * value) {
498
#if GPUMP_USE_GSETTINGS
501
g_key_file_set_integer (self->priv->gpump_settings,
504
g_value_get_int (value));
508
void _set_ui_y (GPumpSettingsData * self,
509
const GValue * value) {
510
#if GPUMP_USE_GSETTINGS
513
g_key_file_set_integer (self->priv->gpump_settings,
516
g_value_get_int (value));
520
void _set_ui_h (GPumpSettingsData * self,
521
const GValue * value) {
522
#if GPUMP_USE_GSETTINGS
525
g_key_file_set_integer (self->priv->gpump_settings,
528
g_value_get_int (value));
532
void _set_ui_w (GPumpSettingsData * self,
533
const GValue * value) {
534
#if GPUMP_USE_GSETTINGS
537
g_key_file_set_integer (self->priv->gpump_settings,
540
g_value_get_int (value));
544
void _set_main_use_dark (GPumpSettingsData * self,
545
const GValue * value) {
546
#if GPUMP_USE_GSETTINGS
549
g_key_file_set_integer (self->priv->gpump_settings,
552
g_value_get_boolean (value));
556
void _set_main_first_run (GPumpSettingsData * self,
557
const GValue * value) {
558
#if GPUMP_USE_GSETTINGS
561
g_key_file_set_integer (self->priv->gpump_settings,
564
g_value_get_boolean (value));
569
/* * implimentations of getting functions *************************************/
570
void _get_ui_x (GPumpSettingsData * self,
572
#if GPUMP_USE_GSETTINGS
575
GError ** err_arr = NULL;
576
g_value_set_int (value,
577
g_key_file_get_integer (self->priv->gpump_settings,
581
_print_errors (err_arr);
582
g_clear_error (err_arr);
586
void _get_ui_y (GPumpSettingsData * self,
588
#if GPUMP_USE_GSETTINGS
591
GError ** err_arr = NULL;
592
g_value_set_int (value,
593
g_key_file_get_integer (self->priv->gpump_settings,
597
_print_errors (err_arr);
598
g_clear_error (err_arr);
602
void _get_ui_h (GPumpSettingsData * self,
604
#if GPUMP_USE_GSETTINGS
607
GError ** err_arr = NULL;
608
g_value_set_int (value,
609
g_key_file_get_integer (self->priv->gpump_settings,
613
_print_errors (err_arr);
614
g_clear_error (err_arr);
618
void _get_ui_w (GPumpSettingsData * self,
620
#if GPUMP_USE_GSETTINGS
623
GError ** err_arr = NULL;
624
g_value_set_int (value,
625
g_key_file_get_integer (self->priv->gpump_settings,
629
_print_errors (err_arr);
630
g_clear_error (err_arr);
634
void _get_main_use_dark (GPumpSettingsData * self,
636
#if GPUMP_USE_GSETTINGS
639
GError ** err_arr = NULL;
640
g_value_set_int (value,
641
g_key_file_get_integer (self->priv->gpump_settings,
645
_print_errors (err_arr);
646
g_clear_error (err_arr);
650
void _get_main_first_run (GPumpSettingsData * self,
652
#if GPUMP_USE_GSETTINGS
655
GError ** err_arr = NULL;
656
g_value_set_int (value,
657
g_key_file_get_integer (self->priv->gpump_settings,
661
_print_errors (err_arr);
662
g_clear_error (err_arr);