animations: Fix animation issue in focusworkspaceoncurrentmonitor (#5202)

* dont render when workspace offset

* add guard

* can remove useless code now if workspace offset is not taken into account

* clang-format

* when special workspace is moved, set anim to move

* add offset back

* make it a configurable option because some folks apparently can't align their monitors correctly and may not want this feature😔

* remove config option
This commit is contained in:
thejch 2024-03-23 15:14:50 -07:00 committed by GitHub
parent 295128ab2a
commit c7fbea3368
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 11 additions and 8 deletions

View file

@ -667,6 +667,7 @@ void CMonitor::setSpecialWorkspace(CWorkspace* const pWorkspace) {
if (w->m_iWorkspaceID == pWorkspace->m_iID) { if (w->m_iWorkspaceID == pWorkspace->m_iID) {
w->m_iMonitorID = ID; w->m_iMonitorID = ID;
w->updateSurfaceScaleTransformDetails(); w->updateSurfaceScaleTransformDetails();
w->setAnimationsToMove();
const auto MIDDLE = w->middle(); const auto MIDDLE = w->middle();
if (w->m_bIsFloating && !VECINRECT(MIDDLE, vecPosition.x, vecPosition.y, vecPosition.x + vecSize.x, vecPosition.y + vecSize.y) && w->m_iX11Type != 2) { if (w->m_bIsFloating && !VECINRECT(MIDDLE, vecPosition.x, vecPosition.y, vecPosition.x + vecSize.x, vecPosition.y + vecSize.y) && w->m_iX11Type != 2) {

View file

@ -109,14 +109,13 @@ void CAnimationManager::tick() {
g_pHyprRenderer->damageWindow(w.get()); g_pHyprRenderer->damageWindow(w.get());
} }
// if a workspace window is on any monitor, damage it // if a special workspace window is on any monitor, damage it
for (auto& w : g_pCompositor->m_vWindows) { for (auto& w : g_pCompositor->m_vWindows) {
for (auto& m : g_pCompositor->m_vMonitors) { for (auto& m : g_pCompositor->m_vMonitors) {
if (w->m_iWorkspaceID == PWORKSPACE->m_iID && g_pCompositor->windowValidMapped(w.get()) && g_pHyprRenderer->shouldRenderWindow(w.get(), m.get(), PWORKSPACE)) { if (w->m_iWorkspaceID == PWORKSPACE->m_iID && PWORKSPACE->m_bIsSpecialWorkspace && g_pCompositor->windowValidMapped(w.get()) &&
g_pHyprRenderer->shouldRenderWindow(w.get(), m.get(), PWORKSPACE)) {
CBox bb = w->getFullWindowBoundingBox(); CBox bb = w->getFullWindowBoundingBox();
bb.translate(PWORKSPACE->m_vRenderOffset.value()); bb.translate(PWORKSPACE->m_vRenderOffset.value());
if (PWORKSPACE->m_bIsSpecialWorkspace)
bb.scaleFromCenter(1.1); // for some reason special ws windows getting border artifacts if you close it too quickly...
bb.intersection({m->vecPosition, m->vecSize}); bb.intersection({m->vecPosition, m->vecSize});
g_pHyprRenderer->damageBox(&bb); g_pHyprRenderer->damageBox(&bb);
} }
@ -197,7 +196,8 @@ void CAnimationManager::tick() {
PWINDOW->updateWindowDecos(); PWINDOW->updateWindowDecos();
auto bb = PWINDOW->getFullWindowBoundingBox(); auto bb = PWINDOW->getFullWindowBoundingBox();
const auto PWINDOWWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID); const auto PWINDOWWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
bb.translate(PWINDOWWORKSPACE->m_vRenderOffset.value()); if (PWINDOWWORKSPACE)
bb.translate(PWINDOWWORKSPACE->m_vRenderOffset.value());
g_pHyprRenderer->damageBox(&bb); g_pHyprRenderer->damageBox(&bb);
} else if (PWORKSPACE) { } else if (PWORKSPACE) {
for (auto& w : g_pCompositor->m_vWindows) { for (auto& w : g_pCompositor->m_vWindows) {
@ -245,7 +245,7 @@ void CAnimationManager::tick() {
BORDERSIZE + ROUNDINGSIZE); // bottom BORDERSIZE + ROUNDINGSIZE); // bottom
// damage for new box // damage for new box
CBox WLRBOXNEW = {PWINDOW->m_vRealPosition.value(), PWINDOW->m_vRealSize.value()}; CBox WLRBOXNEW = PWINDOW->getFullWindowBoundingBox();
const auto PWINDOWWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID); const auto PWINDOWWORKSPACE = g_pCompositor->getWorkspaceByID(PWINDOW->m_iWorkspaceID);
if (PWINDOWWORKSPACE) if (PWINDOWWORKSPACE)
WLRBOXNEW.translate(PWINDOWWORKSPACE->m_vRenderOffset.value()); WLRBOXNEW.translate(PWINDOWWORKSPACE->m_vRenderOffset.value());

View file

@ -217,7 +217,7 @@ bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor, CWo
} }
} }
if (pWindow->m_iWorkspaceID == pWorkspace->m_iID) if (pWindow->m_iWorkspaceID == pWorkspace->m_iID && pWorkspace->m_iMonitorID == pMonitor->ID)
return true; return true;
// if not, check if it maybe is active on a different monitor. // if not, check if it maybe is active on a different monitor.
@ -228,9 +228,11 @@ bool CHyprRenderer::shouldRenderWindow(CWindow* pWindow, CMonitor* pMonitor, CWo
return true; return true;
if (pWindow->m_vRealPosition.isBeingAnimated()) { if (pWindow->m_vRealPosition.isBeingAnimated()) {
if (PWINDOWWORKSPACE && !PWINDOWWORKSPACE->m_bIsSpecialWorkspace && PWINDOWWORKSPACE->m_vRenderOffset.isBeingAnimated())
return false;
// render window if window and monitor intersect // render window if window and monitor intersect
// (when moving out of or through a monitor) // (when moving out of or through a monitor)
CBox windowBox = {pWindow->m_vRealPosition.value(), pWindow->m_vRealSize.value()}; CBox windowBox = pWindow->getFullWindowBoundingBox();
const CBox monitorBox = {pMonitor->vecPosition, pMonitor->vecSize}; const CBox monitorBox = {pMonitor->vecPosition, pMonitor->vecSize};
if (!windowBox.intersection(monitorBox).empty()) if (!windowBox.intersection(monitorBox).empty())
return true; return true;