Mercurial > audlegacy-plugins
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 } |