From 9c759549c6400d73b6a1d68ca67d071ce89da2f2 Mon Sep 17 00:00:00 2001 From: patrick96 Date: Tue, 26 Jul 2022 00:01:21 +0200 Subject: [PATCH] tray: Remove background_manager The tray window uses the pixmap of the bar window and clears window content on every update. --- include/x11/tray_manager.hpp | 13 +--- src/components/bar.cpp | 2 + src/x11/tray_client.cpp | 4 +- src/x11/tray_manager.cpp | 144 +---------------------------------- 4 files changed, 9 insertions(+), 154 deletions(-) diff --git a/include/x11/tray_manager.hpp b/include/x11/tray_manager.hpp index 162216bf..fbe6fde6 100644 --- a/include/x11/tray_manager.hpp +++ b/include/x11/tray_manager.hpp @@ -36,7 +36,6 @@ using std::atomic; // fwd declarations class connection; -class background_manager; class bg_slice; enum class tray_postition { NONE = 0, LEFT, CENTER, RIGHT, MODULE }; @@ -83,7 +82,6 @@ struct tray_settings { unsigned int spacing{0U}; rgba background{}; rgba foreground{}; - bool transparent{false}; bool detached{false}; xcb_window_t bar_window; @@ -99,8 +97,7 @@ class tray_manager 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, background_manager& back, - const bar_settings& bar_opts); + explicit tray_manager(connection& conn, signal_emitter& emitter, const logger& logger, const bar_settings& bar_opts); ~tray_manager(); @@ -121,7 +118,6 @@ class tray_manager void query_atom(); void create_window(); - void create_bg(); void set_wm_hints(); void set_tray_colors(); @@ -170,18 +166,11 @@ class tray_manager connection& m_connection; signal_emitter& m_sig; const logger& m_log; - background_manager& m_background_manager; - std::shared_ptr m_bg_slice; vector m_clients; tray_settings m_opts{}; const bar_settings& m_bar_opts; - xcb_gcontext_t m_gc{0}; - xcb_pixmap_t m_pixmap{0}; - unique_ptr m_surface; - unique_ptr m_context; - xcb_atom_t m_atom{0}; xcb_window_t m_tray{0}; xcb_window_t m_othermanager{0}; diff --git a/src/components/bar.cpp b/src/components/bar.cpp index 1c3fa4e9..fa122fc5 100644 --- a/src/components/bar.cpp +++ b/src/components/bar.cpp @@ -388,6 +388,8 @@ void bar::parse(string&& data, bool force) { auto rect = m_opts.inner_area(); + // TODO don't shrink the rect but somehow tell renderer to only use part of the rectangle for rendering bar content + // (but render background everyhwere) if (m_tray && !m_tray->settings().detached && m_tray->settings().num_mapped_clients > 0 && m_tray->settings().tray_position != tray_postition::MODULE) { auto tray_pos = m_tray->settings().tray_position; diff --git a/src/x11/tray_client.cpp b/src/x11/tray_client.cpp index a5ffaee4..a8d18893 100644 --- a/src/x11/tray_client.cpp +++ b/src/x11/tray_client.cpp @@ -34,8 +34,8 @@ tray_client::tray_client(const logger& log, connection& conn, xcb_window_t tray, << cw_parent(tray) << cw_class(XCB_WINDOW_CLASS_INPUT_OUTPUT) // TODO add proper pixmap - // << cw_params_back_pixmap(XCB_PIXMAP_NONE) - << cw_params_back_pixel(0x00ff00) + << cw_params_back_pixmap(XCB_PIXMAP_NONE) + // << cw_params_back_pixel(0x00ff00) // The X server requires the border pixel to be defined if the depth doesn't match the parent window << cw_params_border_pixel(conn.screen()->black_pixel) << cw_params_backing_store(XCB_BACKING_STORE_WHEN_MAPPED) diff --git a/src/x11/tray_manager.cpp b/src/x11/tray_manager.cpp index 70e0c10b..6ca01d64 100644 --- a/src/x11/tray_manager.cpp +++ b/src/x11/tray_manager.cpp @@ -15,7 +15,6 @@ #include "utils/memory.hpp" #include "utils/process.hpp" #include "utils/units.hpp" -#include "x11/background_manager.hpp" #include "x11/ewmh.hpp" #include "x11/icccm.hpp" #include "x11/window.hpp" @@ -49,13 +48,12 @@ 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(), background_manager::make(), 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, background_manager& back, - const bar_settings& bar_opts) - : m_connection(conn), m_sig(emitter), m_log(logger), m_background_manager(back), m_bar_opts(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) { m_connection.attach_sink(this, SINK_PRIORITY_TRAY); } @@ -136,11 +134,6 @@ void tray_manager::setup(const string& tray_module_name) { m_opts.background = conf.get(bs, "tray-background", m_bar_opts.background); m_opts.foreground = conf.get(bs, "tray-foreground", m_bar_opts.foreground); - if (m_opts.background.alpha_i() != 255) { - m_log.info("tray: enable transparency"); - m_opts.transparent = true; - } - // Add user-defined padding m_opts.spacing += conf.get(bs, "tray-padding", 0); @@ -195,7 +188,6 @@ void tray_manager::activate() { try { create_window(); - create_bg(); set_wm_hints(); set_tray_colors(); } catch (const exception& err) { @@ -252,19 +244,6 @@ void tray_manager::deactivate(bool clear_selection) { m_tray = 0; } - m_context.reset(); - m_surface.reset(); - - if (m_pixmap) { - m_connection.free_pixmap(m_pixmap); - m_pixmap = 0; - } - - if (m_gc) { - m_connection.free_gc(m_gc); - m_gc = 0; - } - m_opts.win_size.w = 0; m_opts.num_mapped_clients = 0; m_acquired_selection = false; @@ -331,11 +310,6 @@ void tray_manager::reconfigure_window() { auto width = calculate_w(); m_opts.win_size.w = width; - if (m_opts.transparent) { - xcb_rectangle_t rect{0, 0, calculate_w(), calculate_h()}; - m_bg_slice = m_background_manager.observe(rect, m_tray); - } - if (width > 0) { auto x = calculate_x(width); m_log.trace("tray: New window values, width=%d, x=%d", width, x); @@ -396,26 +370,6 @@ void tray_manager::reconfigure_bg() { client.clear_window(); } - if (!m_opts.transparent || m_clients.empty() || !m_mapped) { - return; - }; - - m_log.trace("tray: Reconfigure bg"); - - if (!m_context) { - return m_log.err("tray: no context for drawing the background"); - } - - cairo::xcb_surface* surface = m_bg_slice->get_surface(); - if (!surface) { - return m_log.err("tray: no root surface"); - } - - m_context->clear(); - *m_context << CAIRO_OPERATOR_SOURCE << *m_surface; - m_context->paint(); - *m_context << CAIRO_OPERATOR_OVER << m_opts.background; - m_context->paint(); } /** @@ -433,15 +387,6 @@ void tray_manager::refresh_window() { auto width = calculate_w(); auto height = calculate_h(); - if (m_opts.transparent && !m_context) { - xcb_rectangle_t rect{0, 0, static_cast(width), static_cast(height)}; - m_connection.poly_fill_rectangle(m_pixmap, m_gc, 1, &rect); - } - - if (m_surface) { - m_surface->flush(); - } - m_connection.clear_area(0, m_tray, 0, 0, width, height); for (auto& client : m_clients) { @@ -505,87 +450,13 @@ void tray_manager::create_window() { << cw_parent(m_opts.bar_window); // clang-format on - // if (!m_opts.transparent) { - // win << cw_params_back_pixel(m_opts.background); - // win << cw_params_border_pixel(m_opts.background); - // } - m_tray = win << cw_flush(true); m_log.info("Tray window: %s", m_connection.id(m_tray)); - // activate the background manager if we have transparency - if (m_opts.transparent) { - xcb_rectangle_t rect{0, 0, calculate_w(), calculate_h()}; - m_bg_slice = m_background_manager.observe(rect, m_tray); - } - const unsigned int shadow{0}; m_connection.change_property(XCB_PROP_MODE_REPLACE, m_tray, _COMPTON_SHADOW, XCB_ATOM_CARDINAL, 32, 1, &shadow); } -/** - * Create tray window background components - */ -void tray_manager::create_bg() { - if (!m_opts.transparent) { - return; - } - if (m_pixmap && m_gc && m_surface && m_context) { - return; - } - - auto w = m_opts.width_max; - auto h = calculate_h(); - - if (!m_pixmap) { - try { - /* - * Use depths of bar window. - */ - m_pixmap = m_connection.generate_id(); - m_connection.create_pixmap_checked(m_bar_opts.x_data.depth, m_pixmap, m_tray, w, h); - } catch (const exception& err) { - return m_log.err("Failed to create pixmap for tray background (err: %s)", err.what()); - } - } - - if (!m_gc) { - try { - xcb_params_gc_t params{}; - uint32_t mask = 0; - std::array values{}; - XCB_AUX_ADD_PARAM(&mask, ¶ms, graphics_exposures, 1); - connection::pack_values(mask, ¶ms, values); - m_gc = m_connection.generate_id(); - m_connection.create_gc_checked(m_gc, m_pixmap, mask, values.data()); - } catch (const exception& err) { - return m_log.err("Failed to create gcontext for tray background (err: %s)", err.what()); - } - } - - if (!m_surface) { - xcb_visualtype_t* visual = m_connection.visual_type_for_id(m_connection.screen()->root_visual); - if (!visual) { - return m_log.err("Failed to get root visual for tray background"); - } - m_surface = make_unique(m_connection, m_pixmap, visual, w, h); - } - - if (!m_context) { - m_context = make_unique(*m_surface, m_log); - m_context->clear(); - *m_context << CAIRO_OPERATOR_SOURCE << m_opts.background; - m_context->paint(); - } - - try { - // TODO - // m_connection.change_window_attributes_checked(m_tray, XCB_CW_BACK_PIXMAP, &m_pixmap); - } catch (const exception& err) { - m_log.err("Failed to set tray window back pixmap (%s)", err.what()); - } -} - /** * Set window WM hints */ @@ -982,13 +853,6 @@ void tray_manager::handle(const evt::property_notify& evt) { return; } - // 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)) { - redraw_window(); - return; - } - if (evt->atom != _XEMBED_INFO) { return; }