diff --git a/src/x11/tray.cpp b/src/x11/tray.cpp
index d7c10249..83e51290 100644
--- a/src/x11/tray.cpp
+++ b/src/x11/tray.cpp
@@ -165,6 +165,9 @@ const tray_settings tray_manager::settings() const {  // {{{
 void tray_manager::bootstrap(tray_settings settings) {  // {{{
   m_opts = settings;
   query_atom();
+
+  // Listen for visibility change events on the bar window
+  g_signals::bar::visibility_change = bind(&tray_manager::bar_visibility_change, this, placeholders::_1);
 }  // }}}
 
 /**
@@ -191,11 +194,6 @@ void tray_manager::activate() {  // {{{
     return;
   }
 
-  // Listen for visibility change events on the bar window
-  if (!m_restacked && !g_signals::bar::visibility_change) {
-    g_signals::bar::visibility_change = bind(&tray_manager::bar_visibility_change, this, std::placeholders::_1);
-  }
-
   // Attempt to get control of the systray selection then
   // notify clients waiting for a manager.
   acquire_selection();
@@ -779,7 +777,7 @@ void tray_manager::process_docking_request(xcb_window_t win) {  // {{{
  * toggle the tray window whenever the visibility of the bar window changes.
  */
 void tray_manager::bar_visibility_change(bool state) {  // {{{
-  if (m_hidden == !state) {
+  if (!m_activated || m_restacked || m_hidden == !state) {
     return;
   }