X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fconf.c;h=7fa2863c56776ff1abd17d23485629e121304c15;hb=df92291f7ae1d035d1fb931161ec1b577656e0de;hp=bc66967b1092cb9cb6722794850fc42c7f4e95ee;hpb=d7a166e749de8f9649321ffe227a71156f9bc656;p=ncmpc.git diff --git a/src/conf.c b/src/conf.c index bc66967..7fa2863 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1,20 +1,21 @@ -/* - * (c) 2004 by Kalle Wallin - * +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2010 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * 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 - * - */ + + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ #include "conf.h" #include "config.h" @@ -40,9 +41,9 @@ /* configuration field names */ #define CONF_ENABLE_COLORS "enable-colors" +#define CONF_SCROLL_OFFSET "scroll-offset" #define CONF_AUTO_CENTER "auto-center" #define CONF_WIDE_CURSOR "wide-cursor" -#define CONF_ENABLE_BELL "enable-bell" #define CONF_KEY_DEFINITION "key" #define CONF_COLOR "color" #define CONF_COLOR_DEFINITION "colordef" @@ -54,6 +55,8 @@ #define CONF_FIND_SHOW_LAST "find-show-last" #define CONF_AUDIBLE_BELL "audible-bell" #define CONF_VISIBLE_BELL "visible-bell" +#define CONF_BELL_ON_WRAP "bell-on-wrap" +#define CONF_STATUS_MESSAGE_TIME "status-message-time" #define CONF_XTERM_TITLE "set-xterm-title" #define CONF_ENABLE_MOUSE "enable-mouse" #define CONF_CROSSFADE_TIME "crossfade-time" @@ -66,19 +69,15 @@ #define CONF_PORT "port" #define CONF_PASSWORD "password" #define CONF_LYRICS_TIMEOUT "lyrics-timeout" -#define CONF_SHOW_SPLASH "show-splash" #define CONF_SCROLL "scroll" #define CONF_SCROLL_SEP "scroll-sep" #define CONF_VISIBLE_BITRATE "visible-bitrate" #define CONF_WELCOME_SCREEN_LIST "welcome-screen-list" - -typedef enum { - KEY_PARSER_UNKNOWN, - KEY_PARSER_CHAR, - KEY_PARSER_DEC, - KEY_PARSER_HEX, - KEY_PARSER_DONE -} key_parser_state_t; +#define CONF_DISPLAY_TIME "display-time" +#define CONF_JUMP_PREFIX_ONLY "jump-prefix-only" +#define CONF_LYRICS_AUTOSAVE "lyrics-autosave" +#define CONF_LYRICS_SHOW_PLUGIN "lyrics-show-plugin" +#define CONF_SECOND_COLUMN "second-column" static bool str2bool(char *str) @@ -96,77 +95,32 @@ print_error(const char *msg, const char *input) } static int -parse_key_value(char *str, size_t len, char **end) +parse_key_value(char *str, char **end) { - size_t i; - int value; - key_parser_state_t state; - - i=0; - value=0; - state=KEY_PARSER_UNKNOWN; - *end = str; - - while (i < len && state != KEY_PARSER_DONE) { - int next = 0; - int c = str[i]; - - if( i+1 str+len ) - *end = str+len; + *end = str + 3; + return str[1]; + } else { + long value = strtol(str, end, 0); + if (*end == str) { + print_error(_("Malformed hotkey definition"), str); + return -1; + } - return value; + return (int)value; + } } static int parse_key_definition(char *str) { char buf[MAX_LINE_LENGTH]; - char *p, *end; + char *p; size_t len = strlen(str), i; int j,key; int keys[MAX_COMMAND_KEYS]; @@ -179,7 +133,9 @@ parse_key_definition(char *str) while (i < len && str[i] != '=' && !g_ascii_isspace(str[i])) buf[j++] = str[i++]; if( (cmd=get_key_command_from_name(buf)) == CMD_NONE ) { - print_error(_("Unknown key command"), buf); + /* the hotkey configuration contains an unknown + command */ + print_error(_("Unknown command"), buf); return -1; } @@ -190,43 +146,44 @@ parse_key_definition(char *str) /* get the value part */ memset(buf, 0, MAX_LINE_LENGTH); g_strlcpy(buf, str+i, MAX_LINE_LENGTH); - len = strlen(buf); - if (len == 0) { - print_error(_("Incomplete key definition"), str); + if (*buf == 0) { + /* the hotkey configuration line is incomplete */ + print_error(_("Incomplete hotkey configuration"), str); return -1; } /* parse key values */ i = 0; key = 0; - len = strlen(buf); p = buf; - end = buf+len; memset(keys, 0, sizeof(int)*MAX_COMMAND_KEYS); - while (i < MAX_COMMAND_KEYS && p < end && - (key = parse_key_value(p, len + 1, &p)) >= 0) { + while (i < MAX_COMMAND_KEYS && *p != 0 && + (key = parse_key_value(p, &p)) >= 0) { keys[i++] = key; - while (p < end && (*p==',' || *p==' ' || *p=='\t')) + while (*p==',' || *p==' ' || *p=='\t') p++; - len = strlen(p); } - if (key < 0) { - print_error(_("Bad key definition"), str); + if (key < 0) return -1; - } return assign_keys(cmd, keys); } -static const char * +static bool parse_timedisplay_type(const char *str) { - if (!strcmp(str,"elapsed") || !strcmp(str,"remaining")) - return str; + if (strcmp(str, "elapsed") == 0) + return false; + else if (strcmp(str, "remaining") == 0) + return true; else { + /* translators: ncmpc supports displaying the + "elapsed" or "remaining" time of a song being + played; in this case, the configuration file + contained an invalid setting */ print_error(_("Bad time display type"), str); - return DEFAULT_TIMEDISPLAY_TYPE; + return false; } } @@ -238,6 +195,8 @@ separate_value(char *p) value = strchr(p, '='); if (value == NULL) { + /* an equals sign '=' was expected while parsing a + configuration file line */ fprintf(stderr, "%s\n", _("Missing '='")); return NULL; } @@ -294,7 +253,7 @@ parse_color_definition(char *str) /* get the command name */ color = colors_str2color(str); if (color < 0) { - print_error(_("Bad color"), buf); + print_error(_("Bad color name"), buf); return -1; } @@ -317,7 +276,7 @@ parse_color_definition(char *str) } if (*value != 0) { - print_error(_("Bad color definition"), str); + print_error(_("Malformed color definition"), str); return -1; } @@ -343,19 +302,21 @@ check_screen_list(char *value) { char **tmp = g_strsplit_set(value, " \t,", 100); char **screen = NULL; - int i,j; + int i = 0, j = 0; - i=0; - j=0; while( tmp && tmp[i] ) { char *name = g_ascii_strdown(tmp[i], -1); - if (screen_lookup_name(name) == NULL) { - print_error(_("Unsupported screen"), name); - free(name); - } else { - screen = g_realloc(screen, (j+2)*sizeof(char *)); - screen[j++] = name; - screen[j] = NULL; + if (*name != '\0') { + if (screen_lookup_name(name) == NULL) { + /* an unknown screen name was specified in the + configuration file */ + print_error(_("Unknown screen name"), name); + free(name); + } else { + screen = g_realloc(screen, (j+2)*sizeof(char *)); + screen[j++] = name; + screen[j] = NULL; + } } i++; } @@ -366,20 +327,58 @@ check_screen_list(char *value) return screen; } +static int +get_search_mode(char *value) +{ + char * test; + int mode; + mode= strtol(value, &test, 10); + if (*test == '\0') + { + if (0 <= mode && mode <= 4) + return mode; + else + { + print_error(_("Invalid search mode"),value); + return 0; + } + } + else + { + for (int i = 0; value[i] != '\0'; i++) + value[i] = tolower(value[i]); + + // TODO: modify screen_search so that its own list of modes can be used + // for comparison instead of specifying them here + if (strcmp(value, "title") == 0) + return 0; + else if (strcmp(value, "artist") == 0) + return 1; + else if (strcmp(value, "album") == 0) + return 2; + else if (strcmp(value, "filename") == 0) + return 3; + else if (strcmp(value, "artist+album") == 0) + return 4; + else + { + print_error(_("Unknown search mode"),value); + return 0; + } + } +} + static bool parse_line(char *line) { - size_t len = strlen(line), i = 0, j; + size_t len = strlen(line), i = 0, j = 0; char name[MAX_LINE_LENGTH]; char value[MAX_LINE_LENGTH]; bool match_found; /* get the name part */ - j = 0; - while (i < len && line[i] != '=' && - !g_ascii_isspace(line[i])) { + while (i < len && line[i] != '=' && !g_ascii_isspace(line[i])) name[j++] = line[i++]; - } name[j] = '\0'; @@ -405,6 +404,8 @@ parse_line(char *line) #else {} #endif + else if (!strcasecmp(CONF_SCROLL_OFFSET, name)) + options.scroll_offset = atoi(value); /* auto center */ else if (!strcasecmp(CONF_AUTO_CENTER, name)) options.auto_center = str2bool(value); @@ -418,6 +419,8 @@ parse_line(char *line) /* wide cursor */ else if (!strcasecmp(CONF_WIDE_CURSOR, name)) options.wide_cursor = str2bool(value); + else if (strcasecmp(name, "hardware-cursor") == 0) + options.hardware_cursor = str2bool(value); /* welcome screen list */ else if (!strcasecmp(CONF_WELCOME_SCREEN_LIST, name)) options.welcome_screen_list = str2bool(value); @@ -425,11 +428,10 @@ parse_line(char *line) else if (!strcasecmp(CONF_VISIBLE_BITRATE, name)) options.visible_bitrate = str2bool(value); /* timer display type */ - else if (!strcasecmp(CONF_TIMEDISPLAY_TYPE, name)) { - g_free(options.timedisplay_type); - options.timedisplay_type=g_strdup(parse_timedisplay_type(value)); + else if (!strcasecmp(CONF_TIMEDISPLAY_TYPE, name)) + options.display_remaining_time = parse_timedisplay_type(value); /* color definition */ - } else if (!strcasecmp(CONF_COLOR_DEFINITION, name)) + else if (!strcasecmp(CONF_COLOR_DEFINITION, name)) #ifdef ENABLE_COLORS parse_color_definition(value); #else @@ -457,6 +459,10 @@ parse_line(char *line) options.audible_bell = str2bool(value); else if (!strcasecmp(CONF_VISIBLE_BELL, name)) options.visible_bell = str2bool(value); + else if (!strcasecmp(CONF_BELL_ON_WRAP, name)) + options.bell_on_wrap = str2bool(value); + else if (!strcasecmp(CONF_STATUS_MESSAGE_TIME, name)) + options.status_message_time = atoi(value); else if (!strcasecmp(CONF_XTERM_TITLE, name)) options.enable_xterm_title = str2bool(value); else if (!strcasecmp(CONF_ENABLE_MOUSE, name)) @@ -468,7 +474,7 @@ parse_line(char *line) else if (!strcasecmp(CONF_CROSSFADE_TIME, name)) options.crossfade_time = atoi(value); else if (!strcasecmp(CONF_SEARCH_MODE, name)) - options.search_mode = atoi(value); + options.search_mode = get_search_mode(value); else if (!strcasecmp(CONF_HIDE_CURSOR, name)) options.hide_cursor = atoi(value); else if (!strcasecmp(CONF_SEEK_TIME, name)) @@ -476,8 +482,6 @@ parse_line(char *line) else if (!strcasecmp(CONF_SCREEN_LIST, name)) { g_strfreev(options.screen_list); options.screen_list = check_screen_list(value); - } else if (!strcasecmp(CONF_SHOW_SPLASH, name)) { - /* the splash screen was removed */ } else if (!strcasecmp(CONF_HOST, name)) options.host = get_format(value); else if (!strcasecmp(CONF_PORT, name)) @@ -495,12 +499,41 @@ parse_line(char *line) else if (!strcasecmp(CONF_SCROLL_SEP, name)) { g_free(options.scroll_sep); options.scroll_sep = get_format(value); - } else + } else if (!strcasecmp(CONF_DISPLAY_TIME, name)) +#ifdef NCMPC_MINI + {} +#else + options.display_time = str2bool(value); +#endif + else if (!strcasecmp(CONF_JUMP_PREFIX_ONLY, name)) +#ifdef NCMPC_MINI + {} +#else + options.jump_prefix_only = str2bool(value); +#endif + else if (!strcasecmp(CONF_LYRICS_AUTOSAVE, name)) +#ifdef ENABLE_LYRICS_SCREEN + options.lyrics_autosave = str2bool(value); +#else + {} +#endif + else if (!strcasecmp(CONF_LYRICS_SHOW_PLUGIN, name)) +#ifdef ENABLE_LYRICS_SCREEN + options.lyrics_show_plugin = str2bool(value); +#else + {} +#endif + else if (!strcasecmp(CONF_SECOND_COLUMN, name)) +#ifdef NCMPC_MINI + {} +#else + options.second_column = str2bool(value); +#endif + else match_found = false; if (!match_found) - print_error(_("Unknown configuration parameter"), - name); + print_error(_("Unknown configuration parameter"), name); return match_found; } @@ -542,7 +575,11 @@ check_user_conf_dir(void) return 0; } +#ifndef WIN32 retval = mkdir(directory, 0755); +#else + retval = mkdir(directory); +#endif g_free(directory); return retval; }