refactor alpha enabling, added some debug traces
[psensor.git] / src / cfg.c
1 /*
2  * Copyright (C) 2010-2012 jeanfi@gmail.com
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301 USA
18  */
19 #include <stdlib.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <ctype.h>
23
24 #include <gconf/gconf-client.h>
25
26 #include "cfg.h"
27
28 #define KEY_SENSOR_UPDATE_INTERVAL "/apps/psensor/sensor/update_interval"
29
30 #define KEY_GRAPH_UPDATE_INTERVAL "/apps/psensor/graph/update_interval"
31 #define KEY_GRAPH_MONITORING_DURATION "/apps/psensor/graph/monitoring_duration"
32
33 #define KEY_GRAPH_BACKGROUND_COLOR "/apps/psensor/graph/background_color"
34 #define DEFAULT_GRAPH_BACKGROUND_COLOR "#e8f4e8f4a8f5"
35
36 #define KEY_GRAPH_BACKGROUND_ALPHA  "/apps/psensor/graph/background_alpha"
37 #define DEFAULT_GRAPH_BACKGROUND_ALPHA "1.0"
38
39 #define KEY_GRAPH_FOREGROUND_COLOR  "/apps/psensor/graph/foreground_color"
40 #define DEFAULT_GRAPH_FOREGROUND_COLOR "#000000000000"
41
42 #define KEY_ALPHA_CHANNEL_ENABLED  "/apps/psensor/graph/alpha_channel_enabled"
43 #define DEFAULT_ALPHA_CHANNEL_ENABLED 0
44
45 #define KEY_INTERFACE_SENSORLIST_POSITION \
46 "/apps/psensor/interface/sensorlist_position"
47
48 #define KEY_INTERFACE_WINDOW_DECORATION_DISABLED \
49 "/apps/psensor/interface/window_decoration_disabled"
50
51 #define KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED \
52 "/apps/psensor/interface/window_keep_below_enabled"
53
54 #define KEY_INTERFACE_MENU_BAR_DISABLED \
55 "/apps/psensor/interface/menu_bar_disabled"
56
57 #define KEY_INTERFACE_UNITY_LAUNCHER_COUNT_DISABLED \
58 "/apps/psensor/interface/unity_launcher_count_disabled"
59
60 #define KEY_INTERFACE_HIDE_ON_STARTUP \
61 "/apps/psensor/interface/hide_on_startup"
62
63 #define KEY_INTERFACE_WINDOW_RESTORE_ENABLED \
64 "/apps/psensor/interface/window_restore_enabled"
65
66 #define KEY_INTERFACE_WINDOW_X "/apps/psensor/interface/window_x"
67 #define KEY_INTERFACE_WINDOW_Y "/apps/psensor/interface/window_y"
68 #define KEY_INTERFACE_WINDOW_W "/apps/psensor/interface/window_w"
69 #define KEY_INTERFACE_WINDOW_H "/apps/psensor/interface/window_h"
70
71 #define KEY_INTERFACE_WINDOW_DIVIDER_POS \
72 "/apps/psensor/interface/window_divider_pos"
73
74 GConfClient *client;
75
76 static char *get_string(char *key, char *default_value)
77 {
78         char *value = gconf_client_get_string(client,
79                                               key,
80                                               NULL);
81
82         if (!value) {
83                 value = strdup(default_value);
84
85                 gconf_client_set_string(client, key, default_value, NULL);
86         }
87
88         return value;
89 }
90
91 static struct color *config_get_background_color()
92 {
93
94         char *scolor = get_string(KEY_GRAPH_BACKGROUND_COLOR,
95                                          DEFAULT_GRAPH_BACKGROUND_COLOR);
96
97         struct color *c = string_to_color(scolor);
98
99         free(scolor);
100
101         if (c == NULL)
102                 return color_new(0xffff, 0xffff, 0xffff);
103
104         return c;
105 }
106
107 static struct color *config_get_foreground_color()
108 {
109         char *scolor = get_string(KEY_GRAPH_FOREGROUND_COLOR,
110                                   DEFAULT_GRAPH_FOREGROUND_COLOR);
111
112         struct color *c = string_to_color(scolor);
113
114         free(scolor);
115
116         if (c == NULL)
117                 return color_new(0x0000, 0x0000, 0x0000);
118
119         return c;
120 }
121
122 static int config_is_alpha_channel_enabled()
123 {
124         gboolean b = gconf_client_get_bool(client,
125                                            KEY_ALPHA_CHANNEL_ENABLED,
126                                            NULL);
127
128         return b == TRUE;
129 }
130
131 static int config_get_sensorlist_position()
132 {
133         return gconf_client_get_int(client,
134                                     KEY_INTERFACE_SENSORLIST_POSITION, NULL);
135 }
136
137 static void config_set_sensorlist_position(int pos)
138 {
139         gconf_client_set_int(client,
140                              KEY_INTERFACE_SENSORLIST_POSITION, pos, NULL);
141 }
142
143 static double config_get_graph_background_alpha()
144 {
145         double a = gconf_client_get_float(client,
146                                           KEY_GRAPH_BACKGROUND_ALPHA,
147                                           NULL);
148         if (a == 0)
149                 gconf_client_set_float(client,
150                                        KEY_GRAPH_BACKGROUND_ALPHA, 1.0, NULL);
151         return a;
152 }
153
154 static void config_set_graph_background_alpha(double alpha)
155 {
156         gconf_client_set_float(client, KEY_GRAPH_BACKGROUND_ALPHA, alpha, NULL);
157 }
158
159 static void config_set_background_color(struct color *color)
160 {
161         char *scolor = color_to_string(color);
162
163         if (!scolor)
164                 scolor = strdup(DEFAULT_GRAPH_BACKGROUND_COLOR);
165
166         gconf_client_set_string(client,
167                                 KEY_GRAPH_BACKGROUND_COLOR, scolor, NULL);
168
169         free(scolor);
170 }
171
172 static void config_set_foreground_color(struct color *color)
173 {
174         char *scolor = color_to_string(color);
175
176         if (!scolor)
177                 scolor = strdup(DEFAULT_GRAPH_FOREGROUND_COLOR);
178
179         gconf_client_set_string(client,
180                                 KEY_GRAPH_FOREGROUND_COLOR, scolor, NULL);
181
182         free(scolor);
183 }
184
185 static char *config_get_sensor_key(char *sensor_name)
186 {
187         char *escaped_name = gconf_escape_key(sensor_name, -1);
188         /* /apps/psensor/sensors/[sensor_name]/color */
189         char *key = malloc(22 + 2 * strlen(escaped_name) + 6 + 1);
190
191         sprintf(key, "/apps/psensor/sensors/%s/color", escaped_name);
192
193         free(escaped_name);
194
195         return key;
196 }
197
198 struct color *config_get_sensor_color(char *sensor_name,
199                                       struct color *default_color)
200 {
201         char *key = config_get_sensor_key(sensor_name);
202
203         char *scolor = gconf_client_get_string(client,
204                                                key,
205                                                NULL);
206
207         struct color *color = NULL;
208
209         if (scolor)
210                 color = string_to_color(scolor);
211
212         if (!scolor || !color) {
213                 color = color_new(default_color->red,
214                                   default_color->green, default_color->blue);
215
216                 scolor = color_to_string(color);
217
218                 gconf_client_set_string(client, key, scolor, NULL);
219         }
220
221         free(scolor);
222         free(key);
223
224         return color;
225 }
226
227 void config_set_sensor_color(char *sensor_name, struct color *color)
228 {
229         char *key = config_get_sensor_key(sensor_name);
230
231         char *scolor = color_to_string(color);
232
233         gconf_client_set_string(client, key, scolor, NULL);
234
235         free(scolor);
236 }
237
238 int config_get_sensor_alarm_limit(char *sensor_name, int def)
239 {
240         int res;
241         char *escaped_name = gconf_escape_key(sensor_name, -1);
242         /* /apps/psensor/sensors/[sensor_name]/alarmlimit */
243         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 10 + 1);
244
245         sprintf(key, "/apps/psensor/sensors/%s/alarmlimit", escaped_name);
246
247         res = gconf_client_get_int(client, key, NULL);
248
249         free(escaped_name);
250
251         return res ? res : def;
252 }
253
254 void config_set_sensor_alarm_limit(char *sensor_name, int alarm_limit)
255 {
256         char *escaped_name = gconf_escape_key(sensor_name, -1);
257         /* /apps/psensor/sensors/[sensor_name]/alarmlimit */
258         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 10 + 1);
259
260         sprintf(key, "/apps/psensor/sensors/%s/alarmlimit", escaped_name);
261
262         gconf_client_set_int(client, key, alarm_limit, NULL);
263
264         free(escaped_name);
265 }
266
267 int config_get_sensor_alarm_enabled(char *sid)
268 {
269         gboolean res;
270         char *escaped_name = gconf_escape_key(sid, -1);
271         /* /apps/psensor/sensors/[sensor_name]/alarmenabled */
272         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 12 + 1);
273
274         sprintf(key, "/apps/psensor/sensors/%s/alarmenabled", escaped_name);
275
276         res = gconf_client_get_bool(client, key, NULL);
277
278         free(escaped_name);
279
280         return res == TRUE;
281 }
282
283 void config_set_sensor_alarm_enabled(char *sid, int enabled)
284 {
285         char *escaped_name = gconf_escape_key(sid, -1);
286         /* /apps/psensor/sensors/[sensor_name]/alarmenabled */
287         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 12 + 1);
288
289         sprintf(key, "/apps/psensor/sensors/%s/alarmenabled", escaped_name);
290
291         gconf_client_set_bool(client, key, enabled, NULL);
292
293         free(escaped_name);
294 }
295
296 int config_is_sensor_enabled(char *sid)
297 {
298         gboolean res;
299         char *escaped_name = gconf_escape_key(sid, -1);
300         /* /apps/psensor/sensors/[sensor_name]/enabled */
301         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 7 + 1);
302
303         sprintf(key, "/apps/psensor/sensors/%s/enabled", escaped_name);
304
305         res = gconf_client_get_bool(client, key, NULL);
306
307         free(escaped_name);
308
309         return res == TRUE;
310
311 }
312
313 void config_set_sensor_enabled(char *sid, int enabled)
314 {
315         char *escaped_name = gconf_escape_key(sid, -1);
316         /* /apps/psensor/sensors/[sensor_name]/enabled */
317         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 7 + 1);
318
319         sprintf(key, "/apps/psensor/sensors/%s/enabled", escaped_name);
320
321         gconf_client_set_bool(client, key, enabled, NULL);
322
323         free(escaped_name);
324 }
325
326 char *config_get_sensor_name(char *sid)
327 {
328         char *res;
329         char *escaped_name = gconf_escape_key(sid, -1);
330         /* /apps/psensor/sensors/[sensor_name]/name */
331         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 4 + 1);
332
333         sprintf(key, "/apps/psensor/sensors/%s/name", escaped_name);
334
335         res = gconf_client_get_string(client, key, NULL);
336
337         free(escaped_name);
338
339         return res;
340 }
341
342 void config_set_sensor_name(char *sid, const char *name)
343 {
344         char *escaped_name = gconf_escape_key(sid, -1);
345         /* /apps/psensor/sensors/[sensor_name]/name */
346         char *key = malloc(22 + 2 * strlen(escaped_name) + 1 + 4 + 1);
347
348         sprintf(key, "/apps/psensor/sensors/%s/name", escaped_name);
349
350         gconf_client_set_string(client, key, name, NULL);
351
352         free(escaped_name);
353 }
354
355 static int config_is_window_decoration_enabled()
356 {
357         gboolean b;
358
359         b = gconf_client_get_bool(client,
360                                   KEY_INTERFACE_WINDOW_DECORATION_DISABLED,
361                                   NULL);
362
363         return b == FALSE;
364 }
365
366 static int config_is_window_keep_below_enabled()
367 {
368         gboolean b;
369
370         b = gconf_client_get_bool(client,
371                                   KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED,
372                                   NULL);
373
374         return b == TRUE;
375 }
376
377 static void config_set_window_decoration_enabled(int enabled)
378 {
379         if (enabled)
380                 gconf_client_set_bool
381                     (client,
382                      KEY_INTERFACE_WINDOW_DECORATION_DISABLED, FALSE, NULL);
383         else
384                 gconf_client_set_bool
385                     (client,
386                      KEY_INTERFACE_WINDOW_DECORATION_DISABLED, TRUE, NULL);
387 }
388
389 static void config_set_window_keep_below_enabled(int enabled)
390 {
391         if (enabled)
392                 gconf_client_set_bool(client,
393                                       KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED,
394                                       TRUE, NULL);
395         else
396                 gconf_client_set_bool(client,
397                                       KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED,
398                                       FALSE, NULL);
399 }
400
401 void config_init()
402 {
403         client = gconf_client_get_default();
404 }
405
406 void config_cleanup()
407 {
408         if (client) {
409                 g_object_unref(client);
410                 client = NULL;
411         }
412 }
413
414 struct config *config_load()
415 {
416         struct config *c;
417
418         c = malloc(sizeof(struct config));
419
420         c->graph_bgcolor = config_get_background_color();
421         c->graph_fgcolor = config_get_foreground_color();
422         c->graph_bg_alpha = config_get_graph_background_alpha();
423         c->alpha_channel_enabled = config_is_alpha_channel_enabled();
424         c->sensorlist_position = config_get_sensorlist_position();
425         c->window_decoration_enabled = config_is_window_decoration_enabled();
426         c->window_keep_below_enabled = config_is_window_keep_below_enabled();
427
428         c->sensor_update_interval
429             = gconf_client_get_int(client, KEY_SENSOR_UPDATE_INTERVAL, NULL);
430         if (c->sensor_update_interval < 1)
431                 c->sensor_update_interval = 1;
432
433         c->graph_update_interval
434             = gconf_client_get_int(client, KEY_GRAPH_UPDATE_INTERVAL, NULL);
435         if (c->graph_update_interval < 1)
436                 c->graph_update_interval = 1;
437
438         c->graph_monitoring_duration
439             = gconf_client_get_int(client, KEY_GRAPH_MONITORING_DURATION, NULL);
440
441         if (c->graph_monitoring_duration < 1)
442                 c->graph_monitoring_duration = 10;
443
444         c->sensor_values_max_length
445             =
446             (c->graph_monitoring_duration * 60) / c->sensor_update_interval;
447         if (c->sensor_values_max_length < 3)
448                 c->sensor_values_max_length = 3;
449
450         c->menu_bar_disabled
451                 = gconf_client_get_bool(client,
452                                         KEY_INTERFACE_MENU_BAR_DISABLED,
453                                         NULL);
454
455         c->unity_launcher_count_disabled
456                 = gconf_client_get_bool
457                 (client,
458                  KEY_INTERFACE_UNITY_LAUNCHER_COUNT_DISABLED,
459                  NULL);
460
461         c->hide_on_startup
462                 = gconf_client_get_bool(client,
463                                         KEY_INTERFACE_HIDE_ON_STARTUP,
464                                         NULL);
465
466         c->window_restore_enabled
467                 = gconf_client_get_bool(client,
468                                         KEY_INTERFACE_WINDOW_RESTORE_ENABLED,
469                                         NULL);
470
471         c->window_x = gconf_client_get_int(client,
472                                            KEY_INTERFACE_WINDOW_X,
473                                            NULL);
474         c->window_y = gconf_client_get_int(client,
475                                            KEY_INTERFACE_WINDOW_Y,
476                                            NULL);
477         c->window_w = gconf_client_get_int(client,
478                                            KEY_INTERFACE_WINDOW_W,
479                                            NULL);
480         c->window_h = gconf_client_get_int(client,
481                                            KEY_INTERFACE_WINDOW_H,
482                                            NULL);
483         c->window_divider_pos
484                 = gconf_client_get_int(client,
485                                        KEY_INTERFACE_WINDOW_DIVIDER_POS,
486                                        NULL);
487
488         if (!c->window_restore_enabled || !c->window_w || !c->window_h) {
489                 c->window_w = 800;
490                 c->window_h = 200;
491         }
492
493         return c;
494 }
495
496 void config_save(struct config *c)
497 {
498         config_set_background_color(c->graph_bgcolor);
499         config_set_foreground_color(c->graph_fgcolor);
500         config_set_graph_background_alpha(c->graph_bg_alpha);
501         config_set_sensorlist_position(c->sensorlist_position);
502         config_set_window_decoration_enabled(c->window_decoration_enabled);
503         config_set_window_keep_below_enabled(c->window_keep_below_enabled);
504
505         gconf_client_set_int(client,
506                              KEY_GRAPH_UPDATE_INTERVAL,
507                              c->graph_update_interval, NULL);
508
509         gconf_client_set_int(client,
510                              KEY_GRAPH_MONITORING_DURATION,
511                              c->graph_monitoring_duration, NULL);
512
513         gconf_client_set_int(client,
514                              KEY_SENSOR_UPDATE_INTERVAL,
515                              c->sensor_update_interval, NULL);
516
517         gconf_client_set_bool(client,
518                               KEY_INTERFACE_MENU_BAR_DISABLED,
519                               c->menu_bar_disabled, NULL);
520
521         gconf_client_set_bool(client,
522                               KEY_INTERFACE_UNITY_LAUNCHER_COUNT_DISABLED,
523                               c->unity_launcher_count_disabled, NULL);
524
525         gconf_client_set_bool(client,
526                               KEY_INTERFACE_HIDE_ON_STARTUP,
527                               c->hide_on_startup, NULL);
528
529         gconf_client_set_bool(client,
530                               KEY_INTERFACE_WINDOW_RESTORE_ENABLED,
531                               c->window_restore_enabled,
532                               NULL);
533
534         gconf_client_set_int(client,
535                              KEY_INTERFACE_WINDOW_X,
536                              c->window_x,
537                              NULL);
538         gconf_client_set_int(client,
539                              KEY_INTERFACE_WINDOW_Y,
540                              c->window_y,
541                              NULL);
542         gconf_client_set_int(client,
543                              KEY_INTERFACE_WINDOW_W,
544                              c->window_w,
545                              NULL);
546         gconf_client_set_int(client,
547                              KEY_INTERFACE_WINDOW_H,
548                              c->window_h,
549                              NULL);
550
551         gconf_client_set_int(client,
552                              KEY_INTERFACE_WINDOW_DIVIDER_POS,
553                              c->window_divider_pos,
554                              NULL);
555 }