X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fconf.c;h=814a13b774486e2e204ee1d8bc61aba2ea12f8c6;hb=3af5c3a185fc23b8fb9d528a9c0a14f70093ac70;hp=1aaa1666d2b1eae73d30e1c8eed4b1a6efd143cd;hpb=07feab327754303128e36a19c7a5943950c6df58;p=ncmpc.git diff --git a/src/conf.c b/src/conf.c index 1aaa166..814a13b 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1,5 +1,5 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2010 The Music Player Daemon Project + * (c) 2004-2017 The Music Player Daemon Project * Project homepage: http://musicpd.org * * This program is free software; you can redistribute it and/or modify @@ -24,14 +24,14 @@ #include "command.h" #include "colors.h" #include "screen_list.h" +#include "options.h" +#include #include #include #include #include -#include #include -#include #include #include @@ -47,6 +47,7 @@ #define CONF_COLOR "color" #define CONF_COLOR_DEFINITION "colordef" #define CONF_LIST_FORMAT "list-format" +#define CONF_SEARCH_FORMAT "search-format" #define CONF_STATUS_FORMAT "status-format" #define CONF_XTERM_TITLE_FORMAT "xterm-title-format" #define CONF_LIST_WRAP "wrap-around" @@ -80,6 +81,7 @@ #define CONF_LYRICS_SHOW_PLUGIN "lyrics-show-plugin" #define CONF_TEXT_EDITOR "text-editor" #define CONF_TEXT_EDITOR_ASK "text-editor-ask" +#define CONF_CHAT_PREFIX "chat-prefix" #define CONF_SECOND_COLUMN "second-column" static bool @@ -119,27 +121,24 @@ parse_key_value(char *str, char **end) } } -static int +static bool parse_key_definition(char *str) { - char buf[MAX_LINE_LENGTH]; - char *p; - size_t len = strlen(str), i; - int j,key; - int keys[MAX_COMMAND_KEYS]; - command_t cmd; - /* get the command name */ - i=0; - j=0; + const size_t len = strlen(str); + size_t i = 0; + int j = 0; + char buf[MAX_LINE_LENGTH]; memset(buf, 0, MAX_LINE_LENGTH); while (i < len && str[i] != '=' && !g_ascii_isspace(str[i])) buf[j++] = str[i++]; - if( (cmd=get_key_command_from_name(buf)) == CMD_NONE ) { + + command_t cmd = get_key_command_from_name(buf); + if(cmd == CMD_NONE) { /* the hotkey configuration contains an unknown command */ print_error(_("Unknown command"), buf); - return -1; + return false; } /* skip whitespace */ @@ -152,13 +151,15 @@ parse_key_definition(char *str) if (*buf == 0) { /* the hotkey configuration line is incomplete */ print_error(_("Incomplete hotkey configuration"), str); - return -1; + return false; } /* parse key values */ i = 0; - key = 0; - p = buf; + int key = 0; + char *p = buf; + + int keys[MAX_COMMAND_KEYS]; memset(keys, 0, sizeof(int)*MAX_COMMAND_KEYS); while (i < MAX_COMMAND_KEYS && *p != 0 && (key = parse_key_value(p, &p)) >= 0) { @@ -168,7 +169,7 @@ parse_key_definition(char *str) } if (key < 0) - return -1; + return false; return assign_keys(cmd, keys); } @@ -194,9 +195,7 @@ parse_timedisplay_type(const char *str) static char * separate_value(char *p) { - char *value; - - value = strchr(p, '='); + char *value = strchr(p, '='); if (value == NULL) { /* an equals sign '=' was expected while parsing a configuration file line */ @@ -213,9 +212,7 @@ separate_value(char *p) static int parse_color(char *str) { - char *value; - - value = separate_value(str); + char *value = separate_value(str); if (value == NULL) return -1; @@ -245,23 +242,21 @@ after_comma(char *p) static int parse_color_definition(char *str) { - char buf[MAX_LINE_LENGTH]; - char *value; - short color, rgb[3]; - - value = separate_value(str); + char *value = separate_value(str); if (value == NULL) return -1; /* get the command name */ - color = colors_str2color(str); + short color = colors_str2color(str); if (color < 0) { + char buf[MAX_LINE_LENGTH]; print_error(_("Bad color name"), buf); return -1; } /* parse r,g,b values */ + short rgb[3]; for (unsigned i = 0; i < 3; ++i) { char *next = after_comma(value), *endptr; if (*value == 0) { @@ -334,8 +329,7 @@ static int get_search_mode(char *value) { char * test; - int mode; - mode= strtol(value, &test, 10); + const int mode = strtol(value, &test, 10); if (*test == '\0') { if (0 <= mode && mode <= 4) @@ -375,11 +369,9 @@ static bool parse_line(char *line) { 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 */ + char name[MAX_LINE_LENGTH]; while (i < len && line[i] != '=' && !g_ascii_isspace(line[i])) name[j++] = line[i++]; @@ -390,13 +382,12 @@ parse_line(char *line) i++; /* get the value part */ + char value[MAX_LINE_LENGTH]; j = 0; while (i < len) value[j++] = line[i++]; value[j] = '\0'; - match_found = true; - /* key definition */ if (!strcasecmp(CONF_KEY_DEFINITION, name)) parse_key_definition(value); @@ -444,6 +435,10 @@ parse_line(char *line) else if (!strcasecmp(CONF_LIST_FORMAT, name)) { g_free(options.list_format); options.list_format = get_format(value); + /* search format string */ + } else if (!strcasecmp(CONF_SEARCH_FORMAT, name)) { + g_free(options.search_format); + options.search_format = get_format(value); /* status format string */ } else if (!strcasecmp(CONF_STATUS_FORMAT, name)) { g_free(options.status_format); @@ -506,11 +501,8 @@ parse_line(char *line) g_free(options.scroll_sep); options.scroll_sep = get_format(value); } else if (!strcasecmp(CONF_DISPLAY_TIME, name)) -#ifdef NCMPC_MINI + /* obsolete, ignore */ {} -#else - options.display_time = str2bool(value); -#endif else if (!strcasecmp(CONF_JUMP_PREFIX_ONLY, name)) #ifdef NCMPC_MINI {} @@ -543,6 +535,12 @@ parse_line(char *line) options.text_editor_ask = str2bool(value); #else {} +#endif + else if (!strcasecmp(name, CONF_CHAT_PREFIX)) +#ifdef ENABLE_CHAT_SCREEN + options.chat_prefix = get_format(value); +#else + {} #endif else if (!strcasecmp(CONF_SECOND_COLUMN, name)) #ifdef NCMPC_MINI @@ -550,30 +548,26 @@ parse_line(char *line) #else options.second_column = str2bool(value); #endif - else - match_found = false; - - if (!match_found) + else { print_error(_("Unknown configuration parameter"), name); + return false; + } - return match_found; + return true; } static int read_rc_file(char *filename) { - FILE *file; - char line[MAX_LINE_LENGTH]; + assert(filename != NULL); - if (filename == NULL) - return -1; - - file = fopen(filename, "r"); + FILE *file = fopen(filename, "r"); if (file == NULL) { - perror(filename); - return -1; - } + perror(filename); + return -1; + } + char line[MAX_LINE_LENGTH]; while (fgets(line, sizeof(line), file) != NULL) { char *p = g_strchug(line); @@ -585,20 +579,19 @@ read_rc_file(char *filename) return 0; } -int +bool check_user_conf_dir(void) { - int retval; char *directory = g_build_filename(g_get_home_dir(), "." PACKAGE, NULL); if (g_file_test(directory, G_FILE_TEST_IS_DIR)) { g_free(directory); - return 0; + return true; } - retval = g_mkdir(directory, 0755); + bool success = g_mkdir(directory, 0755) == 0; g_free(directory); - return retval; + return success; } char * @@ -620,7 +613,6 @@ build_system_conf_filename(void) for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != NULL; system_data_dirs++) { - g_message (*system_data_dirs); pathname = g_build_filename(*system_data_dirs, PACKAGE, "ncmpc.conf", NULL); if (g_file_test(pathname, G_FILE_TEST_EXISTS)) { @@ -648,66 +640,92 @@ build_user_key_binding_filename(void) #endif } -void -read_configuration(void) +static char * +g_build_system_key_binding_filename(void) { - char *filename = NULL; +#ifdef WIN32 + const gchar* const *system_data_dirs; + gchar *pathname = NULL; + + for (system_data_dirs = g_get_system_config_dirs (); *system_data_dirs != NULL; system_data_dirs++) + { + pathname = g_build_filename(*system_data_dirs, PACKAGE, "keys.conf", NULL); + if (g_file_test(pathname, G_FILE_TEST_EXISTS)) + { + break; + } + else + { + g_free (pathname); + pathname = NULL; + } + } + return pathname; +#else + return g_build_filename(SYSCONFDIR, PACKAGE, "keys", NULL); +#endif +} +static char * +find_config_file(void) +{ /* check for command line configuration file */ - if (options.config_file) - filename = g_strdup(options.config_file); + if (options.config_file != NULL) + return g_strdup(options.config_file); /* check for user configuration ~/.ncmpc/config */ - if (filename == NULL) { - filename = build_user_conf_filename(); - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - g_free(filename); - filename = NULL; - } - } + char *filename = build_user_conf_filename(); + if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + return filename; + + g_free(filename); /* check for global configuration SYSCONFDIR/ncmpc/config */ - if (filename == NULL) { - filename = build_system_conf_filename(); - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - g_free(filename); - filename = NULL; - } - } + filename = build_system_conf_filename(); + if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + return filename; - /* load configuration */ - if (filename) { - read_rc_file(filename); - g_free(filename); - filename = NULL; - } + g_free(filename); + return NULL; +} +static char * +find_keys_file(void) +{ /* check for command line key binding file */ - if (options.key_file) - filename = g_strdup(options.key_file); + if (options.key_file != NULL) + return g_strdup(options.key_file); /* check for user key bindings ~/.ncmpc/keys */ - if (filename == NULL) { - filename = build_user_key_binding_filename(); - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - g_free(filename); - filename = NULL; - } - } + char *filename = build_user_key_binding_filename(); + if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + return filename; + + g_free(filename); /* check for global key bindings SYSCONFDIR/ncmpc/keys */ - if (filename == NULL) { - filename = g_build_filename(SYSCONFDIR, PACKAGE, "keys", NULL); - if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR)) { - g_free(filename); - filename = NULL; - } + filename = g_build_system_key_binding_filename(); + if (g_file_test(filename, G_FILE_TEST_IS_REGULAR)) + return filename; + + g_free(filename); + return NULL; +} + +void +read_configuration(void) +{ + /* load configuration */ + char *filename = find_config_file(); + if (filename != NULL) { + read_rc_file(filename); + g_free(filename); } /* load key bindings */ - if (filename) { + filename = find_keys_file(); + if (filename != NULL) { read_rc_file(filename); g_free(filename); - filename = NULL; } }