comparison src/rootvis/config_backend.c @ 900:d985f0dcdeb0 trunk

[svn] - add a starting point for xmms-rootvis port. giacomo will need to finish this up, as my XLib skills are not enough at this time.
author nenolod
date Mon, 26 Mar 2007 01:19:26 -0700
parents
children b8da6a0b0da2
comparison
equal deleted inserted replaced
899:68508f8cdf25 900:d985f0dcdeb0
1 #include <string.h>
2 #include <audacious/configdb.h>
3
4 #include <rootvis.h>
5 #include <config.h>
6
7 extern void config_def_init(void);
8 extern void config_frontend_init(void);
9
10 void color_quad2arr(unsigned char* res, char* quad) {
11 if (sscanf(quad, "#%2hhx%2hhx%2hhx%2hhx", &res[0], &res[1], &res[2], &res[3]) != 4)
12 fprintf(stderr, "Color value %s could not be recognized as #rrggbbaa, ranging from #00000000 to #FFFFFFFF\n", quad);
13 }
14
15 char* color_arr2quad(unsigned char* src, char* quad) {
16 sprintf(quad, "#%2.2hhx%2.2hhx%2.2hhx%2.2hhx", src[0], src[1], src[2], src[3]);
17 return quad;
18 }
19
20 void cval_setdefault(struct config_value val)
21 {
22 switch (val.type)
23 {
24 case BOOLN:
25 case INT:
26 *val.vali.var = val.vali.def_value;
27 break;
28 case FLOAT:
29 *val.valf.var = val.valf.def_value;
30 break;
31 case TEXT:
32 strcpy(*val.valt.var, val.valt.def_value);
33 break;
34 case COLOR:
35 color_quad2arr(val.valc.var, val.valc.def_value);
36 break;
37 }
38 }
39
40 void cval_writefile(struct config_value val, ConfigDb *fp, char* sect)
41 {
42 switch (val.type)
43 {
44 case BOOLN:
45 case INT:
46 bmp_cfg_db_set_int(fp, sect, val.name, *val.vali.var);
47 break;
48 case FLOAT:
49 bmp_cfg_db_set_float(fp, sect, val.name, *val.valf.var);
50 break;
51 case TEXT:
52 bmp_cfg_db_set_string(fp, sect, val.name, *val.valt.var);
53 break;
54 case COLOR:
55 {
56 char colortmp[10];
57 bmp_cfg_db_set_string(fp, sect, val.name, color_arr2quad(val.valc.var, colortmp));
58 }
59 break;
60 }
61 }
62
63 void cval_readfile(struct config_value val, ConfigDb *fp, char* sect)
64 {
65 switch (val.type)
66 {
67 case BOOLN:
68 case INT:
69 if (!(bmp_cfg_db_get_int(fp, sect, val.name, val.vali.var)))
70 cval_writefile(val, fp, sect);
71 break;
72 case FLOAT:
73 if (!(bmp_cfg_db_get_float(fp, sect, val.name, val.valf.var)))
74 cval_writefile(val, fp, sect);
75 break;
76 case TEXT:
77 if (!(bmp_cfg_db_get_string(fp, sect, val.name, val.valt.var)))
78 cval_writefile(val, fp, sect);
79 break;
80 case COLOR:
81 {
82 char* colortmp = NULL;
83 if (!(bmp_cfg_db_get_string(fp, sect, val.name, &colortmp)))
84 cval_writefile(val, fp, sect);
85 else color_quad2arr(val.valc.var, colortmp);
86 }
87 break;
88 }
89 }
90
91 // this parses ~/.xmms/config
92 // if a setting is not found, it is created to make it possible to edit the default settings
93 // after the configuration dialogue is finished, this won't be necessary any more
94 void config_read(int number) {
95 int i, j;
96 ConfigDb *fp;
97
98 fp = bmp_cfg_db_open();
99
100 print_status("Reading configuration");
101
102 if (number == 2)
103 for (i = 0; i < Cmain.count; ++i)
104 {
105 cval_setdefault(Cmain.def[i]);
106 cval_readfile(Cmain.def[i], fp, "rootvis");
107 }
108
109 for (j = 0; j < 2; ++j)
110 if ((number == j)||(number == 2))
111 for (i = 0; i < Cchannel[j].count; ++i)
112 {
113 cval_setdefault(Cchannel[j].def[i]);
114 cval_readfile(Cchannel[j].def[i], fp, (j == 0 ? "rootvis" : "rootvis2"));
115 }
116
117 bmp_cfg_db_close(fp);
118 print_status("Configuration finished");
119 }
120
121 void config_write(int number) {
122 int i, j;
123 ConfigDb *fp;
124
125 print_status("Writing configuration");
126 fp = bmp_cfg_db_open();
127
128 if (number == 2)
129 for (i = 0; i < Cmain.count; ++i)
130 cval_writefile(Cmain.def[i], fp, "rootvis");
131
132 for (j = 0; j < 2; ++j)
133 if ((number == j)||(number == 2))
134 for (i = 0; i < Cchannel[j].count; ++i)
135 cval_writefile(Cchannel[j].def[i], fp, (j == 0 ? "rootvis" : "rootvis2"));
136
137 bmp_cfg_db_close(fp);
138 }
139
140 void config_revert(int number) {
141 /* as the configs aren't saved in a thread save way, we have to lock while we read them */
142 threads_lock();
143 config_read(number);
144
145 // set the right change bits, according to wether we change channel 0, 1 or both (2)
146 if (number == 2) number = 15;
147 else number = 3 + number*9;
148 threads_unlock(number);
149 }
150
151 void config_save(int number) {
152 threads_lock();
153 config_write(number);
154 threads_unlock(0);
155 }
156
157 void config_init(void) {
158 static int initialized = 0;
159 if (initialized == 0) {
160 print_status("First initialization");
161
162 conf.geo[0].display = malloc(256);
163 conf.geo[1].display = malloc(256);
164
165 config_def_init();
166 config_frontend_init();
167
168 config_read(2);
169
170 initialized++;
171 }
172 }