From 16a9c16d9f99bd8be9f1bb15442b001fdf2ea759 Mon Sep 17 00:00:00 2001 From: thejch <66577496+thejch@users.noreply.github.com> Date: Sat, 30 Mar 2024 18:14:26 -0700 Subject: renderer/animations: Fix various inaccurate damage tracking issues and offsets (#5297) --- src/desktop/Window.cpp | 38 ++++++++++++++++++++++++++++++++++++++ src/desktop/Window.hpp | 4 ++++ src/desktop/Workspace.cpp | 10 ++++++++++ 3 files changed, 52 insertions(+) (limited to 'src/desktop') diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp index 1336456a..891fd652 100644 --- a/src/desktop/Window.cpp +++ b/src/desktop/Window.cpp @@ -1165,6 +1165,44 @@ void CWindow::setAnimationsToMove() { m_bAnimatingIn = false; } +void CWindow::onWorkspaceAnimUpdate() { + // clip box for animated offsets + if (!m_bIsFloating || m_bPinned || m_bIsFullscreen) { + m_vFloatingOffset = Vector2D(0, 0); + return; + } + + Vector2D offset; + const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(m_iWorkspaceID); + if (!PWORKSPACE) + return; + + const auto PWSMON = g_pCompositor->getMonitorFromID(PWORKSPACE->m_iMonitorID); + if (!PWSMON) + return; + + const auto WINBB = getFullWindowBoundingBox(); + if (PWORKSPACE->m_vRenderOffset.value().x != 0) { + const auto PROGRESS = PWORKSPACE->m_vRenderOffset.value().x / PWSMON->vecSize.x; + + if (WINBB.x < PWSMON->vecPosition.x) + offset.x += (PWSMON->vecPosition.x - WINBB.x) * PROGRESS; + + if (WINBB.x + WINBB.width > PWSMON->vecPosition.x + PWSMON->vecSize.x) + offset.x += (WINBB.x + WINBB.width - PWSMON->vecPosition.x - PWSMON->vecSize.x) * PROGRESS; + } else if (PWORKSPACE->m_vRenderOffset.value().y != 0) { + const auto PROGRESS = PWORKSPACE->m_vRenderOffset.value().y / PWSMON->vecSize.y; + + if (WINBB.y < PWSMON->vecPosition.y) + offset.y += (PWSMON->vecPosition.y - WINBB.y) * PROGRESS; + + if (WINBB.y + WINBB.height > PWSMON->vecPosition.y + PWSMON->vecSize.y) + offset.y += (WINBB.y + WINBB.height - PWSMON->vecPosition.y - PWSMON->vecSize.y) * PROGRESS; + } + + m_vFloatingOffset = offset; +} + int CWindow::popupsCount() { if (m_bIsX11) return 1; diff --git a/src/desktop/Window.hpp b/src/desktop/Window.hpp index d8b4012d..bc1820a0 100644 --- a/src/desktop/Window.hpp +++ b/src/desktop/Window.hpp @@ -237,6 +237,9 @@ class CWindow { Vector2D m_vLastFloatingSize; Vector2D m_vLastFloatingPosition; + // for floating window offset in workspace animations + Vector2D m_vFloatingOffset = Vector2D(0, 0); + // this is used for pseudotiling bool m_bIsPseudotiled = false; Vector2D m_vPseudoSize = Vector2D(0, 0); @@ -421,6 +424,7 @@ class CWindow { void updateGroupOutputs(); void switchWithWindowInGroup(CWindow* pWindow); void setAnimationsToMove(); + void onWorkspaceAnimUpdate(); private: // For hidden windows and stuff diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp index 05843b59..a0c14bba 100644 --- a/src/desktop/Workspace.cpp +++ b/src/desktop/Workspace.cpp @@ -49,6 +49,16 @@ void CWorkspace::startAnim(bool in, bool left, bool instant) { const auto ANIMSTYLE = m_fAlpha.m_pConfig->pValues->internalStyle; static auto PWORKSPACEGAP = CConfigValue("general:gaps_workspaces"); + // set floating windows offset callbacks + m_vRenderOffset.setUpdateCallback([&](void*) { + for (auto& w : g_pCompositor->m_vWindows) { + if (!g_pCompositor->windowValidMapped(w.get()) || w->m_iWorkspaceID != m_iID) + continue; + + w->onWorkspaceAnimUpdate(); + }; + }); + if (ANIMSTYLE.starts_with("slidefade")) { const auto PMONITOR = g_pCompositor->getMonitorFromID(m_iMonitorID); float movePerc = 100.f; -- cgit v1.2.3