diff --git a/xembed-sni-proxy/fdoselectionmanager.cpp b/xembed-sni-proxy/fdoselectionmanager.cpp --- a/xembed-sni-proxy/fdoselectionmanager.cpp +++ b/xembed-sni-proxy/fdoselectionmanager.cpp @@ -22,9 +22,10 @@ #include "debug.h" #include +#include +#include #include #include - #include #include @@ -187,6 +188,17 @@ qCDebug(SNIPROXY) << "Manager selection claimed"; setSystemTrayVisual(); + + // send all container windows to background on KWin restart + QDBusServiceWatcher *watcher = new QDBusServiceWatcher(QStringLiteral("org.kde.KWin"), QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForRegistration, this); + connect(watcher, &QDBusServiceWatcher::serviceRegistered, this, [=](const QString &) { + // some delay is necesary + QTimer::singleShot(100, this, [=]() { + for (auto sniproxy : m_proxies) { + sniproxy->stackContainerWindow(XCB_STACK_MODE_BELOW); + } + }); + }); } void FdoSelectionManager::onFailedToClaimOwnership() diff --git a/xembed-sni-proxy/sniproxy.h b/xembed-sni-proxy/sniproxy.h --- a/xembed-sni-proxy/sniproxy.h +++ b/xembed-sni-proxy/sniproxy.h @@ -49,6 +49,7 @@ ~SNIProxy() override; void update(); + void stackContainerWindow(const uint32_t stackMode) const; /** * @return the category of the application associated to this item diff --git a/xembed-sni-proxy/sniproxy.cpp b/xembed-sni-proxy/sniproxy.cpp --- a/xembed-sni-proxy/sniproxy.cpp +++ b/xembed-sni-proxy/sniproxy.cpp @@ -122,8 +122,7 @@ */ #ifndef VISUAL_DEBUG - const uint32_t stackBelowData[] = {XCB_STACK_MODE_BELOW}; - xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackBelowData); + stackContainerWindow(XCB_STACK_MODE_BELOW); NETWinInfo wm(c, m_containerWid, screen->root, NET::Properties(), NET::Properties2()); wm.setOpacity(0); @@ -214,6 +213,13 @@ emit NewToolTip(); } +void SNIProxy::stackContainerWindow(const uint32_t stackMode) const +{ + auto c = QX11Info::connection(); + const uint32_t stackData[] = {stackMode}; + xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackData); +} + QSize SNIProxy::calculateClientWindowSize() const { auto c = QX11Info::connection(); @@ -538,8 +544,7 @@ xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, configVals); //pull window up - const uint32_t stackAboveData[] = {XCB_STACK_MODE_ABOVE}; - xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackAboveData); + stackContainerWindow(XCB_STACK_MODE_ABOVE); //mouse down if (m_injectMode == Direct) { @@ -589,7 +594,6 @@ } #ifndef VISUAL_DEBUG - const uint32_t stackBelowData[] = {XCB_STACK_MODE_BELOW}; - xcb_configure_window(c, m_containerWid, XCB_CONFIG_WINDOW_STACK_MODE, stackBelowData); + stackContainerWindow(XCB_STACK_MODE_BELOW); #endif }