diff --git a/include/events/signal.hpp b/include/events/signal.hpp index a91d8505..f25f92d4 100644 --- a/include/events/signal.hpp +++ b/include/events/signal.hpp @@ -101,9 +101,6 @@ namespace signals { } // namespace ui namespace ui_tray { - struct tray_width_change : public detail::base_signal { - using base_type::base_type; - }; struct tray_pos_change : public detail::value_signal { using base_type::base_type; }; diff --git a/include/events/signal_fwd.hpp b/include/events/signal_fwd.hpp index 5696beeb..7d4e26e4 100644 --- a/include/events/signal_fwd.hpp +++ b/include/events/signal_fwd.hpp @@ -35,7 +35,6 @@ namespace signals { struct update_geometry; } // namespace ui namespace ui_tray { - struct tray_width_change; struct tray_pos_change; struct tray_visibility; } // namespace ui_tray diff --git a/include/modules/tray.hpp b/include/modules/tray.hpp index dbf621f4..19b42f65 100644 --- a/include/modules/tray.hpp +++ b/include/modules/tray.hpp @@ -7,8 +7,7 @@ POLYBAR_NS namespace modules { - class tray_module : public static_module, - public signal_receiver { + class tray_module : public static_module { public: explicit tray_module(const bar_settings& bar_settings, string name_); string get_format() const; @@ -17,9 +16,6 @@ namespace modules { bool build(builder* builder, const string& tag) const; void update() {} - void teardown(); - - bool on(const signals::ui_tray::tray_width_change& evt) override; static constexpr auto TYPE = "internal/tray"; diff --git a/include/x11/tray_manager.hpp b/include/x11/tray_manager.hpp index d79b9183..0bf4dee9 100644 --- a/include/x11/tray_manager.hpp +++ b/include/x11/tray_manager.hpp @@ -56,16 +56,15 @@ struct tray_settings { xcb_window_t selection_owner{XCB_NONE}; }; +using on_update = std::function; + class tray_manager : public xpp::event::sink, public signal_receiver { public: - using make_type = unique_ptr; - static make_type make(const bar_settings& bar_opts); - - explicit tray_manager(connection& conn, signal_emitter& emitter, const logger& logger, const bar_settings& bar_opts); + explicit tray_manager(connection& conn, signal_emitter& emitter, const logger& logger, const bar_settings& bar_opts, on_update on_update); ~tray_manager(); @@ -107,7 +106,7 @@ class tray_manager : public xpp::event::sink(bar_settings, move(name_)) - , m_tray(connection::make(), signal_emitter::make(), m_log, bar_settings) { + , m_tray(connection::make(), signal_emitter::make(), m_log, bar_settings, [&] { this->broadcast(); }) { m_formatter->add(DEFAULT_FORMAT, TAG_TRAY, {TAG_TRAY}); - m_sig.attach(this); } string tray_module::get_format() const { @@ -33,17 +32,5 @@ namespace modules { return false; } - /** - * TODO Replace signal with callback passed to tray. - */ - bool tray_module::on(const signals::ui_tray::tray_width_change&) { - broadcast(); - return true; - } - - void tray_module::teardown() { - m_sig.detach(this); - } - } // namespace modules POLYBAR_NS_END diff --git a/src/x11/tray_manager.cpp b/src/x11/tray_manager.cpp index 6638713b..c8770690 100644 --- a/src/x11/tray_manager.cpp +++ b/src/x11/tray_manager.cpp @@ -25,6 +25,16 @@ * Tray implementation according to the System Tray Protocol. * * Ref: https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-latest.html + * + * This class manages embedded tray icons by placing them on the bar in the correct position; the position itself is + * requested by the renderer. + * + * The tray manager needs to trigger bar updates only when the size of the entire tray changes (e.g. when tray icons are + * added/removed). EVerything else can be handled without an update. + * + * TODO + * * Better handling of state: + * * Differentiate between, inactive, active, and waiting for selection */ // ==================================================================================================== @@ -44,16 +54,9 @@ POLYBAR_NS -/** - * Create instance - */ -tray_manager::make_type tray_manager::make(const bar_settings& bar_opts) { - return std::make_unique(connection::make(), signal_emitter::make(), logger::make(), bar_opts); -} - tray_manager::tray_manager( - connection& conn, signal_emitter& emitter, const logger& logger, const bar_settings& bar_opts) - : m_connection(conn), m_sig(emitter), m_log(logger), m_bar_opts(bar_opts) { + connection& conn, signal_emitter& emitter, const logger& logger, const bar_settings& bar_opts, on_update on_update) + : m_connection(conn), m_sig(emitter), m_log(logger), m_bar_opts(bar_opts), m_on_update(on_update) { m_connection.attach_sink(this, SINK_PRIORITY_TRAY); } @@ -174,8 +177,7 @@ void tray_manager::deactivate(bool clear_selection) { m_connection.flush(); - // TODO update through module - m_sig.emit(signals::eventqueue::notify_forcechange{}); + reconfigure_window(); } /** @@ -186,11 +188,7 @@ void tray_manager::reconfigure() { return; } - try { - reconfigure_window(); - } catch (const exception& err) { - m_log.err("Failed to reconfigure tray window (%s)", err.what()); - } + reconfigure_window(); try { reconfigure_clients(); @@ -199,23 +197,26 @@ void tray_manager::reconfigure() { } m_connection.flush(); - - // TODO update through module - m_sig.emit(signals::eventqueue::notify_forcechange{}); } /** * Reconfigure container window + * + * TODO should we call update_width directly? */ void tray_manager::reconfigure_window() { m_log.trace("tray: Reconfigure window (hidden=%i, clients=%i)", static_cast(m_hidden), m_clients.size()); - update_width(calculate_w()); + update_width(); } -void tray_manager::update_width(unsigned new_width) { +/** + * TODO make sure this is always called when m_clients changes + */ +void tray_manager::update_width() { + unsigned new_width = calculate_w(); if (m_tray_width != new_width) { m_tray_width = new_width; - m_sig.emit(signals::ui_tray::tray_width_change{}); + m_on_update(); } }