diff --git a/src/colors.c b/src/colors.c
index 2635329ec00ca40c6abc81dec7f34ea98993b2a9..06362623bf9fa43bc391aae339fef4851993e25c 100644 (file)
--- a/src/colors.c
+++ b/src/colors.c
/* ncmpc (Ncurses MPD Client)
- * (c) 2004-2009 The Music Player Daemon Project
+ * (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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-*/
+ */
#include "colors.h"
#include "i18n.h"
+#include "ncfix.h"
+
#ifdef ENABLE_COLORS
#include "options.h"
#endif
#include <string.h>
#include <glib.h>
-#define COLOR_NONE -1
+#define COLOR_NONE G_MININT /* left most bit only */
#define COLOR_ERROR -2
#ifdef ENABLE_COLORS
static int
colors_update_pair(enum color id)
{
- short fg, bg;
+ int fg, bg;
assert(id > 0 && id < COLOR_END);
fg = colors[id].color;
bg = colors[COLOR_BACKGROUND].color;
- /* COLOR_NONE is negative, which
- * results in a default colors */
- init_pair(id, fg, bg);
+ /* If color == COLOR_NONE (negative),
+ * pass -1 to avoid cast errors */
+ init_pair(id,
+ (fg < 0 ? -1 : fg),
+ (bg < 0 ? -1 : bg));
return 0;
}
int
colors_str2color(const char *str)
{
- int color;
- char *endptr;
-
- if (!strcasecmp(str, "black"))
- return COLOR_BLACK;
- else if (!strcasecmp(str, "red"))
- return COLOR_RED;
- else if (!strcasecmp(str, "green"))
- return COLOR_GREEN;
- else if (!strcasecmp(str, "yellow"))
- return COLOR_YELLOW;
- else if (!strcasecmp(str, "blue"))
- return COLOR_BLUE;
- else if (!strcasecmp(str, "magenta"))
- return COLOR_MAGENTA;
- else if (!strcasecmp(str, "cyan"))
- return COLOR_CYAN;
- else if (!strcasecmp(str, "white"))
- return COLOR_WHITE;
- else if (!strcasecmp(str, "brightred"))
- return COLOR_RED | A_BOLD;
- else if (!strcasecmp(str, "brightgreen"))
- return COLOR_GREEN | A_BOLD;
- else if (!strcasecmp(str, "brightyellow"))
- return COLOR_YELLOW | A_BOLD;
- else if (!strcasecmp(str, "brightblue"))
- return COLOR_BLUE | A_BOLD;
- else if (!strcasecmp(str, "brightmagenta"))
- return COLOR_MAGENTA | A_BOLD;
- else if (!strcasecmp(str, "brightcyan"))
- return COLOR_CYAN | A_BOLD;
- else if (!strcasecmp(str, "brightwhite"))
- return COLOR_WHITE | A_BOLD;
- else if (!strcasecmp(str, "grey") || !strcasecmp(str, "gray"))
- return COLOR_BLACK | A_BOLD;
- else if (!strcasecmp(str, "none"))
- return COLOR_NONE;
-
- color = strtol(str, &endptr, 10);
- if (str != endptr && endptr[0] == '\0')
- return color;
+ int i, color = 0;
+ char **parts = g_strsplit(str, ",", 0);
+ for (i = 0; parts[i]; i++) {
+ char *cur = parts[i];
+
+ /* Legacy colors (brightblue,etc) */
+ if (!strncasecmp(cur, "bright", 6)) {
+ color |= A_BOLD;
+ cur += 6;
+ }
- fprintf(stderr,_("Warning: Unknown color - %s\n"), str);
- return -2;
+ /* Colors */
+ if (!strcasecmp(cur, "none"))
+ color |= COLOR_NONE;
+ else if (!strcasecmp(cur, "black"))
+ color |= COLOR_BLACK;
+ else if (!strcasecmp(cur, "red"))
+ color |= COLOR_RED;
+ else if (!strcasecmp(cur, "green"))
+ color |= COLOR_GREEN;
+ else if (!strcasecmp(cur, "yellow"))
+ color |= COLOR_YELLOW;
+ else if (!strcasecmp(cur, "blue"))
+ color |= COLOR_BLUE;
+ else if (!strcasecmp(cur, "magenta"))
+ color |= COLOR_MAGENTA;
+ else if (!strcasecmp(cur, "cyan"))
+ color |= COLOR_CYAN;
+ else if (!strcasecmp(cur, "white"))
+ color |= COLOR_WHITE;
+ else if (!strcasecmp(cur, "grey") || !strcasecmp(cur, "gray"))
+ color |= COLOR_BLACK | A_BOLD;
+
+ /* Attributes */
+ else if (!strcasecmp(cur, "standout"))
+ color |= A_STANDOUT;
+ else if (!strcasecmp(cur, "underline"))
+ color |= A_UNDERLINE;
+ else if (!strcasecmp(cur, "reverse"))
+ color |= A_REVERSE;
+ else if (!strcasecmp(cur, "blink"))
+ color |= A_BLINK;
+ else if (!strcasecmp(cur, "dim"))
+ color |= A_DIM;
+ else if (!strcasecmp(cur, "bold"))
+ color |= A_BOLD;
+ else {
+ /* Numerical colors */
+ char *endptr;
+ int tmp = strtol(cur, &endptr, 10);
+ if (cur != endptr && endptr[0] == '\0') {
+ color |= tmp;
+ } else {
+ fprintf(stderr,_("Warning: Unknown color - %s\n"), str);
+ return COLOR_ERROR;
+ }
+ }
+
+ }
+ g_strfreev(parts);
+ return color;
}
/* This function is called from conf.c before curses have been started,
assert(id > 0 && id < COLOR_END);
- wattr_get(w, &attrs, &pair, NULL);
+ fix_wattr_get(w, &attrs, &pair, NULL);
#ifdef ENABLE_COLORS
if (options.enable_colors) {
/* color mode */
- if ((int)attrs != entry->mono || (short)id != pair)
- wattr_set(w, entry->mono, id, NULL);
+ if ((int)attrs != entry->color || (short)id != pair)
+ wattr_set(w, entry->color, id, NULL);
} else {
#endif
/* mono mode */