summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorvaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-28 18:28:55 +0200
committervaxerski <43317083+vaxerski@users.noreply.github.com>2022-05-28 18:28:55 +0200
commit15553804d644fd66c52d270c729c5250b06ee9e4 (patch)
tree327b55e0931e3f078d304fe957c82f8ecbc7f616 /src
parent7f1f14fe85f53fcf12849632d3f003f00cca7578 (diff)
Added closing animations (reverse of open)
Diffstat (limited to 'src')
-rw-r--r--src/Window.hpp2
-rw-r--r--src/events/Windows.cpp8
-rw-r--r--src/managers/AnimationManager.cpp59
-rw-r--r--src/managers/AnimationManager.hpp6
-rw-r--r--src/render/OpenGL.cpp9
5 files changed, 58 insertions, 26 deletions
diff --git a/src/Window.hpp b/src/Window.hpp
index 238d02e0..253600b2 100644
--- a/src/Window.hpp
+++ b/src/Window.hpp
@@ -82,6 +82,8 @@ public:
CAnimatedVariable m_fAlpha;
bool m_bFadingOut = false;
bool m_bReadyToDelete = false;
+ Vector2D m_vOriginalClosedPos; // these will be used for calculations later on in
+ Vector2D m_vOriginalClosedSize; // drawing the closing animations
// For hidden windows and stuff
bool m_bHidden = false;
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index 9d432b1d..377b3d78 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -190,7 +190,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
}
// do the animation thing
- g_pAnimationManager->onWindowPostCreate(PWINDOW);
+ g_pAnimationManager->onWindowPostCreateClose(PWINDOW, false);
Debug::log(LOG, "Map request dispatched, monitor %s, xywh: %f %f %f %f", PMONITOR->szName.c_str(), PWINDOW->m_vRealPosition.goalv().x, PWINDOW->m_vRealPosition.goalv().y, PWINDOW->m_vRealSize.goalv().x, PWINDOW->m_vRealSize.goalv().y);
}
@@ -250,6 +250,12 @@ void Events::listener_unmapWindow(void* owner, void* data) {
g_pCompositor->m_lWindowsFadingOut.push_back(PWINDOW);
g_pHyprRenderer->damageMonitor(g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID));
+
+ // do the animation thing
+ PWINDOW->m_vOriginalClosedPos = PWINDOW->m_vRealPosition.vec();
+ PWINDOW->m_vOriginalClosedSize = PWINDOW->m_vRealSize.vec();
+ PWINDOW->m_vRealPosition = PWINDOW->m_vRealPosition.vec() + Vector2D(0.01f, 0.01f); // it has to be animated, otherwise onWindowPostCreateClose will ignore it
+ g_pAnimationManager->onWindowPostCreateClose(PWINDOW, true);
}
void Events::listener_commitWindow(void* owner, void* data) {
diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp
index 9117203f..5c417cb2 100644
--- a/src/managers/AnimationManager.cpp
+++ b/src/managers/AnimationManager.cpp
@@ -208,15 +208,20 @@ bool CAnimationManager::deltazero(const CColor& a, const CColor& b) {
//
//
-void CAnimationManager::animationPopin(CWindow* pWindow) {
+void CAnimationManager::animationPopin(CWindow* pWindow, bool close) {
const auto GOALPOS = pWindow->m_vRealPosition.goalv();
const auto GOALSIZE = pWindow->m_vRealSize.goalv();
- pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
- pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+ if (!close) {
+ pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
+ pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+ } else {
+ pWindow->m_vRealPosition = GOALPOS + GOALSIZE / 2.f;
+ pWindow->m_vRealSize = Vector2D(5, 5);
+ }
}
-void CAnimationManager::animationSlide(CWindow* pWindow, std::string force) {
+void CAnimationManager::animationSlide(CWindow* pWindow, std::string force, bool close) {
pWindow->m_vRealSize.warp(); // size we preserve in slide
const auto GOALPOS = pWindow->m_vRealPosition.goalv();
@@ -224,11 +229,18 @@ void CAnimationManager::animationSlide(CWindow* pWindow, std::string force) {
const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+ Vector2D posOffset;
+
if (force != "") {
- if (force == "bottom") pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y));
- else if (force == "left") pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
- else if (force == "right") pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
- else pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ if (force == "bottom") posOffset = Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y);
+ else if (force == "left") posOffset = GOALPOS - Vector2D(GOALSIZE.x, 0);
+ else if (force == "right") posOffset = GOALPOS + Vector2D(GOALSIZE.x, 0);
+ else posOffset = Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y);
+
+ if (!close)
+ pWindow->m_vRealPosition.setValue(posOffset);
+ else
+ pWindow->m_vRealPosition = posOffset;
return;
}
@@ -243,25 +255,30 @@ void CAnimationManager::animationSlide(CWindow* pWindow, std::string force) {
if (DISPLAYBOTTOM && DISPLAYTOP) {
if (DISPLAYLEFT && DISPLAYRIGHT) {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
+ posOffset = GOALPOS + Vector2D(0, GOALSIZE.y);
} else if (DISPLAYLEFT) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ posOffset = GOALPOS - Vector2D(GOALSIZE.x, 0);
} else {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ posOffset = GOALPOS + Vector2D(GOALSIZE.x, 0);
}
} else if (DISPLAYTOP) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(0, GOALSIZE.y));
+ posOffset = GOALPOS - Vector2D(0, GOALSIZE.y);
} else if (DISPLAYBOTTOM) {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
+ posOffset = GOALPOS + Vector2D(0, GOALSIZE.y);
} else {
if (MIDPOINT.y > PMONITOR->vecPosition.y + PMONITOR->vecSize.y / 2.f)
- pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y));
+ posOffset = Vector2D(GOALPOS.x, PMONITOR->vecPosition.y + PMONITOR->vecSize.y);
else
- pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ posOffset = Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y);
}
+
+ if (!close)
+ pWindow->m_vRealPosition.setValue(posOffset);
+ else
+ pWindow->m_vRealPosition = posOffset;
}
-void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
+void CAnimationManager::onWindowPostCreateClose(CWindow* pWindow, bool close) {
auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style");
transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower);
@@ -274,20 +291,20 @@ void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
if (pWindow->m_sAdditionalConfigData.animationStyle.find("slide") == 0) {
if (pWindow->m_sAdditionalConfigData.animationStyle.find(' ') != std::string::npos) {
// has a direction
- animationSlide(pWindow, pWindow->m_sAdditionalConfigData.animationStyle.substr(pWindow->m_sAdditionalConfigData.animationStyle.find(' ') + 1));
+ animationSlide(pWindow, pWindow->m_sAdditionalConfigData.animationStyle.substr(pWindow->m_sAdditionalConfigData.animationStyle.find(' ') + 1), close);
} else {
- animationSlide(pWindow);
+ animationSlide(pWindow, "", close);
}
} else {
// anim popin, fallback
- animationPopin(pWindow);
+ animationPopin(pWindow, close);
}
} else {
if (ANIMSTYLE == "slide") {
- animationSlide(pWindow);
+ animationSlide(pWindow, "", close);
} else {
// anim popin, fallback
- animationPopin(pWindow);
+ animationPopin(pWindow, close);
}
}
} \ No newline at end of file
diff --git a/src/managers/AnimationManager.hpp b/src/managers/AnimationManager.hpp
index ef554171..bfcd5d69 100644
--- a/src/managers/AnimationManager.hpp
+++ b/src/managers/AnimationManager.hpp
@@ -16,7 +16,7 @@ public:
void addBezierWithName(std::string, const Vector2D&, const Vector2D&);
void removeAllBeziers();
- void onWindowPostCreate(CWindow*);
+ void onWindowPostCreateClose(CWindow*, bool close = false);
std::list<CAnimatedVariable*> m_lAnimatedVariables;
@@ -31,8 +31,8 @@ private:
std::unordered_map<std::string, CBezierCurve> m_mBezierCurves;
// Anim stuff
- void animationPopin(CWindow*);
- void animationSlide(CWindow*, std::string force = "");
+ void animationPopin(CWindow*, bool close = false);
+ void animationSlide(CWindow*, std::string force = "", bool close = false);
};
inline std::unique_ptr<CAnimationManager> g_pAnimationManager; \ No newline at end of file
diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp
index 907fe7e8..008d0dc3 100644
--- a/src/render/OpenGL.cpp
+++ b/src/render/OpenGL.cpp
@@ -756,7 +756,14 @@ void CHyprOpenGLImpl::renderSnapshot(CWindow** pWindow) {
const auto PMONITOR = g_pCompositor->getMonitorFromID(PWINDOW->m_iMonitorID);
- wlr_box windowBox = {0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y};
+ wlr_box windowBox;
+ // some mafs to figure out the correct box
+ Vector2D scaleXY = Vector2D((PWINDOW->m_vRealSize.vec().x / PWINDOW->m_vOriginalClosedSize.x), (PWINDOW->m_vRealSize.vec().y / PWINDOW->m_vOriginalClosedSize.y));
+
+ windowBox.width = PMONITOR->vecPixelSize.x * scaleXY.x;
+ windowBox.height = PMONITOR->vecPixelSize.y * scaleXY.y;
+ windowBox.x = PWINDOW->m_vRealPosition.vec().x - (PWINDOW->m_vOriginalClosedPos.x * scaleXY.x);
+ windowBox.y = PWINDOW->m_vRealPosition.vec().y - (PWINDOW->m_vOriginalClosedPos.y * scaleXY.y);
pixman_region32_t fakeDamage;
pixman_region32_init_rect(&fakeDamage, 0, 0, PMONITOR->vecPixelSize.x, PMONITOR->vecPixelSize.y);