diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 8a717600..4ce4b097 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2375,6 +2375,18 @@ void CCompositor::updateWorkspaceWindowDecos(const int& id) { } } +void CCompositor::updateWorkspaceSpecialRenderData(const int& id) { + const auto PWORKSPACE = getWorkspaceByID(id); + const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{}; + + for (auto& w : m_vWindows) { + if (w->workspaceID() != id) + continue; + + w->updateSpecialRenderData(WORKSPACERULE); + } +} + void CCompositor::scheduleFrameForMonitor(CMonitor* pMonitor) { if ((m_sWLRSession && !m_sWLRSession->active) || !m_bSessionActive) return; diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 11be7c81..f2d39490 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -150,6 +150,7 @@ class CCompositor { PHLWORKSPACE getWorkspaceByString(const std::string&); void sanityCheckWorkspaces(); void updateWorkspaceWindowDecos(const int&); + void updateWorkspaceSpecialRenderData(const int&); int getWindowsOnWorkspace(const int& id, std::optional onlyTiled = {}); int getGroupsOnWorkspace(const int& id, std::optional onlyTiled = {}); CWindow* getUrgentWindow(); diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp index 3ce30b71..606d667b 100644 --- a/src/config/ConfigManager.cpp +++ b/src/config/ConfigManager.cpp @@ -792,12 +792,11 @@ void CConfigManager::postConfigReload(const Hyprlang::CParseResult& result) { refreshGroupBarGradients(); // Updates dynamic window and workspace rules - for (auto& w : g_pCompositor->m_vWindows) { - if (!w->m_bIsMapped) + for (auto& w : g_pCompositor->m_vWorkspaces) { + if (w->inert()) continue; - - w->updateDynamicRules(); - w->updateSpecialRenderData(); + g_pCompositor->updateWorkspaceWindows(w->m_iID); + g_pCompositor->updateWorkspaceSpecialRenderData(w->m_iID); } // Update window border colors diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 28c85add..8d6a4fa4 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -390,7 +390,11 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) { setAnimationsToMove(); - updateSpecialRenderData(); + g_pCompositor->updateWorkspaceWindows(OLDWORKSPACE->m_iID); + g_pCompositor->updateWorkspaceSpecialRenderData(OLDWORKSPACE->m_iID); + g_pCompositor->updateWorkspaceWindows(workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); if (valid(pWorkspace)) { g_pEventManager->postEvent(SHyprIPCEvent{"movewindow", std::format("{:x},{}", (uintptr_t)this, pWorkspace->m_szName)}); @@ -479,6 +483,8 @@ void CWindow::onUnmap() { PMONITOR->solitaryClient = nullptr; g_pCompositor->updateWorkspaceWindows(workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); if (m_bIsX11) return; @@ -845,6 +851,8 @@ void CWindow::createGroup() { addWindowDeco(std::make_unique(this)); g_pLayoutManager->getCurrentLayout()->recalculateWindow(this); + g_pCompositor->updateWorkspaceWindows(workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(workspaceID()); g_pCompositor->updateAllWindowsAnimatedDecorationValues(); } } @@ -858,6 +866,9 @@ void CWindow::destroyGroup() { m_sGroupData.pNextWindow = nullptr; m_sGroupData.head = false; updateWindowDecos(); + g_pCompositor->updateWorkspaceWindows(workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); return; } @@ -884,6 +895,10 @@ void CWindow::destroyGroup() { w->updateWindowDecos(); } g_pKeybindManager->m_bGroupsLocked = GROUPSLOCKEDPREV; + + g_pCompositor->updateWorkspaceWindows(workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); } CWindow* CWindow::getGroupHead() { @@ -1100,20 +1115,23 @@ float CWindow::rounding() { } void CWindow::updateSpecialRenderData() { - const auto PWORKSPACE = m_pWorkspace; - const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{}; - bool border = true; + const auto PWORKSPACE = m_pWorkspace; + const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{}; + updateSpecialRenderData(WORKSPACERULE); +} +void CWindow::updateSpecialRenderData(const SWorkspaceRule& workspaceRule) { static auto PNOBORDERONFLOATING = CConfigValue("general:no_border_on_floating"); + bool border = true; if (m_bIsFloating && *PNOBORDERONFLOATING == 1) border = false; - m_sSpecialRenderData.border = WORKSPACERULE.border.value_or(border); - m_sSpecialRenderData.borderSize = WORKSPACERULE.borderSize.value_or(-1); - m_sSpecialRenderData.decorate = WORKSPACERULE.decorate.value_or(true); - m_sSpecialRenderData.rounding = WORKSPACERULE.rounding.value_or(true); - m_sSpecialRenderData.shadow = WORKSPACERULE.shadow.value_or(true); + m_sSpecialRenderData.border = workspaceRule.border.value_or(border); + m_sSpecialRenderData.borderSize = workspaceRule.borderSize.value_or(-1); + m_sSpecialRenderData.decorate = workspaceRule.decorate.value_or(true); + m_sSpecialRenderData.rounding = workspaceRule.rounding.value_or(true); + m_sSpecialRenderData.shadow = workspaceRule.shadow.value_or(true); } int CWindow::getRealBorderSize() { diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index 3001f74e..c94d1b86 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -5,6 +5,7 @@ #include "../helpers/AnimatedVariable.hpp" #include "../render/decorations/IHyprWindowDecoration.hpp" #include +#include "../config/ConfigManager.hpp" #include "../config/ConfigDataValues.hpp" #include "../helpers/Vector2D.hpp" #include "WLSurface.hpp" @@ -408,6 +409,7 @@ class CWindow { int getRealBorderSize(); void updateSpecialRenderData(); + void updateSpecialRenderData(const struct SWorkspaceRule&); void onBorderAngleAnimEnd(void* ptr); bool isInCurvedCorner(double x, double y); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index cca72ca8..63c0c95f 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -202,11 +202,17 @@ bool CKeybindManager::ensureMouseBindState() { return false; if (g_pInputManager->currentlyDraggedWindow) { + CWindow* lastDraggedWindow = g_pInputManager->currentlyDraggedWindow; + m_bIsMouseBindActive = false; g_pLayoutManager->getCurrentLayout()->onEndDragWindow(); g_pInputManager->currentlyDraggedWindow = nullptr; g_pInputManager->dragMode = MBIND_INVALID; + g_pCompositor->updateWorkspaceWindows(lastDraggedWindow->workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(lastDraggedWindow->workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); + return true; } @@ -857,19 +863,16 @@ static void toggleActiveFloatingCore(std::string args, std::optional float CWindow* curr = PCURRENT->m_sGroupData.pNextWindow; while (curr != PCURRENT) { curr->m_bIsFloating = PCURRENT->m_bIsFloating; - curr->updateDynamicRules(); - curr->updateSpecialRenderData(); - curr = curr->m_sGroupData.pNextWindow; + curr = curr->m_sGroupData.pNextWindow; } - - g_pCompositor->updateWorkspaceWindows(PWINDOW->workspaceID()); } else { PWINDOW->m_bIsFloating = !PWINDOW->m_bIsFloating; - g_pCompositor->updateWorkspaceWindows(PWINDOW->workspaceID()); - g_pLayoutManager->getCurrentLayout()->changeWindowFloatingMode(PWINDOW); } + g_pCompositor->updateWorkspaceWindows(PWINDOW->workspaceID()); + g_pCompositor->updateWorkspaceSpecialRenderData(PWINDOW->workspaceID()); + g_pCompositor->updateAllWindowsAnimatedDecorationValues(); } void CKeybindManager::toggleActiveFloating(std::string args) { @@ -1282,8 +1285,6 @@ void CKeybindManager::toggleGroup(std::string args) { PWINDOW->createGroup(); else PWINDOW->destroyGroup(); - - g_pCompositor->updateAllWindowsAnimatedDecorationValues(); } void CKeybindManager::changeGroupActive(std::string args) {