Move client configuration into tray_client
This commit is contained in:
parent
48d8187f90
commit
81d1f74b7b
@ -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;
|
||||||
|
@ -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*>(¬ify));
|
m_connection.send_event_checked(false, client(), mask, reinterpret_cast<const char*>(¬ify));
|
||||||
}
|
}
|
||||||
|
|
||||||
POLYBAR_NS_END
|
POLYBAR_NS_END
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user