diff --git a/include/components/renderer.hpp b/include/components/renderer.hpp index 8e0d971a..c4c14fab 100644 --- a/include/components/renderer.hpp +++ b/include/components/renderer.hpp @@ -30,9 +30,10 @@ struct alignment_block { class renderer : public signal_receiver { + signals::parser::change_font, signals::parser::change_alignment, signals::parser::reverse_colors, + signals::parser::offset_pixel, signals::parser::attribute_set, signals::parser::attribute_unset, + signals::parser::attribute_toggle, signals::parser::action_begin, signals::parser::action_end, + signals::parser::text> { public: using make_type = unique_ptr; static make_type make(const bar_settings& bar); @@ -73,6 +74,7 @@ class renderer bool on(const signals::parser::change_overline& evt); bool on(const signals::parser::change_font& evt); bool on(const signals::parser::change_alignment& evt); + bool on(const signals::parser::reverse_colors&); bool on(const signals::parser::offset_pixel& evt); bool on(const signals::parser::attribute_set& evt); bool on(const signals::parser::attribute_unset& evt); diff --git a/include/events/signal.hpp b/include/events/signal.hpp index 24351bd1..b9fc4250 100644 --- a/include/events/signal.hpp +++ b/include/events/signal.hpp @@ -144,6 +144,9 @@ namespace signals { struct change_alignment : public detail::value_signal { using base_type::base_type; }; + struct reverse_colors : public detail::base_signal { + using base_type::base_type; + }; struct offset_pixel : public detail::value_signal { using base_type::base_type; }; diff --git a/include/events/signal_fwd.hpp b/include/events/signal_fwd.hpp index f2b0fe84..a2ffb911 100644 --- a/include/events/signal_fwd.hpp +++ b/include/events/signal_fwd.hpp @@ -48,6 +48,7 @@ namespace signals { struct change_overline; struct change_font; struct change_alignment; + struct reverse_colors; struct offset_pixel; struct attribute_set; struct attribute_unset; diff --git a/src/components/parser.cpp b/src/components/parser.cpp index af68a645..83c50500 100644 --- a/src/components/parser.cpp +++ b/src/components/parser.cpp @@ -83,7 +83,7 @@ void parser::codeblock(string&& data, const bar_settings& bar) { switch (tag) { case 'B': { - m_sig.emit(change_background{parse_color(m_bg, value, 0UL)}); + m_sig.emit(change_background{parse_color(m_bg, value, bar.background)}); break; } @@ -110,8 +110,7 @@ void parser::codeblock(string&& data, const bar_settings& bar) { break; case 'R': - m_sig.emit(change_background{parse_color_string(value, bar.foreground)}); - m_sig.emit(change_foreground{parse_color_string(value, bar.background)}); + m_sig.emit(reverse_colors{}); break; case 'O': diff --git a/src/components/renderer.cpp b/src/components/renderer.cpp index 964e8826..039256a6 100644 --- a/src/components/renderer.cpp +++ b/src/components/renderer.cpp @@ -205,7 +205,7 @@ void renderer::begin(xcb_rectangle_t rect) { m_align = alignment::NONE; // Reset colors - m_bg = 0; + m_bg = m_bar.background; m_fg = m_bar.foreground; m_ul = m_bar.underline.color; m_ol = m_bar.overline.color; @@ -700,6 +700,14 @@ bool renderer::on(const signals::parser::change_alignment& evt) { return true; } +bool renderer::on(const signals::parser::reverse_colors&) { + m_log.trace_x("renderer: reverse_colors"); + m_fg = m_fg + m_bg; + m_bg = m_fg - m_bg; + m_fg = m_fg - m_bg; + return true; +} + bool renderer::on(const signals::parser::offset_pixel& evt) { m_log.trace_x("renderer: offset_pixel(%f)", evt.cast()); m_blocks[m_align].x += evt.cast();