From 7c809a3059388b8fdbb3de4aca68656c01162f4f Mon Sep 17 00:00:00 2001 From: vaxerski Date: Mon, 19 Sep 2022 10:23:13 +0100 Subject: [PATCH] fullscreen animation en-nice-ment --- src/Compositor.cpp | 8 +++++++- src/managers/input/InputManager.cpp | 6 +++--- src/managers/input/Swipe.cpp | 19 +++++++++++++++++++ src/render/Renderer.cpp | 9 ++++----- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index b8b76039..0d84bcdb 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -826,7 +826,7 @@ CWindow* CCompositor::getWindowForPopup(wlr_xdg_popup* popup) { wlr_surface* CCompositor::vectorToLayerSurface(const Vector2D& pos, std::vector>* layerSurfaces, Vector2D* sCoords, SLayerSurface** ppLayerSurfaceFound) { for (auto it = layerSurfaces->rbegin(); it != layerSurfaces->rend(); it++) { - if ((*it)->fadingOut || !(*it)->layerSurface || ((*it)->layerSurface && !(*it)->layerSurface->mapped)) + if ((*it)->fadingOut || !(*it)->layerSurface || ((*it)->layerSurface && !(*it)->layerSurface->mapped) || (*it)->alpha.fl() == 0.f) continue; const auto SURFACEAT = wlr_layer_surface_v1_surface_at((*it)->layerSurface, pos.x - (*it)->geometry.x, pos.y - (*it)->geometry.y, &sCoords->x, &sCoords->y); @@ -1617,6 +1617,12 @@ void CCompositor::setWindowFullscreen(CWindow* pWindow, bool on, eFullscreenMode if (w->m_iWorkspaceID == pWindow->m_iWorkspaceID) w->m_bCreatedOverFullscreen = false; } + + const auto PMONITOR = getMonitorFromID(pWindow->m_iMonitorID); + + for (auto& ls : PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + ls->alpha = pWindow->m_bIsFullscreen && mode == FULLSCREEN_FULL ? 0.f : 255.f; + } g_pXWaylandManager->setWindowSize(pWindow, pWindow->m_vRealSize.goalv(), true); diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp index 7b0e0fbb..21e6b56d 100644 --- a/src/managers/input/InputManager.cpp +++ b/src/managers/input/InputManager.cpp @@ -139,6 +139,9 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { if (!foundSurface) foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY], &surfaceCoords, &pFoundLayerSurface); + if (!foundSurface) + foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &surfaceCoords, &pFoundLayerSurface); + // then, we check if the workspace doesnt have a fullscreen window const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(PMONITOR->activeWorkspace); if (PWORKSPACE->m_bHasFullscreenWindow && !foundSurface && PWORKSPACE->m_efFullscreenMode == FULLSCREEN_FULL) { @@ -172,9 +175,6 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) { } } - if (!foundSurface) - foundSurface = g_pCompositor->vectorToLayerSurface(mouseCoords, &PMONITOR->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP], &surfaceCoords, &pFoundLayerSurface); - // then windows if (!foundSurface) { if (PWORKSPACE->m_bHasFullscreenWindow && PWORKSPACE->m_efFullscreenMode == FULLSCREEN_MAXIMIZED) { diff --git a/src/managers/input/Swipe.cpp b/src/managers/input/Swipe.cpp index 30303680..165068b4 100644 --- a/src/managers/input/Swipe.cpp +++ b/src/managers/input/Swipe.cpp @@ -27,6 +27,12 @@ void CInputManager::onSwipeBegin(wlr_pointer_swipe_begin_event* e) { m_sActiveSwipe.pMonitor = g_pCompositor->m_pLastMonitor; m_sActiveSwipe.avgSpeed = 0; m_sActiveSwipe.speedPoints = 0; + + if (PWORKSPACE->m_bHasFullscreenWindow) { + for (auto& ls : g_pCompositor->m_pLastMonitor->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + ls->alpha = 255.f; + } + } } void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { @@ -47,6 +53,8 @@ void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { const auto RENDEROFFSETMIDDLE = m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.vec(); + CWorkspace* pSwitchedTo = nullptr; + if ((abs(m_sActiveSwipe.delta) < *PSWIPEDIST * *PSWIPEPERC && (*PSWIPEFORC == 0 || (*PSWIPEFORC != 0 && m_sActiveSwipe.avgSpeed < *PSWIPEFORC))) || abs(m_sActiveSwipe.delta) < 2) { // revert if (abs(m_sActiveSwipe.delta) < 2) { @@ -64,6 +72,8 @@ void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset = Vector2D(); } + + pSwitchedTo = m_sActiveSwipe.pWorkspaceBegin; } else if (m_sActiveSwipe.delta < 0) { // switch to left const auto RENDEROFFSET = PWORKSPACEL->m_vRenderOffset.vec(); @@ -80,6 +90,8 @@ void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { g_pInputManager->unconstrainMouse(); Debug::log(LOG, "Ended swipe to the left"); + + pSwitchedTo = PWORKSPACEL; } else { // switch to right const auto RENDEROFFSET = PWORKSPACER->m_vRenderOffset.vec(); @@ -96,6 +108,8 @@ void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { g_pInputManager->unconstrainMouse(); Debug::log(LOG, "Ended swipe to the right"); + + pSwitchedTo = PWORKSPACER; } g_pHyprRenderer->damageMonitor(m_sActiveSwipe.pMonitor); @@ -107,6 +121,11 @@ void CInputManager::onSwipeEnd(wlr_pointer_swipe_end_event* e) { m_sActiveSwipe.pWorkspaceBegin = nullptr; g_pInputManager->refocus(); + + // apply alpha + for (auto& ls : g_pCompositor->m_pLastMonitor->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + ls->alpha = pSwitchedTo->m_bHasFullscreenWindow ? 0.f : 255.f; + } } void CInputManager::onSwipeUpdate(wlr_pointer_swipe_update_event* e) { diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp index a1699f36..bb39c955 100644 --- a/src/render/Renderer.cpp +++ b/src/render/Renderer.cpp @@ -126,7 +126,7 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(CMonitor* pMonitor, CWor const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(w->m_iWorkspaceID); if (w->m_iWorkspaceID != pWorkspace->m_iID || !w->m_bIsFullscreen){ - if (!(PWORKSPACE && (PWORKSPACE->m_vRenderOffset.isBeingAnimated() || PWORKSPACE->m_fAlpha.isBeingAnimated()))) + if (!(PWORKSPACE && (PWORKSPACE->m_vRenderOffset.isBeingAnimated() || PWORKSPACE->m_fAlpha.isBeingAnimated() || PWORKSPACE->m_bForceRendering))) continue; if (w->m_iMonitorID != pMonitor->ID) @@ -165,13 +165,12 @@ void CHyprRenderer::renderWorkspaceWithFullscreenWindow(CMonitor* pMonitor, CWor } // and the overlay layers - if (pWorkspace->m_efFullscreenMode != FULLSCREEN_FULL) { - // on non-full we draw the bar and shit - for (auto& ls : pMonitor->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + for (auto& ls : pMonitor->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_TOP]) { + if (ls->alpha.fl() != 0.f) renderLayer(ls.get(), pMonitor, time); - } } + for (auto& ls : pMonitor->m_aLayerSurfaceLists[ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY]) { renderLayer(ls.get(), pMonitor, time); }