added option to restore window position and size
[psensor.git] / src / cfg.c
1 /*
2     Copyright (C) 2010-2011 jeanfi@gmail.com
3
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 2 of the License, or
7     (at your option) any later version.
8
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.
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
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <string.h>
23 #include <ctype.h>
24
25 #include <gconf/gconf-client.h>
26
27 #include "cfg.h"
28
29 #define KEY_SENSOR_UPDATE_INTERVAL "/apps/psensor/sensor/update_interval"
30
31 #define KEY_GRAPH_UPDATE_INTERVAL "/apps/psensor/graph/update_interval"
32 #define KEY_GRAPH_MONITORING_DURATION "/apps/psensor/graph/monitoring_duration"
33
34 #define KEY_GRAPH_BACKGROUND_COLOR "/apps/psensor/graph/background_color"
35 #define DEFAULT_GRAPH_BACKGROUND_COLOR "#e8f4e8f4a8f5"
36
37 #define KEY_GRAPH_BACKGROUND_ALPHA  "/apps/psensor/graph/background_alpha"
38 #define DEFAULT_GRAPH_BACKGROUND_ALPHA "1.0"
39
40 #define KEY_GRAPH_FOREGROUND_COLOR  "/apps/psensor/graph/foreground_color"
41 #define DEFAULT_GRAPH_FOREGROUND_COLOR "#000000000000"
42
43 #define KEY_ALPHA_CHANNEL_ENABLED  "/apps/psensor/graph/alpha_channel_enabled"
44 #define DEFAULT_ALPHA_CHANNEL_ENABLED 0
45
46 #define KEY_INTERFACE_SENSORLIST_POSITION \
47 "/apps/psensor/interface/sensorlist_position"
48
49 #define KEY_INTERFACE_WINDOW_DECORATION_DISABLED \
50 "/apps/psensor/interface/window_decoration_disabled"
51
52 #define KEY_INTERFACE_WINDOW_KEEP_BELOW_ENABLED \
53 "/apps/psensor/interface/window_keep_below_enabled"
54
55 #define KEY_INTERFACE_MENU_BAR_DISABLED \
56 "/apps/psensor/interface/menu_bar_disabled"
57
58 #define KEY_INTERFACE_UNITY_LAUNCHER_COUNT_DISABLED \
59 "/apps/psensor/interface/unity_launcher_count_disabled"
60
61 #define KEY_INTERFACE_HIDE_ON_STARTUP \
62 "/apps/psensor/interface/hide_on_startup"
63
64 #define KEY_INTERFACE_WINDOW_RESTORE_ENABLED \
65 "/apps/psensor/interface/window_restore_enabled"
66
67 #define KEY_INTERFACE_WINDOW_X "/apps/psensor/interface/window_x"
68 #define KEY_INTERFACE_WINDOW_Y "/apps/psensor/interface/window_y"
69 #define KEY_INTERFACE_WINDOW_W "/apps/psensor/interface/window_w"
70 #define KEY_INTERFACE_WINDOW_H "/apps/psensor/interface/window_h"
71
72
73 GConfClient *client;
74
75 static char *get_string(char *key, char *default_value)
76 {
77         char *value = gconf_client_get_string(client,
78                                               key,
79                                               NULL);
80
81         if (!value) {
82                 value = strdup(default_value);
83
84                 gconf_client_set_string(client, key, default_value, NULL);
85         }
86
87         return value;
88 }
89
90 static struct color *config_get_background_color()
91 {
92
93         char *scolor = get_string(KEY_GRAPH_BACKGROUND_COLOR,
94                                          DEFAULT_GRAPH_BACKGROUND_COLOR);
95
96         struct color *c = string_to_color(scolor);
97
98         free(scolor);
99
100         if (c == NULL)
101                 return color_new(0xffff, 0xffff, 0xffff);
102
103         return c;
104 }
105
106 static struct color *config_get_foreground_color()
107 {
108         char *scolor = get_string(KEY_GRAPH_FOREGROUND_COLOR,
109                                   DEFAULT_GRAPH_FOREGROUND_COLOR);
110
111         struct color *c = string_to_color(scolor);
112
113         free(scolor);
114
115         if (c == NULL)
116                 return color_new(0x0000, 0x0000, 0x0000);
117
118         return c;
119 }
120
121 static int config_is_alpha_channel_enabled()
122 {
123         gboolean b = gconf_client_get_bool(client,
124                                            KEY_ALPHA_CHANNEL_ENABLED,
125                                            NULL);
126
127         return b == TRUE;
128 }
129
130 static int config_get_sensorlist_position()
131 {
132         return gconf_client_get_int(client,
133                                     KEY_INTERFACE_SENSORLIST_POSITION, NULL);
134 }
135
136 static void config_set_sensorlist_position(int pos)
137 {
138         gconf_client_set_int(client,
139                              KEY_INTERFACE_SENSORLIST_POSITION, pos, NULL);
140 }
141
142 static double config_get_graph_background_alpha()
143 {
144         double a = gconf_client_get_float(client,
145                                           KEY_GRAPH_BACKGROUND_ALPHA,
146                                           NULL);
147
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
484         if (!c->window_w || !c->window_h) {
485                 c->window_w = 800;
486                 c->window_h = 200;
487         }
488
489         return c;
490 }
491
492 void config_save(struct config *c)
493 {
494         config_set_background_color(c->graph_bgcolor);
495         config_set_foreground_color(c->graph_fgcolor);
496         config_set_graph_background_alpha(c->graph_bg_alpha);
497         config_set_sensorlist_position(c->sensorlist_position);
498         config_set_window_decoration_enabled(c->window_decoration_enabled);
499         config_set_window_keep_below_enabled(c->window_keep_below_enabled);
500
501         gconf_client_set_int(client,
502                              KEY_GRAPH_UPDATE_INTERVAL,
503                              c->graph_update_interval, NULL);
504
505         gconf_client_set_int(client,
506                              KEY_GRAPH_MONITORING_DURATION,
507                              c->graph_monitoring_duration, NULL);
508
509         gconf_client_set_int(client,
510                              KEY_SENSOR_UPDATE_INTERVAL,
511                              c->sensor_update_interval, NULL);
512
513         gconf_client_set_bool(client,
514                               KEY_INTERFACE_MENU_BAR_DISABLED,
515                               c->menu_bar_disabled, NULL);
516
517         gconf_client_set_bool(client,
518                               KEY_INTERFACE_UNITY_LAUNCHER_COUNT_DISABLED,
519                               c->unity_launcher_count_disabled, NULL);
520
521         gconf_client_set_bool(client,
522                               KEY_INTERFACE_HIDE_ON_STARTUP,
523                               c->hide_on_startup, NULL);
524
525         gconf_client_set_bool(client,
526                               KEY_INTERFACE_WINDOW_RESTORE_ENABLED,
527                               c->window_restore_enabled,
528                               NULL);
529
530         gconf_client_set_int(client,
531                              KEY_INTERFACE_WINDOW_X,
532                              c->window_x,
533                              NULL);
534         gconf_client_set_int(client,
535                              KEY_INTERFACE_WINDOW_Y,
536                              c->window_y,
537                              NULL);
538         gconf_client_set_int(client,
539                              KEY_INTERFACE_WINDOW_W,
540                              c->window_w,
541                              NULL);
542         gconf_client_set_int(client,
543                              KEY_INTERFACE_WINDOW_H,
544                              c->window_h,
545                              NULL);
546 }