tray: implement hiding functionality (#2723)

* tray hiding works

* clang-format

* Implemented suggestions
This commit is contained in:
raffael0 2022-06-16 12:53:49 +02:00 committed by GitHub
parent 86f2baa550
commit b2c5d8e0e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 28 deletions

View File

@ -110,6 +110,9 @@ namespace signals {
struct tray_pos_change : public detail::value_signal<tray_pos_change, int> { struct tray_pos_change : public detail::value_signal<tray_pos_change, int> {
using base_type::base_type; using base_type::base_type;
}; };
struct tray_visibility : public detail::value_signal<tray_visibility, bool> {
using base_type::base_type;
};
} // namespace ui_tray } // namespace ui_tray
} // namespace signals } // namespace signals

View File

@ -38,7 +38,8 @@ namespace signals {
struct mapped_clients; struct mapped_clients;
struct tray_width_change; struct tray_width_change;
struct tray_pos_change; struct tray_pos_change;
} struct tray_visibility;
} // namespace ui_tray
} // namespace signals } // namespace signals
POLYBAR_NS_END POLYBAR_NS_END

View File

@ -65,11 +65,12 @@ struct tray_settings {
bool detached{false}; bool detached{false};
}; };
class tray_manager : public xpp::event::sink<evt::expose, evt::visibility_notify, evt::client_message, class tray_manager
evt::configure_request, evt::resize_request, evt::selection_clear, evt::property_notify, : public xpp::event::sink<evt::expose, evt::visibility_notify, evt::client_message, evt::configure_request,
evt::reparent_notify, evt::destroy_notify, evt::map_notify, evt::unmap_notify>, evt::resize_request, evt::selection_clear, evt::property_notify, evt::reparent_notify, evt::destroy_notify,
public signal_receiver<SIGN_PRIORITY_TRAY, signals::ui::visibility_change, signals::ui::dim_window, evt::map_notify, evt::unmap_notify>,
signals::ui::update_background, signals::ui_tray::tray_pos_change> { public signal_receiver<SIGN_PRIORITY_TRAY, signals::ui::visibility_change, signals::ui::dim_window,
signals::ui::update_background, signals::ui_tray::tray_pos_change, signals::ui_tray::tray_visibility> {
public: public:
using make_type = unique_ptr<tray_manager>; using make_type = unique_ptr<tray_manager>;
static make_type make(const bar_settings& settings); static make_type make(const bar_settings& settings);
@ -122,6 +123,7 @@ class tray_manager : public xpp::event::sink<evt::expose, evt::visibility_notify
void remove_client(shared_ptr<tray_client>& client, bool reconfigure = true); void remove_client(shared_ptr<tray_client>& client, bool reconfigure = true);
void remove_client(xcb_window_t win, bool reconfigure = true); void remove_client(xcb_window_t win, bool reconfigure = true);
unsigned int mapped_clients() const; unsigned int mapped_clients() const;
bool change_visibility(bool visible);
void handle(const evt::expose& evt) override; void handle(const evt::expose& evt) override;
void handle(const evt::visibility_notify& evt) override; void handle(const evt::visibility_notify& evt) override;
@ -139,6 +141,7 @@ class tray_manager : public xpp::event::sink<evt::expose, evt::visibility_notify
bool on(const signals::ui::dim_window& evt) override; bool on(const signals::ui::dim_window& evt) override;
bool on(const signals::ui::update_background& evt) override; bool on(const signals::ui::update_background& evt) override;
bool on(const signals::ui_tray::tray_pos_change& evt) override; bool on(const signals::ui_tray::tray_pos_change& evt) override;
bool on(const signals::ui_tray::tray_visibility& evt) override;
private: private:
connection& m_connection; connection& m_connection;

View File

@ -828,6 +828,9 @@ void renderer::apply_tray_position(const tags::context& context) {
int absolute_x = static_cast<int>( int absolute_x = static_cast<int>(
block_x(context.get_relative_tray_position().first) + context.get_relative_tray_position().second); block_x(context.get_relative_tray_position().first) + context.get_relative_tray_position().second);
m_sig.emit(signals::ui_tray::tray_pos_change{absolute_x}); m_sig.emit(signals::ui_tray::tray_pos_change{absolute_x});
m_sig.emit(signals::ui_tray::tray_visibility{true});
} else {
m_sig.emit(signals::ui_tray::tray_visibility{false});
} }
} }

View File

@ -914,6 +914,29 @@ unsigned int tray_manager::mapped_clients() const {
return mapped_clients; return mapped_clients;
} }
bool tray_manager::change_visibility(bool visible) {
unsigned int clients{mapped_clients()};
m_log.trace("tray: visibility_change (state=%i, activated=%i, mapped=%i, hidden=%i)", visible,
static_cast<bool>(m_activated), static_cast<bool>(m_mapped), static_cast<bool>(m_hidden));
m_hidden = !visible;
if (!m_activated) {
return false;
} else if (!m_hidden && !m_mapped && clients) {
m_connection.map_window(m_tray);
} else if ((!clients || m_hidden) && m_mapped) {
m_connection.unmap_window(m_tray);
} else if (m_mapped && !m_hidden && clients) {
redraw_window();
}
m_connection.flush();
return true;
}
/** /**
* Event callback : XCB_EXPOSE * Event callback : XCB_EXPOSE
*/ */
@ -1024,7 +1047,8 @@ void tray_manager::handle(const evt::property_notify& evt) {
} }
// React an wallpaper change, if bar has transparency // React an wallpaper change, if bar has transparency
if (m_opts.transparent && (evt->atom == _XROOTPMAP_ID || evt->atom == _XSETROOT_ID || evt->atom == ESETROOT_PMAP_ID)) { if (m_opts.transparent &&
(evt->atom == _XROOTPMAP_ID || evt->atom == _XSETROOT_ID || evt->atom == ESETROOT_PMAP_ID)) {
redraw_window(true); redraw_window(true);
return; return;
} }
@ -1132,27 +1156,7 @@ void tray_manager::handle(const evt::unmap_notify& evt) {
* toggle the tray window whenever the visibility of the bar window changes. * toggle the tray window whenever the visibility of the bar window changes.
*/ */
bool tray_manager::on(const signals::ui::visibility_change& evt) { bool tray_manager::on(const signals::ui::visibility_change& evt) {
bool visible{evt.cast()}; return change_visibility(evt.cast());
unsigned int clients{mapped_clients()};
m_log.trace("tray: visibility_change (state=%i, activated=%i, mapped=%i, hidden=%i)", visible,
static_cast<bool>(m_activated), static_cast<bool>(m_mapped), static_cast<bool>(m_hidden));
m_hidden = !visible;
if (!m_activated) {
return false;
} else if (!m_hidden && !m_mapped && clients) {
m_connection.map_window(m_tray);
} else if ((!clients || m_hidden) && m_mapped) {
m_connection.unmap_window(m_tray);
} else if (m_mapped && !m_hidden && clients) {
redraw_window();
}
m_connection.flush();
return true;
} }
bool tray_manager::on(const signals::ui::dim_window& evt) { bool tray_manager::on(const signals::ui::dim_window& evt) {
@ -1178,4 +1182,8 @@ bool tray_manager::on(const signals::ui_tray::tray_pos_change& evt) {
return true; return true;
} }
bool tray_manager::on(const signals::ui_tray::tray_visibility& evt) {
return change_visibility(evt.cast());
}
POLYBAR_NS_END POLYBAR_NS_END