Move client configuration into tray_client

This commit is contained in:
patrick96 2022-04-04 21:06:17 +02:00
parent 48d8187f90
commit 81d1f74b7b
No known key found for this signature in database
GPG Key ID: 521E5E03AEBCA1A7
3 changed files with 55 additions and 39 deletions

View File

@ -23,6 +23,9 @@ class tray_client : public non_copyable_mixin {
unsigned int height() const; unsigned int height() const;
void clear_window() const; void clear_window() const;
void update_client_attributes() const;
void reparent() const;
bool match(const xcb_window_t& win) const; bool match(const xcb_window_t& win) const;
bool mapped() const; bool mapped() const;
void mapped(bool state); void mapped(bool state);
@ -34,9 +37,13 @@ class tray_client : public non_copyable_mixin {
bool is_xembed_supported() const; bool is_xembed_supported() const;
const xembed::info& get_xembed() const; const xembed::info& get_xembed() const;
void notify_xembed() const;
void add_to_save_set() const;
void ensure_state() const; void ensure_state() const;
void reconfigure(int x, int y) const; void reconfigure(int x, int y) const;
void configure_notify(int x, int y) const; void configure_notify() const;
protected: protected:
const logger& m_log; const logger& m_log;

View File

@ -84,6 +84,25 @@ void tray_client::clear_window() const {
m_connection.clear_area_checked(1, client(), 0, 0, width(), height()); m_connection.clear_area_checked(1, client(), 0, 0, width(), height());
} }
void tray_client::update_client_attributes() const {
uint32_t configure_mask = 0;
std::array<uint32_t, 32> configure_values{};
xcb_params_cw_t configure_params{};
XCB_AUX_ADD_PARAM(
&configure_mask, &configure_params, event_mask, XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY);
connection::pack_values(configure_mask, &configure_params, configure_values);
m_log.trace("tray(%s): Update client window", m_connection.id(client()));
m_connection.change_window_attributes_checked(client(), configure_mask, configure_values.data());
}
void tray_client::reparent() const {
m_log.trace("tray(%s): Reparent client", m_connection.id(client()));
m_connection.reparent_window_checked(client(), embedder(), 0, 0);
}
/** /**
* Is this the client for the given client window * Is this the client for the given client window
*/ */
@ -125,11 +144,22 @@ const xembed::info& tray_client::get_xembed() const {
return m_xembed; return m_xembed;
} }
void tray_client::notify_xembed() const {
if (is_xembed_supported()) {
m_log.trace("tray(%s): Send embbeded notification to client", m_connection.id(client()));
xembed::notify_embedded(m_connection, client(), embedder(), m_xembed.get_version());
}
}
void tray_client::add_to_save_set() const {
m_log.trace("tray(%s): Add client window to the save set", m_connection.id(client()));
m_connection.change_save_set_checked(XCB_SET_MODE_INSERT, client());
}
/** /**
* Make sure that the window mapping state is correct * Make sure that the window mapping state is correct
*/ */
void tray_client::ensure_state() const { void tray_client::ensure_state() const {
// TODO correctly map/unmap wrapper
bool should_be_mapped = true; bool should_be_mapped = true;
if (is_xembed_supported()) { if (is_xembed_supported()) {
@ -137,11 +167,13 @@ void tray_client::ensure_state() const {
} }
if (!mapped() && should_be_mapped) { if (!mapped() && should_be_mapped) {
m_log.trace("tray(%s): Map client", m_connection.id(client()));
m_connection.map_window_checked(embedder()); m_connection.map_window_checked(embedder());
m_connection.map_window_checked(client()); m_connection.map_window_checked(client());
} else if (mapped() && !should_be_mapped) { } else if (mapped() && !should_be_mapped) {
m_connection.unmap_window_checked(embedder()); m_log.trace("tray(%s): Unmap client", m_connection.id(client()));
m_connection.unmap_window_checked(client()); m_connection.unmap_window_checked(client());
m_connection.unmap_window_checked(embedder());
} }
} }
@ -151,7 +183,6 @@ void tray_client::ensure_state() const {
void tray_client::reconfigure(int x, int y) const { void tray_client::reconfigure(int x, int y) const {
m_log.trace("tray(%s): moving to (%d, %d)", m_connection.id(client()), x, y); m_log.trace("tray(%s): moving to (%d, %d)", m_connection.id(client()), x, y);
// TODO correctly reconfigure wrapper + client
uint32_t configure_mask = 0; uint32_t configure_mask = 0;
std::array<uint32_t, 32> configure_values{}; std::array<uint32_t, 32> configure_values{};
xcb_params_configure_window_t configure_params{}; xcb_params_configure_window_t configure_params{};
@ -175,22 +206,21 @@ void tray_client::reconfigure(int x, int y) const {
/** /**
* Respond to client resize/move requests * Respond to client resize/move requests
*/ */
void tray_client::configure_notify(int x, int y) const { void tray_client::configure_notify() const {
// TODO remove x and y position. The position will always be (0,0)
xcb_configure_notify_event_t notify; xcb_configure_notify_event_t notify;
notify.response_type = XCB_CONFIGURE_NOTIFY; notify.response_type = XCB_CONFIGURE_NOTIFY;
notify.event = m_client; notify.event = client();
notify.window = m_client; notify.window = client();
notify.override_redirect = false; notify.override_redirect = false;
notify.above_sibling = 0; notify.above_sibling = 0;
notify.x = x; notify.x = 0;
notify.y = y; notify.y = 0;
notify.width = m_size.w; notify.width = m_size.w;
notify.height = m_size.h; notify.height = m_size.h;
notify.border_width = 0; notify.border_width = 0;
unsigned int mask{XCB_EVENT_MASK_STRUCTURE_NOTIFY}; unsigned int mask{XCB_EVENT_MASK_STRUCTURE_NOTIFY};
m_connection.send_event_checked(false, m_client, mask, reinterpret_cast<const char*>(&notify)); m_connection.send_event_checked(false, client(), mask, reinterpret_cast<const char*>(&notify));
} }
POLYBAR_NS_END POLYBAR_NS_END

View File

@ -714,36 +714,15 @@ void tray_manager::process_docking_request(xcb_window_t win) {
client.get_xembed().get_flags(), client.get_xembed().is_mapped() ? "true" : "false"); client.get_xembed().get_flags(), client.get_xembed().is_mapped() ? "true" : "false");
} }
const uint32_t mask = XCB_CW_EVENT_MASK; client.update_client_attributes();
const uint32_t value = XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
m_log.trace("tray: Update client window"); client.reparent();
m_connection.change_window_attributes_checked(client.client(), mask, &value);
m_log.trace("tray: Configure client size"); client.add_to_save_set();
client.reconfigure(0, 0);
// TODO put this into tray_client class client.notify_xembed();
m_log.trace("tray: Reparent client");
m_connection.reparent_window_checked(
client.client(), client.embedder(), calculate_client_x(client.client()), calculate_client_y());
m_log.trace("tray: Add client window to the save set"); client.ensure_state();
// TODO move this into tray_client
m_connection.change_save_set_checked(XCB_SET_MODE_INSERT, client.client());
if (client.is_xembed_supported()) {
m_log.trace("tray: Send embbeded notification to client");
// TODO move this into tray_client
xembed::notify_embedded(m_connection, client.client(), client.embedder(), client.get_xembed().get_version());
}
if (!client.is_xembed_supported() || client.get_xembed().is_mapped()) {
m_log.trace("tray: Map client");
// TODO move this into tray_client
m_connection.map_window_checked(client.client());
m_connection.map_window_checked(client.embedder());
}
m_clients.emplace_back(std::move(client)); m_clients.emplace_back(std::move(client));
} catch (const std::exception& err) { } catch (const std::exception& err) {
@ -918,7 +897,7 @@ void tray_manager::handle(const evt::configure_request& evt) {
if (m_activated && is_embedded(evt->window)) { if (m_activated && is_embedded(evt->window)) {
try { try {
m_log.trace("tray: Client configure request %s", m_connection.id(evt->window)); m_log.trace("tray: Client configure request %s", m_connection.id(evt->window));
find_client(evt->window)->configure_notify(calculate_client_x(evt->window), calculate_client_y()); find_client(evt->window)->configure_notify();
} catch (const xpp::x::error::window& err) { } catch (const xpp::x::error::window& err) {
m_log.err("Failed to reconfigure tray client, removing... (%s)", err.what()); m_log.err("Failed to reconfigure tray client, removing... (%s)", err.what());
remove_client(evt->window); remove_client(evt->window);
@ -933,7 +912,7 @@ void tray_manager::handle(const evt::resize_request& evt) {
if (m_activated && is_embedded(evt->window)) { if (m_activated && is_embedded(evt->window)) {
try { try {
m_log.trace("tray: Received resize_request for client %s", m_connection.id(evt->window)); m_log.trace("tray: Received resize_request for client %s", m_connection.id(evt->window));
find_client(evt->window)->configure_notify(calculate_client_x(evt->window), calculate_client_y()); find_client(evt->window)->configure_notify();
} catch (const xpp::x::error::window& err) { } catch (const xpp::x::error::window& err) {
m_log.err("Failed to reconfigure tray client, removing... (%s)", err.what()); m_log.err("Failed to reconfigure tray client, removing... (%s)", err.what());
remove_client(evt->window); remove_client(evt->window);