fix(tray): Support clients with different depths
XCB_BACK_PIXMAP_PARENT_RELATIVE requires that the client has the same depth as the tray window. There was an issue with dropbox having a depth of 32 and the tray window having a depth of 24 that caused the configuration of the icon to fail. It would then be displayed outside of the bar because the catch block was not hit (different exception). We now just don't configure XCB_CW_BACK_PIXMAP. This seems to work and is also what stalonetray does. This does not fix the issue with dropbox having an arbitrary background. Fixes #1679 Fixes #2430
This commit is contained in:
parent
1ddd8bd1e1
commit
ad987098ff
@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Build
|
### Build
|
||||||
- Support building documentation on sphinx 4.0 ([`#2424`](https://github.com/polybar/polybar/issues/2424))
|
- Support building documentation on sphinx 4.0 ([`#2424`](https://github.com/polybar/polybar/issues/2424))
|
||||||
|
### Fixed
|
||||||
|
- Tray icons sometimes appears outside of bar ([`#2430`](https://github.com/polybar/polybar/issues/2430), [`#1679`](https://github.com/polybar/polybar/issues/1679))
|
||||||
|
|
||||||
## [3.5.5] - 2021-03-01
|
## [3.5.5] - 2021-03-01
|
||||||
### Build
|
### Build
|
||||||
|
@ -726,7 +726,7 @@ void tray_manager::track_selection_owner(xcb_window_t owner) {
|
|||||||
* Process client docking request
|
* Process client docking request
|
||||||
*/
|
*/
|
||||||
void tray_manager::process_docking_request(xcb_window_t win) {
|
void tray_manager::process_docking_request(xcb_window_t win) {
|
||||||
m_log.info("Processing docking request from %s", m_connection.id(win));
|
m_log.info("Processing docking request from '%s' (%s)", ewmh_util::get_wm_name(win), m_connection.id(win));
|
||||||
|
|
||||||
m_clients.emplace_back(factory_util::shared<tray_client>(m_connection, win, m_opts.width, m_opts.height));
|
m_clients.emplace_back(factory_util::shared<tray_client>(m_connection, win, m_opts.width, m_opts.height));
|
||||||
auto& client = m_clients.back();
|
auto& client = m_clients.back();
|
||||||
@ -734,18 +734,15 @@ void tray_manager::process_docking_request(xcb_window_t win) {
|
|||||||
try {
|
try {
|
||||||
m_log.trace("tray: Get client _XEMBED_INFO");
|
m_log.trace("tray: Get client _XEMBED_INFO");
|
||||||
xembed::query(m_connection, win, client->xembed());
|
xembed::query(m_connection, win, client->xembed());
|
||||||
} catch (const application_error& err) {
|
} catch (const std::exception& err) {
|
||||||
m_log.err(err.what());
|
|
||||||
} catch (const xpp::x::error::window& err) {
|
|
||||||
m_log.err("Failed to query _XEMBED_INFO, removing client... (%s)", err.what());
|
m_log.err("Failed to query _XEMBED_INFO, removing client... (%s)", err.what());
|
||||||
remove_client(win, true);
|
remove_client(win, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const unsigned int mask{XCB_CW_BACK_PIXMAP | XCB_CW_EVENT_MASK};
|
const unsigned int mask = XCB_CW_EVENT_MASK;
|
||||||
const unsigned int values[]{
|
const unsigned int values[]{XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY};
|
||||||
XCB_BACK_PIXMAP_PARENT_RELATIVE, XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY};
|
|
||||||
|
|
||||||
m_log.trace("tray: Update client window");
|
m_log.trace("tray: Update client window");
|
||||||
m_connection.change_window_attributes_checked(client->window(), mask, values);
|
m_connection.change_window_attributes_checked(client->window(), mask, values);
|
||||||
@ -767,8 +764,9 @@ void tray_manager::process_docking_request(xcb_window_t win) {
|
|||||||
m_log.trace("tray: Map client");
|
m_log.trace("tray: Map client");
|
||||||
m_connection.map_window_checked(client->window());
|
m_connection.map_window_checked(client->window());
|
||||||
}
|
}
|
||||||
} catch (const xpp::x::error::window& err) {
|
|
||||||
m_log.err("Failed to setup tray client, removing... (%s)", err.what());
|
} catch (const std::exception& err) {
|
||||||
|
m_log.err("Failed to setup tray client removing... (%s)", err.what());
|
||||||
remove_client(win, false);
|
remove_client(win, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user