From 1445b95af8ac5054fabad8c4ae01af91d5dce3d5 Mon Sep 17 00:00:00 2001
From: Michael Carlberg <c@rlberg.se>
Date: Sat, 15 Oct 2016 19:42:57 +0200
Subject: [PATCH] refactor: Moved global signals to separate namespace

---
 include/components/bar.hpp        | 57 +++++++++----------
 include/components/controller.hpp | 11 ++--
 include/components/parser.hpp     | 91 +++++++++++++------------------
 include/components/signals.hpp    | 44 +++++++++++++++
 include/components/x11/tray.hpp   | 10 +---
 5 files changed, 118 insertions(+), 95 deletions(-)
 create mode 100644 include/components/signals.hpp

diff --git a/include/components/bar.hpp b/include/components/bar.hpp
index 924b4d7c..1b46329c 100644
--- a/include/components/bar.hpp
+++ b/include/components/bar.hpp
@@ -7,6 +7,7 @@
 #include "components/config.hpp"
 #include "components/logger.hpp"
 #include "components/parser.hpp"
+#include "components/signals.hpp"
 #include "components/types.hpp"
 #include "components/x11/connection.hpp"
 #include "components/x11/draw.hpp"
@@ -27,10 +28,6 @@
 
 LEMONBUDDY_NS
 
-namespace bar_signals {
-  delegate::Signal1<string> action_click;
-};
-
 class bar : public xpp::event::sink<evt::button_press, evt::expose> {
  public:
   /**
@@ -48,19 +45,19 @@ class bar : public xpp::event::sink<evt::button_press, evt::expose> {
    */
   ~bar() {
     std::lock_guard<threading_util::spin_lock> lck(m_lock);
-    parser_signals::alignment_change.disconnect(this, &bar::on_alignment_change);
-    parser_signals::attribute_set.disconnect(this, &bar::on_attribute_set);
-    parser_signals::attribute_unset.disconnect(this, &bar::on_attribute_unset);
-    parser_signals::attribute_toggle.disconnect(this, &bar::on_attribute_toggle);
-    parser_signals::action_block_open.disconnect(this, &bar::on_action_block_open);
-    parser_signals::action_block_close.disconnect(this, &bar::on_action_block_close);
-    parser_signals::color_change.disconnect(this, &bar::on_color_change);
-    parser_signals::font_change.disconnect(this, &bar::on_font_change);
-    parser_signals::pixel_offset.disconnect(this, &bar::on_pixel_offset);
-    parser_signals::ascii_text_write.disconnect(this, &bar::draw_character);
-    parser_signals::unicode_text_write.disconnect(this, &bar::draw_character);
+    g_signals::parser::alignment_change.disconnect(this, &bar::on_alignment_change);
+    g_signals::parser::attribute_set.disconnect(this, &bar::on_attribute_set);
+    g_signals::parser::attribute_unset.disconnect(this, &bar::on_attribute_unset);
+    g_signals::parser::attribute_toggle.disconnect(this, &bar::on_attribute_toggle);
+    g_signals::parser::action_block_open.disconnect(this, &bar::on_action_block_open);
+    g_signals::parser::action_block_close.disconnect(this, &bar::on_action_block_close);
+    g_signals::parser::color_change.disconnect(this, &bar::on_color_change);
+    g_signals::parser::font_change.disconnect(this, &bar::on_font_change);
+    g_signals::parser::pixel_offset.disconnect(this, &bar::on_pixel_offset);
+    g_signals::parser::ascii_text_write.disconnect(this, &bar::draw_character);
+    g_signals::parser::unicode_text_write.disconnect(this, &bar::draw_character);
     if (m_tray.align != alignment::NONE)
-      tray_signals::report_slotcount.disconnect(this, &bar::on_tray_report);
+      g_signals::tray::report_slotcount.disconnect(this, &bar::on_tray_report);
     if (m_sinkattached)
       m_connection.detach_sink(this, 1);
     m_window.destroy();
@@ -470,20 +467,20 @@ class bar : public xpp::event::sink<evt::button_press, evt::expose> {
     // }}}
     // Connect signal handlers {{{
 
-    parser_signals::alignment_change.connect(this, &bar::on_alignment_change);
-    parser_signals::attribute_set.connect(this, &bar::on_attribute_set);
-    parser_signals::attribute_unset.connect(this, &bar::on_attribute_unset);
-    parser_signals::attribute_toggle.connect(this, &bar::on_attribute_toggle);
-    parser_signals::action_block_open.connect(this, &bar::on_action_block_open);
-    parser_signals::action_block_close.connect(this, &bar::on_action_block_close);
-    parser_signals::color_change.connect(this, &bar::on_color_change);
-    parser_signals::font_change.connect(this, &bar::on_font_change);
-    parser_signals::pixel_offset.connect(this, &bar::on_pixel_offset);
-    parser_signals::ascii_text_write.connect(this, &bar::draw_character);
-    parser_signals::unicode_text_write.connect(this, &bar::draw_character);
+    g_signals::parser::alignment_change.connect(this, &bar::on_alignment_change);
+    g_signals::parser::attribute_set.connect(this, &bar::on_attribute_set);
+    g_signals::parser::attribute_unset.connect(this, &bar::on_attribute_unset);
+    g_signals::parser::attribute_toggle.connect(this, &bar::on_attribute_toggle);
+    g_signals::parser::action_block_open.connect(this, &bar::on_action_block_open);
+    g_signals::parser::action_block_close.connect(this, &bar::on_action_block_close);
+    g_signals::parser::color_change.connect(this, &bar::on_color_change);
+    g_signals::parser::font_change.connect(this, &bar::on_font_change);
+    g_signals::parser::pixel_offset.connect(this, &bar::on_pixel_offset);
+    g_signals::parser::ascii_text_write.connect(this, &bar::draw_character);
+    g_signals::parser::unicode_text_write.connect(this, &bar::draw_character);
 
     if (m_tray.align != alignment::NONE)
-      tray_signals::report_slotcount.connect(this, &bar::on_tray_report);
+      g_signals::tray::report_slotcount.connect(this, &bar::on_tray_report);
 
     // }}}
 
@@ -652,8 +649,8 @@ class bar : public xpp::event::sink<evt::button_press, evt::expose> {
         m_log.trace("action.start_x = %i", action.start_x);
         m_log.trace("action.end_x = %i", action.end_x);
 
-        if (!bar_signals::action_click.empty())
-          bar_signals::action_click.emit(action.command);
+        if (!g_signals::bar::action_click.empty())
+          g_signals::bar::action_click.emit(action.command);
         else
           m_log.warn("No signal handler's connected to 'action_click'");
 
diff --git a/include/components/controller.hpp b/include/components/controller.hpp
index d22d0e5d..6e3cb525 100644
--- a/include/components/controller.hpp
+++ b/include/components/controller.hpp
@@ -6,6 +6,7 @@
 #include "components/bar.hpp"
 #include "components/config.hpp"
 #include "components/logger.hpp"
+#include "components/signals.hpp"
 #include "components/x11/connection.hpp"
 #include "components/x11/randr.hpp"
 #include "components/x11/tray.hpp"
@@ -87,7 +88,7 @@ class controller {
     }
 
     m_log.trace("controller: Deconstruct bar instance");
-    bar_signals::action_click.disconnect(this, &controller::on_module_click);
+    g_signals::bar::action_click.disconnect(this, &controller::on_module_click);
     m_bar.reset();
 
     m_log.trace("controller: Interrupt X event loop");
@@ -162,7 +163,7 @@ class controller {
         std::cout << m_bar->settings().wmname << std::endl;
         return;
       } else if (!to_stdout) {
-        bar_signals::action_click.connect(this, &controller::on_module_click);
+        g_signals::bar::action_click.connect(this, &controller::on_module_click);
       }
     } catch (const std::exception& err) {
       throw application_error("Failed to setup bar renderer: " + string{err.what()});
@@ -520,13 +521,11 @@ class controller {
     m_log.trace("controller: Unrecognized input '%s'", input);
     m_log.trace("controller: Forwarding input to shell");
 
-    auto command = command_util::make_command("/usr/bin/env\nsh\n-c\n"+ input);
+    auto command = command_util::make_command("/usr/bin/env\nsh\n-c\n" + input);
 
     try {
       command->exec(false);
-      command->tail([this](std::string output){
-        m_log.trace("> %s", output);
-      });
+      command->tail([this](std::string output) { m_log.trace("> %s", output); });
       command->wait();
     } catch (const application_error& err) {
       m_log.err(err.what());
diff --git a/include/components/parser.hpp b/include/components/parser.hpp
index 7acb3444..edd9dcc3 100644
--- a/include/components/parser.hpp
+++ b/include/components/parser.hpp
@@ -5,6 +5,7 @@
 #include "common.hpp"
 #include "components/logger.hpp"
 #include "components/types.hpp"
+#include "components/signals.hpp"
 #include "utils/math.hpp"
 #include "utils/string.hpp"
 
@@ -12,20 +13,6 @@ LEMONBUDDY_NS
 
 DEFINE_ERROR(unrecognized_token);
 
-namespace parser_signals {
-  delegate::Signal1<alignment> alignment_change;
-  delegate::Signal1<attribute> attribute_set;
-  delegate::Signal1<attribute> attribute_unset;
-  delegate::Signal1<attribute> attribute_toggle;
-  delegate::Signal2<mousebtn, string> action_block_open;
-  delegate::Signal1<mousebtn> action_block_close;
-  delegate::Signal2<gc, color> color_change;
-  delegate::Signal1<int> font_change;
-  delegate::Signal1<int> pixel_offset;
-  delegate::Signal1<uint16_t> ascii_text_write;
-  delegate::Signal1<uint16_t> unicode_text_write;
-};
-
 class parser {
  public:
   /**
@@ -77,81 +64,81 @@ class parser {
       switch (tag) {
         case 'B':
           // Ignore tag if it occurs again later in the same block
-          if (data.find(" B") == string::npos && !parser_signals::color_change.empty())
-            parser_signals::color_change.emit(gc::BG, parse_color(value, m_bar.background));
+          if (data.find(" B") == string::npos && !g_signals::parser::color_change.empty())
+            g_signals::parser::color_change.emit(gc::BG, parse_color(value, m_bar.background));
           break;
 
         case 'F':
           // Ignore tag if it occurs again later in the same block
-          if (data.find(" F") == string::npos && !parser_signals::color_change.empty())
-            parser_signals::color_change.emit(gc::FG, parse_color(value, m_bar.foreground));
+          if (data.find(" F") == string::npos && !g_signals::parser::color_change.empty())
+            g_signals::parser::color_change.emit(gc::FG, parse_color(value, m_bar.foreground));
           break;
 
         case 'U':
           // Ignore tag if it occurs again later in the same block
-          if (data.find(" U") == string::npos && !parser_signals::color_change.empty()) {
-            parser_signals::color_change.emit(gc::UL, parse_color(value, m_bar.linecolor));
-            parser_signals::color_change.emit(gc::OL, parse_color(value, m_bar.linecolor));
+          if (data.find(" U") == string::npos && !g_signals::parser::color_change.empty()) {
+            g_signals::parser::color_change.emit(gc::UL, parse_color(value, m_bar.linecolor));
+            g_signals::parser::color_change.emit(gc::OL, parse_color(value, m_bar.linecolor));
           }
           break;
 
         case 'R':
-          if (!parser_signals::color_change.empty()) {
-            parser_signals::color_change.emit(gc::BG, m_bar.foreground);
-            parser_signals::color_change.emit(gc::FG, m_bar.background);
+          if (!g_signals::parser::color_change.empty()) {
+            g_signals::parser::color_change.emit(gc::BG, m_bar.foreground);
+            g_signals::parser::color_change.emit(gc::FG, m_bar.background);
           }
           break;
 
         case 'T':
-          if (data.find(" T") == string::npos && !parser_signals::font_change.empty())
-            parser_signals::font_change.emit(parse_fontindex(value));
+          if (data.find(" T") == string::npos && !g_signals::parser::font_change.empty())
+            g_signals::parser::font_change.emit(parse_fontindex(value));
           break;
 
         case 'O':
-          if (!parser_signals::pixel_offset.empty())
-            parser_signals::pixel_offset.emit(std::atoi(value.c_str()));
+          if (!g_signals::parser::pixel_offset.empty())
+            g_signals::parser::pixel_offset.emit(std::atoi(value.c_str()));
           break;
 
         case 'l':
-          if (!parser_signals::alignment_change.empty())
-            parser_signals::alignment_change.emit(alignment::LEFT);
+          if (!g_signals::parser::alignment_change.empty())
+            g_signals::parser::alignment_change.emit(alignment::LEFT);
           break;
 
         case 'c':
-          if (!parser_signals::alignment_change.empty())
-            parser_signals::alignment_change.emit(alignment::CENTER);
+          if (!g_signals::parser::alignment_change.empty())
+            g_signals::parser::alignment_change.emit(alignment::CENTER);
           break;
 
         case 'r':
-          if (!parser_signals::alignment_change.empty())
-            parser_signals::alignment_change.emit(alignment::RIGHT);
+          if (!g_signals::parser::alignment_change.empty())
+            g_signals::parser::alignment_change.emit(alignment::RIGHT);
           break;
 
         case '+':
-          if (!parser_signals::attribute_set.empty())
-            parser_signals::attribute_set.emit(parse_attr(value[0]));
+          if (!g_signals::parser::attribute_set.empty())
+            g_signals::parser::attribute_set.emit(parse_attr(value[0]));
           break;
 
         case '-':
-          if (!parser_signals::attribute_unset.empty())
-            parser_signals::attribute_unset.emit(parse_attr(value[0]));
+          if (!g_signals::parser::attribute_unset.empty())
+            g_signals::parser::attribute_unset.emit(parse_attr(value[0]));
           break;
 
         case '!':
-          if (!parser_signals::attribute_toggle.empty())
-            parser_signals::attribute_toggle.emit(parse_attr(value[0]));
+          if (!g_signals::parser::attribute_toggle.empty())
+            g_signals::parser::attribute_toggle.emit(parse_attr(value[0]));
           break;
 
         case 'A':
           if (isdigit(data[0])) {
             value = parse_action_cmd(data);
-            if (!parser_signals::action_block_open.empty())
-              parser_signals::action_block_open.emit(parse_action_btn(data), value);
+            if (!g_signals::parser::action_block_open.empty())
+              g_signals::parser::action_block_open.emit(parse_action_btn(data), value);
             m_actions.push_back(data[0] - '0');
             value += "0::";  // make sure we strip the correct length (btn+wrapping colons)
           } else {
-            if (!parser_signals::action_block_close.empty())
-              parser_signals::action_block_close.emit(parse_action_btn(data));
+            if (!g_signals::parser::action_block_close.empty())
+              g_signals::parser::action_block_close.emit(parse_action_btn(data));
             m_actions.pop_back();
           }
           break;
@@ -178,31 +165,31 @@ class parser {
     //   size_t n = 0;
     //   while (sequence[n] != '\0' && static_cast<uint8_t>(sequence[n]) < 0x80 && ++n <= next_tag)
     //     ;
-    //   parser_signals::ascii_text_write.emit(data.substr(0, n));
+    //   g_signals::parser::ascii_text_write.emit(data.substr(0, n));
     //   return data.length();
     // }
 
     if (utf[0] < 0x80) {
-      parser_signals::ascii_text_write.emit(utf[0]);
+      g_signals::parser::ascii_text_write.emit(utf[0]);
       return 1;
     } else if ((utf[0] & 0xe0) == 0xc0) {  // 2 byte utf-8 sequence
-      parser_signals::unicode_text_write.emit((utf[0] & 0x1f) << 6 | (utf[1] & 0x3f));
+      g_signals::parser::unicode_text_write.emit((utf[0] & 0x1f) << 6 | (utf[1] & 0x3f));
       return 2;
     } else if ((utf[0] & 0xf0) == 0xe0) {  // 3 byte utf-8 sequence
-      parser_signals::unicode_text_write.emit(
+      g_signals::parser::unicode_text_write.emit(
           (utf[0] & 0xf) << 12 | (utf[1] & 0x3f) << 6 | (utf[2] & 0x3f));
       return 3;
     } else if ((utf[0] & 0xf8) == 0xf0) {  // 4 byte utf-8 sequence
-      parser_signals::unicode_text_write.emit(0xfffd);
+      g_signals::parser::unicode_text_write.emit(0xfffd);
       return 4;
     } else if ((utf[0] & 0xfc) == 0xf8) {  // 5 byte utf-8 sequence
-      parser_signals::unicode_text_write.emit(0xfffd);
+      g_signals::parser::unicode_text_write.emit(0xfffd);
       return 5;
     } else if ((utf[0] & 0xfe) == 0xfc) {  // 6 byte utf-8 sequence
-      parser_signals::unicode_text_write.emit(0xfffd);
+      g_signals::parser::unicode_text_write.emit(0xfffd);
       return 6;
     } else {  // invalid utf-8 sequence
-      parser_signals::ascii_text_write.emit(utf[0]);
+      g_signals::parser::ascii_text_write.emit(utf[0]);
       return 1;
     }
   }  // }}}
diff --git a/include/components/signals.hpp b/include/components/signals.hpp
new file mode 100644
index 00000000..1f676835
--- /dev/null
+++ b/include/components/signals.hpp
@@ -0,0 +1,44 @@
+#pragma once
+
+#include <fastdelegate/fastdelegate.hpp>
+
+#include "common.hpp"
+#include "components/types.hpp"
+
+LEMONBUDDY_NS
+
+namespace g_signals {
+  /**
+   * Signals used to communicate with the bar window
+   */
+  namespace bar {
+    static delegate::Signal1<string> action_click;
+    static delegate::Signal1<bool> visibility_change;
+  }
+
+  /**
+   * Signals used to communicate with the input parser
+   */
+  namespace parser {
+    static delegate::Signal1<alignment> alignment_change;
+    static delegate::Signal1<attribute> attribute_set;
+    static delegate::Signal1<attribute> attribute_unset;
+    static delegate::Signal1<attribute> attribute_toggle;
+    static delegate::Signal2<mousebtn, string> action_block_open;
+    static delegate::Signal1<mousebtn> action_block_close;
+    static delegate::Signal2<gc, color> color_change;
+    static delegate::Signal1<int> font_change;
+    static delegate::Signal1<int> pixel_offset;
+    static delegate::Signal1<uint16_t> ascii_text_write;
+    static delegate::Signal1<uint16_t> unicode_text_write;
+  }
+
+  /**
+   * Signals used to communicate with the tray manager
+   */
+  namespace tray {
+    static delegate::Signal1<uint16_t> report_slotcount;
+  }
+}
+
+LEMONBUDDY_NS_END
diff --git a/include/components/x11/tray.hpp b/include/components/x11/tray.hpp
index 5e07ba5f..d9705e5c 100644
--- a/include/components/x11/tray.hpp
+++ b/include/components/x11/tray.hpp
@@ -2,10 +2,10 @@
 
 #include <xcb/xcb.h>
 #include <xcb/xcb_icccm.h>
-#include <fastdelegate/fastdelegate.hpp>
 
 #include "common.hpp"
 #include "components/logger.hpp"
+#include "components/signals.hpp"
 #include "components/types.hpp"
 #include "components/x11/connection.hpp"
 #include "components/x11/xembed.hpp"
@@ -24,10 +24,6 @@
 
 LEMONBUDDY_NS
 
-namespace tray_signals {
-  delegate::Signal1<uint16_t> report_slotcount;
-};
-
 // class definition : trayclient {{{
 
 class trayclient {
@@ -225,8 +221,8 @@ class traymanager
       }
     }
 
-    if (!tray_signals::report_slotcount.empty())
-      tray_signals::report_slotcount.emit(mapped_clients);
+    if (!g_signals::tray::report_slotcount.empty())
+      g_signals::tray::report_slotcount.emit(mapped_clients);
 
     if (!width && m_mapped) {
       m_connection.unmap_window(m_tray);