Mercurial > audlegacy-plugins
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rootvis/config_backend.c Mon Mar 26 01:19:26 2007 -0700 @@ -0,0 +1,172 @@ +#include <string.h> +#include <audacious/configdb.h> + +#include <rootvis.h> +#include <config.h> + +extern void config_def_init(void); +extern void config_frontend_init(void); + +void color_quad2arr(unsigned char* res, char* quad) { + if (sscanf(quad, "#%2hhx%2hhx%2hhx%2hhx", &res[0], &res[1], &res[2], &res[3]) != 4) + fprintf(stderr, "Color value %s could not be recognized as #rrggbbaa, ranging from #00000000 to #FFFFFFFF\n", quad); +} + +char* color_arr2quad(unsigned char* src, char* quad) { + sprintf(quad, "#%2.2hhx%2.2hhx%2.2hhx%2.2hhx", src[0], src[1], src[2], src[3]); + return quad; +} + +void cval_setdefault(struct config_value val) +{ + switch (val.type) + { + case BOOLN: + case INT: + *val.vali.var = val.vali.def_value; + break; + case FLOAT: + *val.valf.var = val.valf.def_value; + break; + case TEXT: + strcpy(*val.valt.var, val.valt.def_value); + break; + case COLOR: + color_quad2arr(val.valc.var, val.valc.def_value); + break; + } +} + +void cval_writefile(struct config_value val, ConfigDb *fp, char* sect) +{ + switch (val.type) + { + case BOOLN: + case INT: + bmp_cfg_db_set_int(fp, sect, val.name, *val.vali.var); + break; + case FLOAT: + bmp_cfg_db_set_float(fp, sect, val.name, *val.valf.var); + break; + case TEXT: + bmp_cfg_db_set_string(fp, sect, val.name, *val.valt.var); + break; + case COLOR: + { + char colortmp[10]; + bmp_cfg_db_set_string(fp, sect, val.name, color_arr2quad(val.valc.var, colortmp)); + } + break; + } +} + +void cval_readfile(struct config_value val, ConfigDb *fp, char* sect) +{ + switch (val.type) + { + case BOOLN: + case INT: + if (!(bmp_cfg_db_get_int(fp, sect, val.name, val.vali.var))) + cval_writefile(val, fp, sect); + break; + case FLOAT: + if (!(bmp_cfg_db_get_float(fp, sect, val.name, val.valf.var))) + cval_writefile(val, fp, sect); + break; + case TEXT: + if (!(bmp_cfg_db_get_string(fp, sect, val.name, val.valt.var))) + cval_writefile(val, fp, sect); + break; + case COLOR: + { + char* colortmp = NULL; + if (!(bmp_cfg_db_get_string(fp, sect, val.name, &colortmp))) + cval_writefile(val, fp, sect); + else color_quad2arr(val.valc.var, colortmp); + } + break; + } +} + +// this parses ~/.xmms/config +// if a setting is not found, it is created to make it possible to edit the default settings +// after the configuration dialogue is finished, this won't be necessary any more +void config_read(int number) { + int i, j; + ConfigDb *fp; + + fp = bmp_cfg_db_open(); + + print_status("Reading configuration"); + + if (number == 2) + for (i = 0; i < Cmain.count; ++i) + { + cval_setdefault(Cmain.def[i]); + cval_readfile(Cmain.def[i], fp, "rootvis"); + } + + for (j = 0; j < 2; ++j) + if ((number == j)||(number == 2)) + for (i = 0; i < Cchannel[j].count; ++i) + { + cval_setdefault(Cchannel[j].def[i]); + cval_readfile(Cchannel[j].def[i], fp, (j == 0 ? "rootvis" : "rootvis2")); + } + + bmp_cfg_db_close(fp); + print_status("Configuration finished"); +} + +void config_write(int number) { + int i, j; + ConfigDb *fp; + + print_status("Writing configuration"); + fp = bmp_cfg_db_open(); + + if (number == 2) + for (i = 0; i < Cmain.count; ++i) + cval_writefile(Cmain.def[i], fp, "rootvis"); + + for (j = 0; j < 2; ++j) + if ((number == j)||(number == 2)) + for (i = 0; i < Cchannel[j].count; ++i) + cval_writefile(Cchannel[j].def[i], fp, (j == 0 ? "rootvis" : "rootvis2")); + + bmp_cfg_db_close(fp); +} + +void config_revert(int number) { + /* as the configs aren't saved in a thread save way, we have to lock while we read them */ + threads_lock(); + config_read(number); + + // set the right change bits, according to wether we change channel 0, 1 or both (2) + if (number == 2) number = 15; + else number = 3 + number*9; + threads_unlock(number); +} + +void config_save(int number) { + threads_lock(); + config_write(number); + threads_unlock(0); +} + +void config_init(void) { + static int initialized = 0; + if (initialized == 0) { + print_status("First initialization"); + + conf.geo[0].display = malloc(256); + conf.geo[1].display = malloc(256); + + config_def_init(); + config_frontend_init(); + + config_read(2); + + initialized++; + } +}
