changeset 57:85811bcd049e

Improved, re-written configuration code and lots of minor fixes
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 22 Jun 2003 11:01:03 +0000
parents 6a3ce7260ae1
children 4a1a8fbb4273
files src/Makefile.am src/xmms-sid.cc src/xs_config.c src/xs_config.h src/xs_length.c src/xs_support.c src/xs_support.h
diffstat 7 files changed, 300 insertions(+), 276 deletions(-) [+]
line wrap: on
line diff
--- a/src/Makefile.am	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/Makefile.am	Sun Jun 22 11:01:03 2003 +0000
@@ -2,7 +2,7 @@
 lib_LTLIBRARIES = libxmmssid.la
 
 # Generals
-AM_CFLAGS   = -D_REENTRANT @GTK_CFLAGS@ @SIDPLAY1_INCLUDES@ @SIDPLAY2_INCLUDES@
+AM_CFLAGS   = -W -Wall -D_REENTRANT @GTK_CFLAGS@ @SIDPLAY1_INCLUDES@ @SIDPLAY2_INCLUDES@
 AM_CXXFLAGS = $(AM_CFLAGS)
 
 libxmmssid_la_LDFLAGS = -module -avoid-version
--- a/src/xmms-sid.cc	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xmms-sid.cc	Sun Jun 22 11:01:03 2003 +0000
@@ -87,7 +87,8 @@
  /* Create sub-song control window */
  if (xs_ctrlwin != NULL)
 	{
-	gdk_window_raise(xs_ctrlwin->window);
+	if (xs_cfg.alwaysRaise)
+		gdk_window_raise(xs_ctrlwin->window);
 	return;
 	}
 
@@ -108,6 +109,9 @@
 
  xs_read_configuration();
 
+ add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps");
+
+ /* Initialize status */
  xs_status.isError	= FALSE;
  xs_status.isPlaying	= FALSE;
  xs_status.nSongs	= 0;
@@ -138,7 +142,7 @@
 	
  /* Initialize STIL structures */
 
- xs_ctrlwin_open();
+// xs_ctrlwin_open();
 
 // FIXME FIXME FIx ME
 
@@ -581,8 +585,8 @@
  */
 gchar *xs_filetitle_get(gchar *pcFilename, void *pfInfo, gint iSubTune)
 {
- gint i, j, iLength;
- gchar *pcResult;
+ gint j, iLength;
+ gchar *pcStr, *pcResult;
  t_xs_tuneinfo *finfo = (t_xs_tuneinfo *) pfInfo;
 #ifdef HAVE_XMMSEXTRA
  TitleInput *ptInput;
@@ -635,31 +639,46 @@
 		return g_strdup(finfo->infoString[0]);
 		}
 
-	/* Construct the final result info */
-	for (j = i = 0; i < strlen(xs_cfg.titleFormat); i++)
+	/* Estimate the length of the string */
+	pcStr = xs_cfg.titleFormat;
+	iLength = 0;
+	while (*pcStr)
+	{
+	if (*pcStr == '%')
 		{
-		if (xs_cfg.titleFormat[i] == '%')
-			{
-			switch (xs_cfg.titleFormat[++i]) {
-			case '1':
-				xs_strpcat(&pcResult, &j, finfo->authorString);
-				break;
+		switch (*(++pcStr)) {
+		case '1': iLength += strlen(finfo->authorString); break;
+		case '2': iLength += strlen(finfo->nameString); break;
+		case '3': iLength += strlen(finfo->copyrightString); break;
+		case '4': iLength += strlen(finfo->formatString); break;
+		case '%': iLength++;
+		}
+		} else
+		iLength++;
+	}
 
-			case '2':
-				xs_strpcat(&pcResult, &j, finfo->nameString);
-				break;
-
-			case '3':
-				xs_strpcat(&pcResult, &j, finfo->copyrightString);
-				break;
+	/* Allocate memory */
+	pcResult = (gchar *) g_malloc(iLength + 2);
+	if (pcResult == NULL)
+		return g_strdup(finfo->infoString[0]);
 
-			case '4':
-				xs_strpcat(&pcResult, &j, finfo->formatString);
-				break;
-			} /* case */
-			} else
-			pcResult[j++] = xs_cfg.titleFormat[i];
+	/* Create the string */
+	pcStr = xs_cfg.titleFormat;
+	j = 0;
+	while (*pcStr)
+	{
+	if (*pcStr == '%')
+		{
+		switch (*(++pcStr)) {
+		case '1': xs_strpcat(pcResult, &j, finfo->authorString); break;
+		case '2': xs_strpcat(pcResult, &j, finfo->nameString); break;
+		case '3': xs_strpcat(pcResult, &j, finfo->copyrightString); break;
+		case '4': xs_strpcat(pcResult, &j, finfo->formatString); break;
+		case '%': pcResult[j++] = '%'; break;
 		}
+		} else
+		pcResult[j++] = *pcStr;
+	}
 
 	pcResult[j] = 0;
 #ifdef HAVE_XMMSEXTRA
--- a/src/xs_config.c	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xs_config.c	Sun Jun 22 11:01:03 2003 +0000
@@ -40,37 +40,82 @@
  * Configuration specific stuff
  */
 t_xs_cfg_item xs_cfgtable[] = {
-	{ATYPE_INT,	&xs_cfg.fmtBitsPerSample,"fmtBitsPerSample"},
-	{ATYPE_INT,	&xs_cfg.fmtChannels,	"fmtChannels"},
-	{ATYPE_INT,	&xs_cfg.fmtFrequency,	"fmtFrequency"},
+	{CTYPE_INT,	&xs_cfg.fmtBitsPerSample,	"fmtBitsPerSample"},
+	{CTYPE_INT,	&xs_cfg.fmtChannels,		"fmtChannels"},
+	{CTYPE_INT,	&xs_cfg.fmtFrequency,		"fmtFrequency"},
 
-	{ATYPE_BOOL,	&xs_cfg.mos8580,	"mos8580"},
-	{ATYPE_BOOL,	&xs_cfg.emulateFilters,	"emulateFilters"},
-	{ATYPE_FLOAT,	&xs_cfg.filterFs,	"filterFs"},
-	{ATYPE_FLOAT,	&xs_cfg.filterFm,	"filterFm"},
-	{ATYPE_FLOAT,	&xs_cfg.filterFt,	"filterFt"},
-	{ATYPE_INT,	&xs_cfg.memoryMode,	"memoryMode"},
-	{ATYPE_INT,	&xs_cfg.clockSpeed,	"clockSpeed"},
-	{ATYPE_BOOL,	&xs_cfg.forceSpeed,	"forceSpeed"},
+	{CTYPE_BOOL,	&xs_cfg.mos8580,		"mos8580"},
+	{CTYPE_BOOL,	&xs_cfg.emulateFilters,		"emulateFilters"},
+	{CTYPE_FLOAT,	&xs_cfg.filterFs,		"filterFs"},
+	{CTYPE_FLOAT,	&xs_cfg.filterFm,		"filterFm"},
+	{CTYPE_FLOAT,	&xs_cfg.filterFt,		"filterFt"},
+	{CTYPE_INT,	&xs_cfg.memoryMode,		"memoryMode"},
+	{CTYPE_INT,	&xs_cfg.clockSpeed,		"clockSpeed"},
+	{CTYPE_BOOL,	&xs_cfg.forceSpeed,		"forceSpeed"},
 
-	{ATYPE_BOOL,	&xs_cfg.oversampleEnable,"oversampleEnable"},
-	{ATYPE_INT,	&xs_cfg.oversampleFactor,"oversampleFactor"},
+	{CTYPE_BOOL,	&xs_cfg.oversampleEnable,	"oversampleEnable"},
+	{CTYPE_INT,	&xs_cfg.oversampleFactor,	"oversampleFactor"},
 
-	{ATYPE_BOOL,	&xs_cfg.playMaxTimeEnable,"playMaxTimeEnable"},
-	{ATYPE_INT,	&xs_cfg.playMaxTime,	"playMaxTime"},
-	{ATYPE_BOOL,	&xs_cfg.songlenDBEnable,"songlenDBEnable"},
-	{ATYPE_STR,	&xs_cfg.songlenDBPath,	"songlenDBPath"},
+	{CTYPE_BOOL,	&xs_cfg.playMaxTimeEnable,	"playMaxTimeEnable"},
+	{CTYPE_INT,	&xs_cfg.playMaxTime,		"playMaxTime"},
+	{CTYPE_BOOL,	&xs_cfg.songlenDBEnable,	"songlenDBEnable"},
+	{CTYPE_STR,	&xs_cfg.songlenDBPath,		"songlenDBPath"},
 
-	{ATYPE_BOOL,	&xs_cfg.stilDBEnable,	"stilDBEnable"},
-	{ATYPE_STR,	&xs_cfg.stilDBPath,	"stilDBPath"},
+	{CTYPE_BOOL,	&xs_cfg.stilDBEnable,		"stilDBEnable"},
+	{CTYPE_STR,	&xs_cfg.stilDBPath,		"stilDBPath"},
 
-	{ATYPE_BOOL,	&xs_cfg.detectMagic,	"detectMagic"},
+	{CTYPE_BOOL,	&xs_cfg.detectMagic,		"detectMagic"},
+	{CTYPE_BOOL,	&xs_cfg.alwaysRaise,		"alwaysRaise"},
 
-	{ATYPE_BOOL,	&xs_cfg.titleOverride,	"titleOverride"},
-	{ATYPE_STR,	&xs_cfg.titleFormat,	"titleFormat"}
+	{CTYPE_BOOL,	&xs_cfg.titleOverride,		"titleOverride"},
+	{CTYPE_STR,	&xs_cfg.titleFormat,		"titleFormat"}
 };
 
-const gint XS_CFGTABLE_MAX = (sizeof(xs_cfgtable) / sizeof(t_xs_cfg_item));
+const gint xs_cfgtable_max = (sizeof(xs_cfgtable) / sizeof(t_xs_cfg_item));
+
+
+t_xs_wid_item xs_widtable[] = {
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_16bit",	&xs_cfg.fmtBitsPerSample,	XS_RES_16BIT },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_8bit",		&xs_cfg.fmtBitsPerSample,	XS_RES_8BIT },
+
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_mono",		&xs_cfg.fmtChannels,		XS_CHN_MONO },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_stereo",	&xs_cfg.fmtChannels,		XS_CHN_STEREO },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_autopan",	&xs_cfg.fmtChannels,		XS_CHN_AUTOPAN },
+
+{ WTYPE_SPIN,	CTYPE_INT,	"cfg_samplerate",	&xs_cfg.fmtFrequency,		0 },
+
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_mos8580",	&xs_cfg.mos8580,		0 },
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_filters",	&xs_cfg.emulateFilters,		0 },
+
+{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_emu_filt_fs",	&xs_cfg.filterFs,		0 },
+{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_emu_filt_fm",	&xs_cfg.filterFm,		0 },
+{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_emu_filt_ft",	&xs_cfg.filterFt,		0 },
+
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_real",	&xs_cfg.memoryMode,		XS_MPU_REAL },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_banksw",	&xs_cfg.memoryMode,		XS_MPU_BANK_SWITCHING },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_transrom",	&xs_cfg.memoryMode,		XS_MPU_TRANSPARENT_ROM },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_playsid",	&xs_cfg.memoryMode,		XS_MPU_PLAYSID_ENVIRONMENT },
+
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_clock_ntsc",	&xs_cfg.clockSpeed,		XS_CLOCK_NTSC },
+{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_clock_pal",	&xs_cfg.clockSpeed,		XS_CLOCK_PAL },
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_clock_force",	&xs_cfg.forceSpeed,		0 },
+
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_sld_usemaxtime",	&xs_cfg.playMaxTimeEnable,	0 },
+{ WTYPE_SPIN,	CTYPE_INT,	"cfg_sld_maxtime",	&xs_cfg.playMaxTime,		0 },
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_sld_enable",	&xs_cfg.songlenDBEnable,	0 },
+{ WTYPE_TEXT,	CTYPE_STR,	"cfg_sld_dbpath",	&xs_cfg.songlenDBPath,		0 },
+
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_stil_enable",	&xs_cfg.stilDBEnable,		0 },
+{ WTYPE_TEXT,	CTYPE_STR,	"cfg_stil_dbpath",	&xs_cfg.stilDBPath,		0 },
+
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_detectmagic",	&xs_cfg.detectMagic,		0 },
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_alwaysraise",	&xs_cfg.alwaysRaise,		0 },
+
+{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_ftitle_override",	&xs_cfg.titleOverride,		0 },
+{ WTYPE_TEXT,	CTYPE_STR,	"cfg_ftitle_format",	&xs_cfg.titleFormat,		0 }
+};
+
+const gint xs_widtable_max = (sizeof(xs_widtable) / sizeof(t_xs_wid_item));
 
 
 /*
@@ -99,7 +144,7 @@
  XSDEBUG("initializing configuration ...\n");
 
  /* Pre-initialize configuration structure */
- xs_cfg.fmtBitsPerSample		= 16;
+ xs_cfg.fmtBitsPerSample	= XS_RES_16BIT;
  xs_cfg.fmtChannels		= XS_CHN_MONO;
  xs_cfg.fmtFrequency		= 44100;
 
@@ -128,6 +173,7 @@
  xs_strcalloc(&xs_cfg.stilDBPath, "~/C64Music/DOCUMENTS/STIL.txt");
 
  xs_cfg.detectMagic		= FALSE;
+ xs_cfg.alwaysRaise		= TRUE;
 
 #ifdef HAVE_XMMSEXTRA
  xs_cfg.titleOverride		= FALSE;
@@ -155,26 +201,26 @@
 	}
 
  /* Read the new settings from XMMS configuration file */
- for (i = 0; i < XS_CFGTABLE_MAX; i++)
+ for (i = 0; i < xs_cfgtable_max; i++)
  	{
-	switch (xs_cfgtable[i].atype) {
-	case ATYPE_INT:
-		xmms_cfg_read_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, (gint *) xs_cfgtable[i].adata);
+	switch (xs_cfgtable[i].valType) {
+	case CTYPE_INT:
+		xmms_cfg_read_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, (gint *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_BOOL:
-		xmms_cfg_read_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, (gboolean *) xs_cfgtable[i].adata);
+	case CTYPE_BOOL:
+		xmms_cfg_read_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, (gboolean *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_FLOAT:
-		xmms_cfg_read_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, (gfloat *) xs_cfgtable[i].adata);
+	case CTYPE_FLOAT:
+		xmms_cfg_read_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, (gfloat *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_STR:
-		if (xmms_cfg_read_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, (gchar **) &tmpStr))
+	case CTYPE_STR:
+		if (xmms_cfg_read_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, (gchar **) &tmpStr))
 			{
 			/* Read was successfull */
-			xs_strcalloc((gchar **) xs_cfgtable[i].adata, tmpStr);
+			xs_strcalloc((gchar **) xs_cfgtable[i].valData, tmpStr);
 			g_free(tmpStr);
 			}
 		break;
@@ -220,23 +266,23 @@
 
 
  /* Write the new settings to XMMS configuration file */
- for (i = 0; i < XS_CFGTABLE_MAX; i++)
+ for (i = 0; i < xs_cfgtable_max; i++)
  	{
-	switch (xs_cfgtable[i].atype) {
-	case ATYPE_INT:
-		xmms_cfg_write_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, *(gint *) xs_cfgtable[i].adata);
+	switch (xs_cfgtable[i].valType) {
+	case CTYPE_INT:
+		xmms_cfg_write_int(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, *(gint *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_BOOL:
-		xmms_cfg_write_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, *(gboolean *) xs_cfgtable[i].adata);
+	case CTYPE_BOOL:
+		xmms_cfg_write_boolean(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, *(gboolean *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_FLOAT:
-		xmms_cfg_write_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, *(gfloat *) xs_cfgtable[i].adata);
+	case CTYPE_FLOAT:
+		xmms_cfg_write_float(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, *(gfloat *) xs_cfgtable[i].valData);
 		break;
 
-	case ATYPE_STR:
-		xmms_cfg_write_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].aname, *(gchar **) xs_cfgtable[i].adata);
+	case CTYPE_STR:
+		xmms_cfg_write_string(cfgFile, XS_CONFIG_IDENT, xs_cfgtable[i].valName, *(gchar **) xs_cfgtable[i].valData);
 		break;
 
 	default:
@@ -275,80 +321,64 @@
  */
 void xs_cfg_ok(void)
 {
+ gint i;
+ gfloat tmpValue;
+
  XSDEBUG("get data from widgets to config...\n");
 
- /* Check the resolution settings */
- if (GTK_TOGGLE_BUTTON(LUW("cfg_res_16bit"))->active)
-	xs_cfg.fmtBitsPerSample = XS_RES_16BIT;
-	else
-	xs_cfg.fmtBitsPerSample = XS_RES_8BIT;
-
-
- /* Channel settings */
- if (GTK_TOGGLE_BUTTON(LUW("cfg_chn_mono"))->active)
-	xs_cfg.fmtChannels = XS_CHN_MONO;
-	else
- if (GTK_TOGGLE_BUTTON(LUW("cfg_chn_stereo"))->active)
-	xs_cfg.fmtChannels = XS_CHN_STEREO;
-	else
- if (GTK_TOGGLE_BUTTON(LUW("cfg_chn_autopan"))->active)
-	xs_cfg.fmtChannels = XS_CHN_AUTOPAN;
-
-
- /* Frequency setting */
- xs_cfg.fmtFrequency = (gint) GTK_ADJUSTMENT(LUW("cfg_samplerate"))->value;
-
-
- /* Filter and waveform settings */
- xs_cfg.mos8580 = GTK_TOGGLE_BUTTON(LUW("cfg_emu_mos8580"))->active;
-
- xs_cfg.emulateFilters = GTK_TOGGLE_BUTTON(LUW("cfg_emu_filters"))->active;
-
- xs_cfg.filterFs = GTK_ADJUSTMENT(LUW("cfg_filt_fs_adj"))->value;
- xs_cfg.filterFm = GTK_ADJUSTMENT(LUW("cfg_filt_fm_adj"))->value;
- xs_cfg.filterFt = GTK_ADJUSTMENT(LUW("cfg_filt_ft_adj"))->value;
-
+ for (i = 0; i < xs_widtable_max; i++)
+ 	{
+	switch (xs_widtable[i].widType) {
+	case WTYPE_BGROUP:
+		/* Check if toggle-button is active */
+		if (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active)
+			{
+			/* Yes, set the constant value */
+			*((gint *) xs_widtable[i].valData) = xs_widtable[i].valSet;
+			}
+		break;
+	
+	case WTYPE_SPIN:
+	case WTYPE_SCALE:
+		/* Get the value */
+		switch (xs_widtable[i].widType) {
+		case WTYPE_SPIN:
+			tmpValue = gtk_spin_button_get_adjustment(
+				GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value;
+			break;
+		
+		case WTYPE_SCALE:
+			tmpValue = gtk_range_get_adjustment(
+				GTK_RANGE(LUW(xs_widtable[i].widName)))->value;
+			break;
+		}
+		
+		/* Set the value */
+		switch (xs_widtable[i].valType) {
+		case CTYPE_INT:
+			*((gint *) xs_widtable[i].valData) = (gint) tmpValue;
+			break;
 
- /* Memorymode settings */
- if (GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_real"))->active)
-	xs_cfg.memoryMode = XS_MPU_REAL;
-	else
- if (GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_banksw"))->active)
-	xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING;
-	else
- if (GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_transrom"))->active)
-	xs_cfg.memoryMode = XS_MPU_TRANSPARENT_ROM;
-	else
- if (GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_playsid"))->active)
-	xs_cfg.memoryMode = XS_MPU_PLAYSID_ENVIRONMENT;
-
- /* Clockspeed settings */
- if (GTK_TOGGLE_BUTTON(LUW("cfg_clock_ntsc"))->active)
-	xs_cfg.clockSpeed = XS_CLOCK_NTSC;
-	else
-	xs_cfg.clockSpeed = XS_CLOCK_PAL;
+		case CTYPE_FLOAT:
+			*((gfloat *) xs_widtable[i].valData) = tmpValue;
+			break;
+		}
+		break;
+	
+	case WTYPE_BUTTON:
+		/* Check if toggle-button is active */
+		*((gboolean *) xs_widtable[i].valData) =
+			(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active);
+		break;
 
- xs_cfg.forceSpeed = GTK_TOGGLE_BUTTON(LUW("cfg_clock_force"))->active;
-
-
- /* Songlength-detection settings */
- xs_cfg.playMaxTimeEnable = GTK_TOGGLE_BUTTON(LUW("cfg_sld_usemaxtime"))->active;
- xs_cfg.playMaxTime = GTK_ADJUSTMENT(LUW("cfg_sld_maxtime_adj"))->value;
-
- xs_cfg.songlenDBEnable = (GTK_TOGGLE_BUTTON(LUW("cfg_sld"))->active);
- xs_strcalloc(&xs_cfg.songlenDBPath, gtk_entry_get_text(GTK_ENTRY(LUW("cfg_sld_dbpath"))));
-
-
- /* STIL and miscellaneous settings */
- xs_cfg.stilDBEnable = GTK_TOGGLE_BUTTON(LUW("cfg_stil_use"))->active;
- xs_strcalloc(&xs_cfg.stilDBPath, gtk_entry_get_text(GTK_ENTRY(LUW("cfg_stil_path"))));
-
- xs_cfg.detectMagic = GTK_TOGGLE_BUTTON(LUW("cfg_detectmagic"))->active;
-
- /* Title settings */
- xs_cfg.titleOverride = GTK_TOGGLE_BUTTON(LUW("cfg_ftitle_override"))->active;
- xs_strcalloc(&xs_cfg.titleFormat, gtk_entry_get_text(GTK_ENTRY(LUW("cfg_ftitle_format"))));
-
+	case WTYPE_TEXT:
+		/* Get text from text-widget */
+		xs_strcalloc((gchar **) xs_widtable[i].valData,
+			gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName)))
+			);
+		break;
+	}
+	}
 
  /* Write settings */
  xs_write_configuration();
@@ -362,23 +392,15 @@
 
 
 /*
- * Update filter setting sliders
- */
-void xs_update_filters(void)
-{
- gtk_adjustment_set_value(GTK_ADJUSTMENT(LUW("cfg_filt_fs_adj")), xs_cfg.filterFs);
- gtk_adjustment_set_value(GTK_ADJUSTMENT(LUW("cfg_filt_fm_adj")), xs_cfg.filterFm);
- gtk_adjustment_set_value(GTK_ADJUSTMENT(LUW("cfg_filt_ft_adj")), xs_cfg.filterFt);
-}
-
-
-/*
  * Reset filter settings to defaults
  */
 void xs_cfg_filter_reset(void)
 {
  xs_reset_filters();
- xs_update_filters();
+
+ gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fs"))), xs_cfg.filterFs);
+ gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_fm"))), xs_cfg.filterFm);
+ gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_emu_filt_ft"))), xs_cfg.filterFt);
 }
 
 
@@ -402,8 +424,7 @@
 {
  /* Selection was accepted! */
  gtk_entry_set_text(GTK_ENTRY(LUW("cfg_sld_dbpath")),
- 	gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sldb_fileselector))
- 	);
+ 	gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sldb_fileselector)));
 
  /* Close file selector window */
  gtk_widget_destroy(xs_sldb_fileselector);
@@ -438,7 +459,7 @@
 void xs_cfg_stil_fs_ok(void)
 {
  /* Selection was accepted! */
- gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_path")),
+ gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_dbpath")),
  	gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_stil_fileselector)));
 
  /* Close file selector window */
@@ -460,6 +481,9 @@
  */
 void xs_configure(void)
 {
+ gint i;
+ gfloat tmpValue;
+ 
  /* Check if the window already exists */
  if (xs_configwin != NULL)
 	{
@@ -494,96 +518,70 @@
  gtk_widget_set_sensitive(LUW("cfg_ftitle_override"), FALSE);
  xs_cfg.titleOverride = TRUE;
 #endif
- 	
- /* Sound resolution settings */
- switch (xs_cfg.fmtBitsPerSample) {
-	case XS_RES_16BIT:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_res_16bit")), TRUE);
-		break;
-	case XS_RES_8BIT:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_res_8bit")), TRUE);
-		break;
- }
-
- gtk_adjustment_set_value(GTK_ADJUSTMENT(LUW("cfg_samplerate_adj")), xs_cfg.fmtFrequency);
-
- /* Channel settings */
- switch (xs_cfg.fmtChannels) {
-	case XS_CHN_MONO:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_chn_mono")), TRUE);
-		break;
-	case XS_CHN_STEREO:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_chn_stereo")), TRUE);
-		break;
-	case XS_CHN_AUTOPAN:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_chn_autopan")), TRUE);
-		break;
- }
 
 
- /* Memorymode settings */
- switch (xs_cfg.memoryMode) {
-	case XS_MPU_REAL:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_real")), TRUE);
+ /* Set current data to widgets */
+ for (i = 0; i < xs_widtable_max; i++)
+ 	{
+	switch (xs_widtable[i].widType) {
+	case WTYPE_BGROUP:
+		/* Check if current value matches the given one */
+		gtk_toggle_button_set_active(
+			GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
+			(*((gint *) xs_widtable[i].valData) == xs_widtable[i].valSet)
+			);
 		break;
+	
+
+	case WTYPE_SPIN:
+	case WTYPE_SCALE:
+		/* Get the value */
+		switch (xs_widtable[i].valType) {
+		case CTYPE_INT:
+			tmpValue = (gfloat) *((gint *) xs_widtable[i].valData);
+			break;
 
-	case XS_MPU_BANK_SWITCHING:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_banksw")), TRUE);
+		case CTYPE_FLOAT:
+			tmpValue = *((gfloat *) xs_widtable[i].valData);
+			break;
+		}
+		
+		/* Set the value */
+		switch (xs_widtable[i].widType) {
+		case WTYPE_SPIN:
+			gtk_adjustment_set_value(
+			gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))),
+			tmpValue);
+			break;
+		
+		case WTYPE_SCALE:
+			gtk_adjustment_set_value(
+			gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName))),
+			tmpValue);
+			break;
+		}
 		break;
-
-	case XS_MPU_TRANSPARENT_ROM:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_transrom")), TRUE);
+	
+	case WTYPE_BUTTON:
+		/* Set toggle-button */
+		gtk_toggle_button_set_active(
+			GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
+			*((gboolean *) xs_widtable[i].valData)
+			);
 		break;
 
-	case XS_MPU_PLAYSID_ENVIRONMENT:
-		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mem_playsid")), TRUE);
+	case WTYPE_TEXT:
+		/* Set text to text-widget */
+		if (*(gchar **) xs_widtable[i].valData != NULL)
+			{
+			gtk_entry_set_text(
+				GTK_ENTRY(LUW(xs_widtable[i].widName)),
+				*(gchar **) xs_widtable[i].valData);
+			}
 		break;
- }
-
-
- /* Filter and waveform settings */
- if (xs_cfg.mos8580)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mos8580")), TRUE);
-	else
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_mos6581")), TRUE);
-
- if (xs_cfg.emulateFilters)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_emu_filters")), TRUE);
-
- xs_update_filters();
-
-
- /* Song-length database */
- if (xs_cfg.playMaxTimeEnable)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_sld_usemaxtime")), TRUE);
-
- gtk_adjustment_set_value(GTK_ADJUSTMENT(LUW("cfg_sld_maxtime_adj")), xs_cfg.playMaxTime);
-
- if (xs_cfg.songlenDBEnable)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_sld")), TRUE);
-
- if (xs_cfg.songlenDBPath != NULL)
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_sld_dbpath")), xs_cfg.songlenDBPath);
-
-
- /* STIL and miscellaneous settings */
- if (xs_cfg.stilDBEnable)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_stil_use")), TRUE);
-
- if (xs_cfg.stilDBPath != NULL)
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_path")), xs_cfg.stilDBPath);
-
- if (xs_cfg.detectMagic)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_detectmagic")), TRUE);
-
-
- /* Title-settings */
- if (xs_cfg.titleOverride)
-	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW("cfg_ftitle_override")), TRUE);
-
- if (xs_cfg.titleFormat != NULL)
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_ftitle_format")), xs_cfg.titleFormat);
-
+	}
+	}
+ 	
  gtk_widget_show(xs_configwin);
 }
 
--- a/src/xs_config.h	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xs_config.h	Sun Jun 22 11:01:03 2003 +0000
@@ -56,28 +56,29 @@
 	gfloat		filterFs;
 	gfloat		filterFm;
 	gfloat		filterFt;
-	gint		memoryMode;
+	gint		memoryMode;		/* See XS_MPU-constants */
 	gint		clockSpeed;		/* PAL (50Hz) or NTSC (60Hz) */
 	gboolean	forceSpeed;		/* TRUE = force to given clockspeed */
 
-	gboolean	oversampleEnable;	/* TRUE = oversample */
+	gboolean	oversampleEnable;
 	gint		oversampleFactor;	/* Factor of oversampling */
 
 
 	/* Playing settings */
-	gboolean	playMaxTimeEnable;	/* TRUE = use MAX playtime */
+	gboolean	playMaxTimeEnable;
 	gint		playMaxTime;		/* MAX playtime in seconds */
 	gboolean	songlenDBEnable;
-	gchar		*songlenDBPath;
+	gchar		*songlenDBPath;		/* Path to Songlengths.txt */
 
 
 	/* Miscellaneous settings */
 	gboolean	stilDBEnable;
-	gchar		*stilDBPath;
+	gchar		*stilDBPath;		/* Path to STIL.txt */
 
 	gboolean	detectMagic;
+	gboolean	alwaysRaise;
 
-	gboolean	titleOverride;
+	gboolean	titleOverride;		/* TRUE if XMMS titles are overriden */
 	gchar		*titleFormat;
 } xs_cfg;
 
@@ -86,20 +87,37 @@
  *	Configuration-file
  */
 enum {
-	ATYPE_INT = 1,
-	ATYPE_FLOAT,
-	ATYPE_STR,
-	ATYPE_BOOL
+	CTYPE_INT = 1,
+	CTYPE_FLOAT,
+	CTYPE_STR,
+	CTYPE_BOOL
+};
+
+enum {
+	WTYPE_BGROUP = 1,
+	WTYPE_SPIN,
+	WTYPE_SCALE,
+	WTYPE_BUTTON,
+	WTYPE_TEXT
 };
 
 
 typedef struct {
-	gint	atype;	/* Type of item (ATYPE_*) */
-	void	*adata;	/* Pointer to variable */
-	gchar	*aname;	/* Name of configuration item */
+	gint	valType;	/* Type of item (ATYPE_*) */
+	void	*valData;	/* Pointer to variable */
+	gchar	*valName;	/* Name of configuration item */
 } t_xs_cfg_item;
 
 
+typedef struct {
+	gint	widType;
+	gint	valType;
+	gchar	*widName;
+	void	*valData;
+	gint	valSet;
+} t_xs_wid_item;
+
+
 /*
  * Functions
  */
--- a/src/xs_length.c	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xs_length.c	Sun Jun 22 11:01:03 2003 +0000
@@ -199,11 +199,12 @@
 /*
  * Read database to memory
  */
-gint xs_db_read(gchar *dbFilename, t_xs_dbentry **dataBase)
+gint xs_db_read(gchar *dbFilename)
 {
  FILE *inFile;
  gchar inLine[XS_BUFSIZE];
- gint lineNum, linePos, iOK;
+ guint lineNum, linePos;
+ gboolean iOK;
  t_xs_dbentry *tmpNode;
  
  /* Try to open the file */
@@ -264,9 +265,9 @@
 		} else {
 		/* First playtime is after '=' */
 		linePos++;
-		iOK = 1;
+		iOK = TRUE;
 
-		while ((linePos < strlen(inLine)) && (iOK))
+		while ((linePos < strlen(inLine)) && iOK)
 			{
 			xs_findnext(inLine, &linePos);
 
@@ -276,7 +277,7 @@
 				xs_gettime(inLine, &linePos);
 				tmpNode->nLengths++;
 				} else
-				iOK = 0;
+				iOK = FALSE;
 			}
 
 		/* Add an entry to db in memory */
@@ -325,7 +326,7 @@
  if (xs_cfg.songlenDBPath == NULL)
  	return -10;
 
- if (xs_db_read(xs_cfg.songlenDBPath, &xs_database) < 0)
+ if (xs_db_read(xs_cfg.songlenDBPath) < 0)
  	return -9;
 
  /* Get size of db */
@@ -562,11 +563,8 @@
 		{
 		dbEntry = xs_db_get(dbHash);
 
-		if (dbEntry)
-			{
-			if ((subTune >= 0) && (subTune < dbEntry->nLengths))
-				iResult = dbEntry->sLengths[subTune - 1];
-  			}
+		if (dbEntry && (subTune >= 0) && (subTune < dbEntry->nLengths))
+			iResult = dbEntry->sLengths[subTune - 1];
   		}
 	}
 #if 0
--- a/src/xs_support.c	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xs_support.c	Sun Jun 22 11:01:03 2003 +0000
@@ -60,24 +60,15 @@
 }
 
 
-int xs_strpcat(gchar **ppcResult, gint *j, const gchar *pcStr)
+gint xs_strpcat(gchar *pcResult, gint *j, const gchar *pcStr)
 {
- int iLen;
-
- assert(ppcResult);
+ assert(pcResult);
  assert(pcStr);
  assert(j);
  
- /* Get length of the pcString to be catted */
- iLen = strlen(pcStr);
- (*j) += iLen;
-
- /* Re-allocate memory for destination */
- *ppcResult = (gchar *) g_realloc(*ppcResult, strlen(*ppcResult) + iLen + 1);
- if (*ppcResult == NULL) return -1;
-
  /* Cat to the destination */
- strcat(*ppcResult, pcStr);
+ strcpy((pcResult+(*j)), pcStr);
+ (*j) += strlen(pcStr);
 
  return 0;
 }
--- a/src/xs_support.h	Sun Jun 22 00:17:04 2003 +0000
+++ b/src/xs_support.h	Sun Jun 22 11:01:03 2003 +0000
@@ -12,7 +12,7 @@
  */
 gint	xs_strcalloc(gchar **, const gchar *);
 gint	xs_strcat(gchar **, const gchar *);
-gint	xs_strpcat(gchar **, gint *, const gchar *);
+gint	xs_strpcat(gchar *, gint *, const gchar *);
 gchar	*xs_strrchr(gchar *, gchar);
 inline 	void xs_findnext(gchar *, gint *);
 inline	void xs_findnum(gchar *, gint *);