summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 19:28:10 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-04-05 19:28:10 +0200
commitf8e0b0b448b8b68f65ee1c3eebdd4eb3e3382138 (patch)
treeffc828e5fd67f8a429517c1fe01a4780c2ea694c /src
parentf5562941f70a448a2e292449296ff4c6ba26dc37 (diff)
fadein and prep for fadeout
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp13
-rw-r--r--src/Compositor.hpp2
-rw-r--r--src/Window.hpp4
-rw-r--r--src/events/Monitors.cpp1
-rw-r--r--src/events/Windows.cpp4
-rw-r--r--src/helpers/WLClasses.hpp3
-rw-r--r--src/layout/DwindleLayout.cpp4
-rw-r--r--src/managers/AnimationManager.cpp27
-rw-r--r--src/managers/XWaylandManager.cpp3
-rw-r--r--src/render/Renderer.cpp10
-rw-r--r--src/render/Renderer.hpp2
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<SXDGPopup> m_lXDGPopups;
std::list<SWorkspace> m_lWorkspaces;
std::list<SSubsurface> m_lSubsurfaces;
+ std::list<CWindow*> 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<SLayerSurface*>&, 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*);