diff --git a/src/Compositor.cpp b/src/Compositor.cpp index e4243a4e..6d892127 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -193,7 +193,7 @@ void CCompositor::initServer() { m_sWLROutputPowerMgr = wlr_output_power_manager_v1_create(m_sWLDisplay); - m_sWLRXDGShell = wlr_xdg_shell_create(m_sWLDisplay, 5); + m_sWLRXDGShell = wlr_xdg_shell_create(m_sWLDisplay, 6); m_sWLRCursor = wlr_cursor_create(); wlr_cursor_attach_output_layout(m_sWLRCursor, m_sWLROutputLayout); @@ -2781,3 +2781,12 @@ void CCompositor::setPreferredScaleForSurface(wlr_surface* pSurface, double scal void CCompositor::setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform) { wlr_surface_set_preferred_buffer_transform(pSurface, transform); } + +void CCompositor::updateSuspendedStates() { + for (auto& w : g_pCompositor->m_vWindows) { + if (!w->m_bIsMapped) + continue; + + w->setSuspended(w->isHidden() || !g_pHyprRenderer->shouldRenderWindow(w.get())); + } +} diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 8703f3f1..7bedc806 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -208,6 +208,7 @@ class CCompositor { void leaveUnsafeState(); void setPreferredScaleForSurface(wlr_surface* pSurface, double scale); void setPreferredTransformForSurface(wlr_surface* pSurface, wl_output_transform transform); + void updateSuspendedStates(); std::string explicitConfigPath; diff --git a/src/Window.cpp b/src/Window.cpp index 1c4a326d..9df8ef69 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -511,6 +511,8 @@ void CWindow::setHidden(bool hidden) { if (hidden && g_pCompositor->m_pLastWindow == this) { g_pCompositor->m_pLastWindow = nullptr; } + + setSuspended(hidden); } bool CWindow::isHidden() { @@ -1007,3 +1009,13 @@ bool CWindow::shouldSendFullscreenState() { const auto MODE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID)->m_efFullscreenMode; return m_bFakeFullscreenState || (m_bIsFullscreen && (MODE == FULLSCREEN_FULL)); } + +void CWindow::setSuspended(bool suspend) { + if (suspend == m_bSuspended) + return; + + if (m_bIsX11) + return; + + wlr_xdg_toplevel_set_suspended(m_uSurface.xdg->toplevel, suspend); +} diff --git a/src/Window.hpp b/src/Window.hpp index 8d5f22e5..bef752fb 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -367,6 +367,7 @@ class CWindow { float rounding(); bool canBeTorn(); bool shouldSendFullscreenState(); + void setSuspended(bool suspend); int getRealBorderSize(); void updateSpecialRenderData(); @@ -392,7 +393,8 @@ class CWindow { private: // For hidden windows and stuff - bool m_bHidden = false; + bool m_bHidden = false; + bool m_bSuspended = false; }; /** diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index c112d07d..ca1318cc 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -565,6 +565,8 @@ void CMonitor::changeWorkspace(CWorkspace* const pWorkspace, bool internal, bool g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace); g_pConfigManager->ensureVRR(this); + + g_pCompositor->updateSuspendedStates(); } void CMonitor::changeWorkspace(const int& id, bool internal) { @@ -590,6 +592,8 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) { else g_pInputManager->refocus(); + g_pCompositor->updateSuspendedStates(); + return; } @@ -631,6 +635,8 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) { g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", pWorkspace->m_szName + "," + szName}); g_pHyprRenderer->damageMonitor(this); + + g_pCompositor->updateSuspendedStates(); } void CMonitor::setSpecialWorkspace(const int& id) {