summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/settings.cpp19
-rw-r--r--src/utility/type_conversions.cpp22
-rw-r--r--src/utility/type_conversions.h1
-rw-r--r--src/window.cpp75
4 files changed, 67 insertions, 50 deletions
diff --git a/src/settings.cpp b/src/settings.cpp
index 646c141b..4dd82ac8 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -58,8 +58,11 @@ std::pair<std::vector<Column>, std::string> generate_columns(const std::string &
while (!(width = getEnclosedString(format, '(', ')', &pos)).empty())
{
Column col;
- col.color = stringToColor(getEnclosedString(format, '[', ']', &pos));
- std::string tag_type = getEnclosedString(format, '{', '}', &pos);
+ auto scolor = getEnclosedString(format, '[', ']', &pos);
+ if (scolor.empty())
+ col.color = NC::Color::Default;
+ else
+ col.color = boost::lexical_cast<NC::Color>(scolor);
if (*width.rbegin() == 'f')
{
@@ -69,6 +72,7 @@ std::pair<std::vector<Column>, std::string> generate_columns(const std::string &
else
col.fixed = false;
+ auto tag_type = getEnclosedString(format, '{', '}', &pos);
// alternative name
size_t tag_type_colon_pos = tag_type.find(':');
if (tag_type_colon_pos != std::string::npos)
@@ -243,11 +247,14 @@ bool Configuration::read(const std::string &config_path)
return result;
}));
p.add("visualizer_color", option_parser::worker([this](std::string v) {
- boost::sregex_token_iterator i(v.begin(), v.end(), boost::regex("\\w+")), j;
- for (; i != j; ++i)
+ boost::sregex_token_iterator color(v.begin(), v.end(), boost::regex("\\w+")), end;
+ for (; color != end; ++color)
{
- auto color = stringToColor(*i);
- visualizer_colors.push_back(color);
+ try {
+ visualizer_colors.push_back(boost::lexical_cast<NC::Color>(*color));
+ } catch (boost::bad_lexical_cast &) {
+ throw std::runtime_error("invalid color: " + *color);
+ }
}
if (visualizer_colors.empty())
throw std::runtime_error("empty list");
diff --git a/src/utility/type_conversions.cpp b/src/utility/type_conversions.cpp
index 8e922bad..c20943f4 100644
--- a/src/utility/type_conversions.cpp
+++ b/src/utility/type_conversions.cpp
@@ -50,28 +50,6 @@ NC::Color charToColor(char c)
}
}
-NC::Color stringToColor(const std::string &color)
-{
- NC::Color result = NC::Color::Default;
- if (color == "black")
- result = NC::Color::Black;
- else if (color == "red")
- result = NC::Color::Red;
- else if (color == "green")
- result = NC::Color::Green;
- else if (color == "yellow")
- result = NC::Color::Yellow;
- else if (color == "blue")
- result = NC::Color::Blue;
- else if (color == "magenta")
- result = NC::Color::Magenta;
- else if (color == "cyan")
- result = NC::Color::Cyan;
- else if (color == "white")
- result = NC::Color::White;
- return result;
-}
-
NC::Border stringToBorder(const std::string &border)
{
NC::Border result = NC::Border::None;
diff --git a/src/utility/type_conversions.h b/src/utility/type_conversions.h
index 7f072a5a..bf1f4406 100644
--- a/src/utility/type_conversions.h
+++ b/src/utility/type_conversions.h
@@ -28,7 +28,6 @@
NC::Color charToColor(char c);
-NC::Color stringToColor(const std::string &color);
NC::Border stringToBorder(const std::string &border);
std::string tagTypeToString(mpd_tag_type tag);
diff --git a/src/window.cpp b/src/window.cpp
index 5ddfd741..20ceb6cb 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -18,6 +18,7 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
+#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
@@ -229,38 +230,70 @@ std::ostream &operator<<(std::ostream &os, const Color &c)
else if (c == Color::White)
os << "white";
else if (c.isEnd())
- os << "color_end";
+ os << "end";
else
- os << "color_" << c.foreground() << "_" << c.background();
+ os << c.foreground() << "_" << c.background();
return os;
}
std::istream &operator>>(std::istream &is, Color &c)
{
+ auto get_single_color = [](const std::string &s) {
+ std::cerr << "s: " << s << "\n";
+ short result = -1;
+ if (s == "black")
+ result = COLOR_BLACK;
+ else if (s == "red")
+ result = COLOR_RED;
+ else if (s == "green")
+ result = COLOR_GREEN;
+ else if (s == "yellow")
+ result = COLOR_YELLOW;
+ else if (s == "blue")
+ result = COLOR_BLUE;
+ else if (s == "magenta")
+ result = COLOR_MAGENTA;
+ else if (s == "cyan")
+ result = COLOR_CYAN;
+ else if (s == "white")
+ result = COLOR_WHITE;
+ else if (std::all_of(s.begin(), s.end(), isdigit))
+ {
+ result = atoi(s.c_str());
+ if (result < 1 || result > 256)
+ result = -1;
+ else
+ --result;
+ }
+ return result;
+ };
std::string sc;
is >> sc;
if (sc == "default")
- c = Color::Default;
- else if (sc == "black")
- c = Color::Black;
- else if (sc == "red")
- c = Color::Red;
- else if (sc == "green")
- c = Color::Green;
- else if (sc == "yellow")
- c = Color::Yellow;
- else if (sc == "blue")
- c = Color::Blue;
- else if (sc == "magenta")
- c = Color::Magenta;
- else if (sc == "cyan")
- c = Color::Cyan;
- else if (sc == "white")
- c = Color::White;
- else if (sc == "color_end")
+ c = Color::Default;
+ else if (sc == "end")
c = Color::End;
else
- is.setstate(std::ios::failbit);
+ {
+ short value = get_single_color(sc);
+ if (value != -1)
+ c = Color(value);
+ else
+ {
+ size_t underscore = sc.find('_');
+ if (underscore != std::string::npos)
+ {
+ short fg = get_single_color(sc.substr(0, underscore));
+ short bg = get_single_color(sc.substr(underscore+1));
+ if (fg != -1 && bg != -1)
+ c = Color(fg, bg);
+ else
+ is.setstate(std::ios::failbit);
+ }
+ else
+ is.setstate(std::ios::failbit);
+ }
+ }
return is;
}