diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 2dc798e47..ea1ab2ddf 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1938,11 +1938,13 @@ void CCompositor::updateWindowAnimatedDecorationValues(PHLWINDOW pWindow) { auto* const GROUPINACTIVELOCKEDCOL = sc((PGROUPINACTIVELOCKEDCOL.ptr())->getData()); auto setBorderColor = [&](CGradientValueData grad) -> void { - if (grad == pWindow->m_realBorderColor) + if (pWindow->isHidden() || grad == pWindow->m_realBorderColor) return; - pWindow->m_realBorderColorPrevious = pWindow->m_realBorderColor; - pWindow->m_realBorderColor = grad; + if (pWindow->m_borderFadeAnimationProgress->value() > 0.5f) // should interpolate current and previous border color, but that isn't straightforward + pWindow->m_realBorderColorPrevious = pWindow->m_realBorderColor; + + pWindow->m_realBorderColor = grad; pWindow->m_borderFadeAnimationProgress->setValueAndWarp(0.f); *pWindow->m_borderFadeAnimationProgress = 1.f; }; @@ -2339,11 +2341,11 @@ void CCompositor::changeWindowFullscreenModeClient(const PHLWINDOW PWINDOW, cons sc(ON ? sc(PWINDOW->m_fullscreenState.client) | sc(MODE) : (sc(PWINDOW->m_fullscreenState.client) & sc(~MODE)))); } -void CCompositor::setWindowFullscreenInternal(const PHLWINDOW PWINDOW, const eFullscreenMode MODE) { +void CCompositor::setWindowFullscreenInternal(const PHLWINDOW PWINDOW, const eFullscreenMode MODE, const bool recalculate) { if (PWINDOW->m_windowData.syncFullscreen.valueOrDefault()) - setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = MODE, .client = MODE}); + setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = MODE, .client = MODE}, recalculate); else - setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = MODE, .client = PWINDOW->m_fullscreenState.client}); + setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = MODE, .client = PWINDOW->m_fullscreenState.client}, recalculate); } void CCompositor::setWindowFullscreenClient(const PHLWINDOW PWINDOW, const eFullscreenMode MODE) { @@ -2353,7 +2355,7 @@ void CCompositor::setWindowFullscreenClient(const PHLWINDOW PWINDOW, const eFull setWindowFullscreenState(PWINDOW, SFullscreenState{.internal = PWINDOW->m_fullscreenState.internal, .client = MODE}); } -void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, SFullscreenState state) { +void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, SFullscreenState state, const bool recalculate) { static auto PDIRECTSCANOUT = CConfigValue("render:direct_scanout"); static auto PALLOWPINFULLSCREEN = CConfigValue("binds:allow_pin_fullscreen"); @@ -2378,7 +2380,7 @@ void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, SFullscreenS } if (PWORKSPACE->m_hasFullscreenWindow && !PWINDOW->isFullscreen()) - setWindowFullscreenInternal(PWORKSPACE->getFullscreenWindow(), FSMODE_NONE); + setWindowFullscreenInternal(PWORKSPACE->getFullscreenWindow(), FSMODE_NONE, false); const bool CHANGEINTERNAL = !PWINDOW->m_pinned && CURRENT_EFFECTIVE_MODE != EFFECTIVE_MODE; @@ -2395,9 +2397,11 @@ void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, SFullscreenS g_pXWaylandManager->setWindowFullscreen(PWINDOW, state.client & FSMODE_FULLSCREEN); if (!CHANGEINTERNAL) { - PWINDOW->updateDynamicRules(); - updateWindowAnimatedDecorationValues(PWINDOW); - g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID()); + if (recalculate) { + PWINDOW->updateDynamicRules(); + updateWindowAnimatedDecorationValues(PWINDOW); + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID()); + } return; } @@ -2410,9 +2414,11 @@ void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, SFullscreenS g_pEventManager->postEvent(SHyprIPCEvent{.event = "fullscreen", .data = std::to_string(sc(EFFECTIVE_MODE) != FSMODE_NONE)}); EMIT_HOOK_EVENT("fullscreen", PWINDOW); - PWINDOW->updateDynamicRules(); - updateWindowAnimatedDecorationValues(PWINDOW); - g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID()); + if (recalculate) { + PWINDOW->updateDynamicRules(); + updateWindowAnimatedDecorationValues(PWINDOW); + g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID()); + } // make all windows on the same workspace under the fullscreen window for (auto const& w : m_windows) { diff --git a/src/Compositor.hpp b/src/Compositor.hpp index bf6401e51..a324532c1 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -135,9 +135,9 @@ class CCompositor { void swapActiveWorkspaces(PHLMONITOR, PHLMONITOR); PHLMONITOR getMonitorFromString(const std::string&); bool workspaceIDOutOfBounds(const WORKSPACEID&); - void setWindowFullscreenInternal(const PHLWINDOW PWINDOW, const eFullscreenMode MODE); + void setWindowFullscreenInternal(const PHLWINDOW PWINDOW, const eFullscreenMode MODE, const bool recalculate = true); void setWindowFullscreenClient(const PHLWINDOW PWINDOW, const eFullscreenMode MODE); - void setWindowFullscreenState(const PHLWINDOW PWINDOW, const SFullscreenState state); + void setWindowFullscreenState(const PHLWINDOW PWINDOW, const SFullscreenState state, const bool recalculate = true); void changeWindowFullscreenModeClient(const PHLWINDOW PWINDOW, const eFullscreenMode MODE, const bool ON); PHLWINDOW getX11Parent(PHLWINDOW); void scheduleFrameForMonitor(PHLMONITOR, Aquamarine::IOutput::scheduleFrameReason reason = Aquamarine::IOutput::AQ_SCHEDULE_CLIENT_UNKNOWN); diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 8671c0036..c86264132 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1071,6 +1071,7 @@ void CWindow::setGroupCurrent(PHLWINDOW pWindow) { const auto CURRENTISFOCUS = PCURRENT == g_pCompositor->m_lastWindow.lock(); + const auto PWINDOWALPHA = PCURRENT->m_alpha->value(); const auto PWINDOWSIZE = PCURRENT->m_realSize->value(); const auto PWINDOWPOS = PCURRENT->m_realPosition->value(); const auto PWINDOWSIZEGOAL = PCURRENT->m_realSize->goal(); @@ -1079,7 +1080,7 @@ void CWindow::setGroupCurrent(PHLWINDOW pWindow) { const auto PWINDOWLASTFLOATINGPOSITION = PCURRENT->m_lastFloatingPosition; if (FULLSCREEN) - g_pCompositor->setWindowFullscreenInternal(PCURRENT, FSMODE_NONE); + g_pCompositor->setWindowFullscreenInternal(PCURRENT, FSMODE_NONE, false); PCURRENT->setHidden(true); pWindow->setHidden(false); // can remove m_pLastWindow @@ -1094,6 +1095,7 @@ void CWindow::setGroupCurrent(PHLWINDOW pWindow) { pWindow->m_realPosition->setValue(PWINDOWPOS); pWindow->m_realSize->setValue(PWINDOWSIZE); + pWindow->m_alpha->setValue(PWINDOWALPHA); if (FULLSCREEN) g_pCompositor->setWindowFullscreenInternal(pWindow, MODE);