alsa-utils/xamixer2/config.c

483 lines
14 KiB
C

/*****************************************************************************
config.c - parses the config file
Written by Raistlinn (lansdoct@cs.alfred.edu)
Copyright (C) 1998 by Christopher Lansdown
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
******************************************************************************/
/*****************************************************************************/
/* Begin #include's */
#include "main.h"
/* End #include's */
/*****************************************************************************/
/*****************************************************************************/
/* Begin #define's */
#define CHANNEL_SIZE 64
#define LABEL_SIZE 1024
/* End #define's */
/*****************************************************************************/
/*****************************************************************************/
/* Begin Global Variables */
extern Card *card; /* And array of the cards */
extern int cards; /* The number of cards in the system. */
Config config; /* The global config */
/* End Global Variables */
/*****************************************************************************/
int config_init()
{
/* Initialize the values to some reasonable defaults */
config.flags &= 0;
config.labels = NULL;
config.xpm = NULL;
config.icon = NULL;
config.mute = "M";
config.unmute = NULL;
config.simul = "|-|";
config.unsimul = NULL;
config.rec = "Rec";
config.unrec = NULL;
config.scale = 100;
config.x_pos = -1;
config.y_pos = -1;
config.padding = 5;
config.cdisplay = NULL;
return 1;
}
int config_read(const char *file)
{
char *home_dir, *home_env;
FILE *stream;
char line[1025], *chr;
int state = 0; /* 0 = general config; 1 = history */
unsigned int i = 0;
int linelen = 0;
char channel[CHANNEL_SIZE]; /* The name of the channel */
char label[LABEL_SIZE]; /* The label or xpm name */
int linenum = 0;
stream = fopen(file, "r");
/* If there is no initialized value */
if(stream == NULL)
return TRUE;
while(fgets(line, 1024, stream)){
linenum++;
/* Get wrid of comments */
if(is_comment(line))
continue;
strip_comment(line);
/* Convert the line to upper case so that matches aren't case
sensitive (if not in history)*/
linelen = strlen(line);
if(strstr(line, "Position")) {
if(sscanf(line, "Position %i %i", &config.x_pos, &config.y_pos) < 2)
config.x_pos = config.y_pos = -1;
}
else if(strstr(line, "ShowCardName"))
config.flags |= CONFIG_SHOW_CARD_NAME;
else if(strstr(line, "ShowMixerNumber"))
config.flags |= CONFIG_SHOW_MIXER_NUMBER;
else if(strstr(line, "ShowMixerName"))
config.flags |= CONFIG_SHOW_MIXER_NAME;
else if(strstr(line, "IconXpm"))
if(sscanf(line, "IconXpm %s", label) < 1)
printf("Bad IconXpm entry at line %i.\n", linenum);
else {
config.icon = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.icon, label);
config.flags |= CONFIG_ICON_XPM;
}
else if(strstr(line, "IgnoreXpms"))
config.flags &= ~CONFIG_USE_XPMS;
else if(strstr(line, "UseXpms"))
config.flags |= CONFIG_USE_XPMS;
else if(strstr(line, "unMuteXpmLeft"))
if(sscanf(line, "unMuteXpmLeft %s", label) < 1)
printf("Bad unMuteXpmLeft entry at line %i.\n", linenum);
else {
config.unmute_l = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.unmute_l, label);
config.flags |= CONFIG_UNMUTE_XPM_L;
}
else if(strstr(line, "unMuteXpm"))
if(sscanf(line, "unMuteXpm %s", label) < 1)
printf("Bad unMuteXpm entry at line %i.\n", linenum);
else {
config.unmute = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.unmute, label);
config.flags |= CONFIG_UNMUTE_XPM;
}
else if(strstr(line, "unRecXpm"))
if(sscanf(line, "unRecXpm %s", label) < 1)
printf("Bad unRecXpm entry at line %i.\n", linenum);
else {
config.unrec = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.unrec, label);
config.flags |= CONFIG_UNREC_XPM;
}
else if(strstr(line, "unSimulXpm"))
if(sscanf(line, "unSimulXpm %s", label) < 1)
printf("Bad unSimulXpm entry at line %i.\n", linenum);
else {
config.unsimul = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.unsimul, label);
config.flags |= CONFIG_UNSIMUL_XPM;
}
else if(strstr(line, "MuteLabel"))
if(sscanf(line, "MuteLabel %s", label) < 1)
printf("Bad MuteLabel entry at line %i.\n", linenum);
else {
config.mute = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.mute, label);
config.flags &= ~CONFIG_MUTE_XPM;
}
else if(strstr(line, "SimulLabel"))
if(sscanf(line, "SimulLabel %s", label) < 1)
printf("Bad SimulLabel entry at line %i.\n", linenum);
else {
config.simul = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.simul, label);
config.flags &= ~CONFIG_SIMUL_XPM;
}
else if(strstr(line, "RecLabel"))
if(sscanf(line, "RecLabel %s", label) < 1)
printf("Bad RecLabel entry at line %i.\n", linenum);
else {
config.rec = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.rec, label);
config.flags &= ~CONFIG_REC_XPM;
}
else if(strstr(line, "MuteXpmLeft"))
if(sscanf(line, "MuteXpmLeft %s", label) < 1)
printf("Bad MuteXpmLeft entry at line %i.\n", linenum);
else {
config.mute_l = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.mute_l, label);
config.flags |= CONFIG_MUTE_XPM_L;
}
else if(strstr(line, "MuteXpm"))
if(sscanf(line, "MuteXpm %s", label) < 1)
printf("Bad MuteXpm entry at line %i.\n", linenum);
else {
config.mute = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.mute, label);
config.flags |= CONFIG_MUTE_XPM;
}
else if(strstr(line, "RecXpm"))
if(sscanf(line, "RecXpm %s", label) < 1)
printf("Bad RecXpm entry at line %i.\n", linenum);
else {
config.rec = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.rec, label);
config.flags |= CONFIG_REC_XPM;
}
else if(strstr(line, "SimulXpm"))
if(sscanf(line, "SimulXpm %s", label) < 1)
printf("Bad SimulXpm entry at line %i.\n", linenum);
else {
config.simul = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.simul, label);
config.flags |= CONFIG_SIMUL_XPM;
}
else if(strstr(line, "BackgroundXpm"))
if(sscanf(line, "BackgroundXpm %s", label) < 1)
printf("Bad BackgroundXpm entry at line %i.\n", linenum);
else {
config.background = calloc(strlen(label) + 1, sizeof(char));
strcpy(config.background, label);
config.flags |= CONFIG_BACKGROUND_XPM;
}
else if(strstr(line, "Label")){
if(get_label(line, "Label", channel, CHANNEL_SIZE,
label, LABEL_SIZE, '[', ']')){
config.labels = channel_label_append(config.labels, channel, label);
}
else
printf("Bad Label entry found on line %i.\n", linenum);
}
else if(strstr(line, "Xpm")){
if(get_label(line, "Xpm", channel, CHANNEL_SIZE,
label, LABEL_SIZE, '[', ']')){
config.xpm = channel_label_append(config.xpm, channel, label);
}
else
printf("Bad Xpm entry found on line %i.\n", linenum);
}
else if(strstr(line, "ScaleSize"))
if(sscanf(line, "ScaleSize %i", &i) == 1)
config.scale = i;
else
printf("Bad ScaleSize entry at line %i.\n", linenum);
if(strstr(line, "ChannelPadding"))
if(sscanf(line, "ChannelPadding %i", &i) == 1)
config.padding = i;
else
printf("Bad ChannelPadding entry at line %i.\n", linenum);
} /* End of config loop */
/* Close the file */
fclose(stream);
return TRUE;
}
int setup_pixmaps(GtkWidget *xpmparent)
{
GtkStyle *style;
int fd;
if(!(config.flags & CONFIG_USE_XPMS)) {
config.mute = "M";
config.simul = "|-|";
config.rec = "Rec";
return;
}
if(config.flags & CONFIG_ICON_XPM){
fd = open(config.icon, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.icon_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.icon_mask,
&style->bg[GTK_STATE_NORMAL],
config.icon);
}
else {
printf("Unable to open pixmap %s.\n", config.icon);
config.flags &= ~CONFIG_ICON_XPM;
config.icon_xpm = NULL;
free(config.icon);
config.icon = NULL;
}
}
if(config.flags & CONFIG_MUTE_XPM_L){
fd=open(config.mute_l, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.mute_xpm_l =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.mute_mask_l,
&style->bg[GTK_STATE_NORMAL],
config.mute_l);
}
else {
printf("Unable to open pixmap %s.\n", config.mute_l);
config.flags &= ~CONFIG_MUTE_XPM_L;
config.mute_xpm_l = NULL;
free(config.mute_l);
config.mute_l = NULL;
}
}
if(config.flags & CONFIG_MUTE_XPM){
fd=open(config.mute, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.mute_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.mute_mask,
&style->bg[GTK_STATE_NORMAL],
config.mute);
if(!(config.flags & CONFIG_MUTE_XPM_L)) {
config.mute_xpm_l = config.mute_xpm;
config.mute_mask_l = config.mute_mask;
config.flags |= CONFIG_MUTE_XPM_L;
}
}
else {
printf("Unable to open pixmap %s.\n", config.mute);
config.flags &= ~CONFIG_MUTE_XPM;
config.mute_xpm = NULL;
free(config.mute);
config.mute = "M";
}
}
if(config.flags & CONFIG_UNMUTE_XPM_L) {
fd=open(config.unmute_l, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.unmute_xpm_l =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.unmute_mask_l,
&style->bg[GTK_STATE_NORMAL],
config.unmute_l);
}
else {
printf("Unable to open pixmap %s.\n", config.unmute_l);
config.flags &= ~CONFIG_UNMUTE_XPM_L;
free(config.unmute_l);
config.unmute_l=NULL;
}
}
if(config.flags & CONFIG_UNMUTE_XPM) {
fd=open(config.unmute, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.unmute_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.unmute_mask,
&style->bg[GTK_STATE_NORMAL],
config.unmute);
if(!(config.flags & CONFIG_UNMUTE_XPM_L)) {
printf("Invoked!\n");
config.unmute_xpm_l = config.unmute_xpm;
config.unmute_mask_l = config.unmute_mask;
config.flags |= CONFIG_UNMUTE_XPM_L;
}
}
else {
printf("Unable to open pixmap %s.\n", config.unmute);
config.flags &= ~CONFIG_UNMUTE_XPM;
free(config.unmute);
config.unmute=NULL;
}
}
if(config.flags & CONFIG_REC_XPM) {
fd=open(config.rec, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.rec_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.rec_mask,
&style->bg[GTK_STATE_NORMAL],
config.rec);
}
else {
printf("Unable to open pixmap %s.\n", config.rec);
config.flags &= ~CONFIG_REC_XPM;
free(config.rec);
config.rec = "Rec";
}
}
if(config.flags & CONFIG_UNREC_XPM) {
fd=open(config.unrec, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.unrec_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.unrec_mask,
&style->bg[GTK_STATE_NORMAL],
config.unrec);
}
else {
printf("Unable to open pixmap %s.\n", config.unrec);
config.flags &= ~CONFIG_UNREC_XPM;
free(config.unrec);
config.unrec=NULL;
}
}
if(config.flags & CONFIG_SIMUL_XPM) {
fd = open(config.simul, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.simul_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.simul_mask,
&style->bg[GTK_STATE_NORMAL],
config.simul);
}
else {
printf("Unable to open pixmap %s.\n", config.simul);
config.flags &= ~CONFIG_SIMUL_XPM;
free(config.simul);
config.simul="|-|";
}
}
if(config.flags & CONFIG_UNSIMUL_XPM) {
fd = open(config.unsimul, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.unsimul_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.unsimul_mask,
&style->bg[GTK_STATE_NORMAL],
config.unsimul);
}
else {
printf("Unable to open pixmap %s.\n", config.unsimul);
config.flags &= ~CONFIG_UNSIMUL_XPM;
free(config.unsimul);
config.unsimul=NULL;
}
}
if(config.flags & CONFIG_BACKGROUND_XPM) {
fd = open(config.background, O_RDONLY);
if(fd != -1) {
close(fd);
style = gtk_widget_get_style(xpmparent);
config.background_xpm =
gdk_pixmap_create_from_xpm(xpmparent->window,
&config.background_mask,
&style->bg[GTK_STATE_NORMAL],
config.background);
}
else {
printf("Unable to open pixmap %s.\n", config.background);
config.flags &= ~CONFIG_BACKGROUND_XPM;
free(config.background);
config.background=NULL;
}
}
return TRUE;
}