From f8e0b0b448b8b68f65ee1c3eebdd4eb3e3382138 Mon Sep 17 00:00:00 2001 From: vaxerski <43317083+vaxerski@users.noreply.github.com> Date: Tue, 5 Apr 2022 19:28:10 +0200 Subject: [PATCH] fadein and prep for fadeout --- src/Compositor.cpp | 13 ++++++++++++- src/Compositor.hpp | 2 ++ src/Window.hpp | 4 ++++ src/events/Monitors.cpp | 1 + src/events/Windows.cpp | 4 ++++ src/helpers/WLClasses.hpp | 3 +++ src/layout/DwindleLayout.cpp | 4 ++++ src/managers/AnimationManager.cpp | 27 ++++++++++++++++++++++++++- src/managers/XWaylandManager.cpp | 3 --- src/render/Renderer.cpp | 10 ++++++---- src/render/Renderer.hpp | 2 +- 11 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index bf36bf89..7fdd65bc 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -230,7 +230,7 @@ SMonitor* CCompositor::getMonitorFromVector(const Vector2D& point) { } void CCompositor::removeWindowFromVectorSafe(CWindow* pWindow) { - if (windowExists(pWindow)) + if (windowExists(pWindow) && !pWindow->m_bFadingOut) m_lWindows.remove(*pWindow); } @@ -552,4 +552,15 @@ void CCompositor::moveWindowToTop(CWindow* pWindow) { break; } } +} + +void CCompositor::cleanupWindows() { + for (auto& w : m_lWindowsFadingOut) { + if (!w->m_bFadingOut || w->m_fAlpha == 0.f) { + m_lWindows.remove(*w); + m_lWindowsFadingOut.remove(w); + Debug::log(LOG, "Cleanup: cleaned up a window"); + return; + } + } } \ No newline at end of file diff --git a/src/Compositor.hpp b/src/Compositor.hpp index 1c9a691f..f56fcec5 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -58,6 +58,7 @@ public: std::list m_lXDGPopups; std::list m_lWorkspaces; std::list m_lSubsurfaces; + std::list m_lWindowsFadingOut; void startCompositor(); @@ -97,6 +98,7 @@ public: bool doesSeatAcceptInput(wlr_surface*); bool isWindowActive(CWindow*); void moveWindowToTop(CWindow*); + void cleanupWindows(); private: void initAllSignals(); diff --git a/src/Window.hpp b/src/Window.hpp index 2911cfea..0d8653db 100644 --- a/src/Window.hpp +++ b/src/Window.hpp @@ -68,6 +68,10 @@ public: // Animated border CColor m_cRealBorderColor = CColor(0,0,0,0); + // Fade in-out + float m_fAlpha = 0.f; + bool m_bFadingOut = false; + // For the list lookup bool operator==(const CWindow& rhs) { diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp index 118b54a6..0c34005f 100644 --- a/src/events/Monitors.cpp +++ b/src/events/Monitors.cpp @@ -104,6 +104,7 @@ void Events::listener_monitorFrame(void* owner, void* data) { if (PMONITOR->ID == 0) { g_pCompositor->sanityCheckWorkspaces(); g_pAnimationManager->tick(); + g_pCompositor->cleanupWindows(); } timespec now; diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp index 7b3acd8a..3a00041d 100644 --- a/src/events/Windows.cpp +++ b/src/events/Windows.cpp @@ -191,6 +191,10 @@ void Events::listener_unmapWindow(void* owner, void* data) { SubsurfaceTree::destroySurfaceTree(PWINDOW->m_pSurfaceTree); PWINDOW->m_pSurfaceTree = nullptr; + + PWINDOW->m_bFadingOut = true; + + g_pCompositor->m_lWindowsFadingOut.push_back(PWINDOW); } void Events::listener_commitWindow(void* owner, void* data) { diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index e06a5515..295ec41f 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -42,6 +42,9 @@ struct SRenderData { // for rounding bool dontRound = true; + + // for fade + float fadeAlpha = 255.f; }; struct SKeyboard { diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp index 4e12fc49..23b76073 100644 --- a/src/layout/DwindleLayout.cpp +++ b/src/layout/DwindleLayout.cpp @@ -259,6 +259,10 @@ void CHyprDwindleLayout::onWindowRemoved(CWindow* pWindow) { m_lDwindleNodesData.remove(*PPARENT); m_lDwindleNodesData.remove(*PNODE); + + // jump back like it jumps in + pWindow->m_vEffectivePosition = pWindow->m_vEffectivePosition + ((pWindow->m_vEffectiveSize - Vector2D(5, 5)) * 0.5f); + pWindow->m_vEffectiveSize = Vector2D(5, 5); } void CHyprDwindleLayout::recalculateMonitor(const int& monid) { diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index c165b843..49ed7f44 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -10,18 +10,43 @@ void CAnimationManager::tick() { const bool WINDOWSENABLED = g_pConfigManager->getInt("animations:windows") && !animationsDisabled; const bool BORDERSENABLED = g_pConfigManager->getInt("animations:borders") && !animationsDisabled; - // const bool FADEENABLED = g_pConfigManager->getInt("animations:fadein") && !animationsDisabled; + const bool FADEENABLED = g_pConfigManager->getInt("animations:fadein") && !animationsDisabled; const float ANIMSPEED = g_pConfigManager->getFloat("animations:speed"); // Process speeds const float WINDOWSPEED = g_pConfigManager->getFloat("animations:windows_speed") == 0 ? ANIMSPEED : g_pConfigManager->getFloat("animations:windows_speed"); const float BORDERSPEED = g_pConfigManager->getFloat("animations:borders_speed") == 0 ? ANIMSPEED : g_pConfigManager->getFloat("animations:borders_speed"); + const float FADESPEED = g_pConfigManager->getFloat("animations:fadein_speed") == 0 ? ANIMSPEED : g_pConfigManager->getFloat("animations:fadein_speed"); const auto BORDERACTIVECOL = CColor(g_pConfigManager->getInt("general:col.active_border")); const auto BORDERINACTIVECOL = CColor(g_pConfigManager->getInt("general:col.inactive_border")); for (auto& w : g_pCompositor->m_lWindows) { + // process fadeinout + if (FADEENABLED) { + const auto GOALALPHA = w.m_bIsMapped ? 255.f : 0.f; + w.m_bFadingOut = false; + + if (!deltazero(w.m_fAlpha, GOALALPHA)) { + if (deltaSmallToFlip(w.m_fAlpha, GOALALPHA)) { + w.m_fAlpha = GOALALPHA; + } else { + if (w.m_fAlpha > GOALALPHA) + w.m_bFadingOut = true; + w.m_fAlpha = parabolic(w.m_fAlpha, GOALALPHA, FADESPEED); + } + } + + } else { + if (w.m_bIsMapped) + w.m_fAlpha = 255.f; + else { + w.m_fAlpha = 0.f; + w.m_bFadingOut = false; + } + } + // process the borders const auto& COLOR = g_pCompositor->isWindowActive(&w) ? BORDERACTIVECOL : BORDERINACTIVECOL; diff --git a/src/managers/XWaylandManager.cpp b/src/managers/XWaylandManager.cpp index 09ac6a72..4e39a043 100644 --- a/src/managers/XWaylandManager.cpp +++ b/src/managers/XWaylandManager.cpp @@ -114,9 +114,6 @@ void CHyprXWaylandManager::sendCloseWindow(CWindow* pWindow) { } else { wlr_xdg_toplevel_send_close(pWindow->m_uSurface.xdg->toplevel); } - - g_pLayoutManager->getCurrentLayout()->onWindowRemoved(pWindow); - g_pCompositor->removeWindowFromVectorSafe(pWindow); } void CHyprXWaylandManager::setWindowSize(CWindow* pWindow, const Vector2D& size) { diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index 20354331..d34d6897 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -31,7 +31,7 @@ void renderSurface(struct wlr_surface* surface, int x, int y, void* data) { float matrix[9]; wlr_matrix_project_box(matrix, &windowBox, TRANSFORM, 0, RDATA->output->transform_matrix); - g_pHyprOpenGL->renderTexture(TEXTURE, matrix, 255.f, RDATA->dontRound ? 0 : g_pConfigManager->getInt("decoration:rounding")); // TODO: fadeinout + g_pHyprOpenGL->renderTexture(TEXTURE, matrix, RDATA->fadeAlpha, RDATA->dontRound ? 0 : g_pConfigManager->getInt("decoration:rounding")); // TODO: fadeinout wlr_surface_send_frame_done(surface, RDATA->when); @@ -88,12 +88,13 @@ void CHyprRenderer::renderWindow(CWindow* pWindow, SMonitor* pMonitor, timespec* renderdata.w = pWindow->m_vRealSize.x; renderdata.h = pWindow->m_vRealSize.y; renderdata.dontRound = false; + renderdata.fadeAlpha = pWindow->m_fAlpha; wlr_surface_for_each_surface(g_pXWaylandManager->getWindowSurface(pWindow), renderSurface, &renderdata); // border if (decorate && !pWindow->m_bX11DoesntWantBorders) - drawBorderForWindow(pWindow, pMonitor); + drawBorderForWindow(pWindow, pMonitor, pWindow->m_fAlpha); if (pWindow->m_bIsX11) { if (pWindow->m_uSurface.xwayland->surface) { @@ -394,13 +395,14 @@ void CHyprRenderer::arrangeLayersForMonitor(const int& monitor) { Debug::log(LOG, "Monitor %s layers arranged: reserved: %f %f %f %f", PMONITOR->szName.c_str(), PMONITOR->vecReservedTopLeft.x, PMONITOR->vecReservedTopLeft.y, PMONITOR->vecReservedBottomRight.x, PMONITOR->vecReservedBottomRight.y); } -void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor) { +void CHyprRenderer::drawBorderForWindow(CWindow* pWindow, SMonitor* pMonitor, float alpha) { const auto BORDERSIZE = g_pConfigManager->getInt("general:border_size"); if (BORDERSIZE < 1) return; - const auto BORDERCOL = pWindow->m_cRealBorderColor; + auto BORDERCOL = pWindow->m_cRealBorderColor; + BORDERCOL.a *= (alpha / 255.f); Vector2D correctPos = pWindow->m_vRealPosition - pMonitor->vecPosition; Vector2D correctSize = pWindow->m_vRealSize; diff --git a/src/render/Renderer.hpp b/src/render/Renderer.hpp index fce5b357..cd0b5d01 100644 --- a/src/render/Renderer.hpp +++ b/src/render/Renderer.hpp @@ -16,7 +16,7 @@ public: private: void arrangeLayerArray(SMonitor*, const std::list&, bool, wlr_box*); - void drawBorderForWindow(CWindow*, SMonitor*); + void drawBorderForWindow(CWindow*, SMonitor*, float a = 255.f); void renderWorkspaceWithFullscreenWindow(SMonitor*, SWorkspace*, timespec*); void renderWindow(CWindow*, SMonitor*, timespec*, bool); void renderDragIcon(SMonitor*, timespec*);