tray: Cleanup position calculation

This commit is contained in:
patrick96 2023-04-01 03:08:34 +02:00 committed by Patrick Ziegler
parent b5f8466117
commit 7fbd2d175c
2 changed files with 28 additions and 15 deletions

View File

@ -47,6 +47,11 @@ struct tray_settings {
*/ */
unsigned spacing{0U}; unsigned spacing{0U};
/**
* Number of pixels added before and after each tray icon
*/
unsigned padding{0U};
/** /**
* Background color used in the client wrapper window * Background color used in the client wrapper window
* *
@ -114,12 +119,10 @@ class manager : public xpp::event::sink<evt::expose, evt::client_message, evt::c
void track_selection_owner(xcb_window_t owner); void track_selection_owner(xcb_window_t owner);
void process_docking_request(xcb_window_t win); void process_docking_request(xcb_window_t win);
/**
* Final x-position of the tray window relative to the very top-left bar window.
*/
int calculate_x() const; int calculate_x() const;
unsigned calculate_w() const; unsigned calculate_w() const;
unsigned calculate_w(unsigned count) const;
int calculate_client_y(); int calculate_client_y();

View File

@ -233,19 +233,20 @@ void manager::recalculate_width() {
void manager::reconfigure_clients() { void manager::reconfigure_clients() {
m_log.trace("tray: Reconfigure clients"); m_log.trace("tray: Reconfigure clients");
int x = calculate_x() + m_opts.spacing; int base_x = calculate_x();
bool has_error = false; bool has_error = false;
unsigned count = 0;
for (auto& client : m_clients) { for (auto& client : m_clients) {
try { try {
client->ensure_state(); client->ensure_state();
if (client->mapped()) { if (client->mapped()) {
client->set_position(x, calculate_client_y()); client->set_position(base_x + calculate_w(count), calculate_client_y());
count++;
} }
x += m_opts.client_size.w + m_opts.spacing;
} catch (const xpp::x::error::window& err) { } catch (const xpp::x::error::window& err) {
m_log.err("Failed to reconfigure %s, removing ... (%s)", client->name(), err.what()); m_log.err("Failed to reconfigure %s, removing ... (%s)", client->name(), err.what());
client.reset(); client.reset();
@ -417,6 +418,9 @@ void manager::process_docking_request(xcb_window_t win) {
} }
} }
/**
* Final x-position of the tray window relative to the very top-left bar window.
*/
int manager::calculate_x() const { int manager::calculate_x() const {
return m_bar_opts.inner_area(false).x + m_pos.x; return m_bar_opts.inner_area(false).x + m_pos.x;
} }
@ -427,15 +431,21 @@ int manager::calculate_x() const {
* This many pixels need to be reserved on the bar in order to draw the tray. * This many pixels need to be reserved on the bar in order to draw the tray.
*/ */
unsigned manager::calculate_w() const { unsigned manager::calculate_w() const {
unsigned width = m_opts.spacing; unsigned count =
unsigned count{0}; std::count_if(m_clients.begin(), m_clients.end(), [](const auto& client) { return client->mapped(); });
for (const auto& client : m_clients) {
if (client->mapped()) { return calculate_w(count);
count++;
width += m_opts.spacing + m_opts.client_size.w;
} }
/**
* Calculates the width taken up by count tray icons in pixels
*/
unsigned manager::calculate_w(unsigned count) const {
if (count) {
return m_opts.spacing + count * (m_opts.spacing + m_opts.client_size.w);
} else {
return 0;
} }
return count ? width : 0;
} }
/** /**