aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorvaxerski <[email protected]>2022-05-15 14:18:31 +0200
committervaxerski <[email protected]>2022-05-15 14:18:31 +0200
commitd7ad80e6a2ee25bdc524c0012937d73725f5ad2f (patch)
treea5a41fc6072d225815cacb468b345e62140f2fd4
parentcba4693d390da71c0d4fc743436c455c601fec9d (diff)
downloadHyprland-d7ad80e6a2ee25bdc524c0012937d73725f5ad2f.tar.gz
Hyprland-d7ad80e6a2ee25bdc524c0012937d73725f5ad2f.zip
Added window animation rules
-rw-r--r--src/Window.hpp5
-rw-r--r--src/config/ConfigManager.cpp1
-rw-r--r--src/events/Windows.cpp3
-rw-r--r--src/managers/AnimationManager.cpp105
-rw-r--r--src/managers/AnimationManager.hpp4
5 files changed, 85 insertions, 33 deletions
diff --git a/src/Window.hpp b/src/Window.hpp
index 7dcbb850..f68a5686 100644
--- a/src/Window.hpp
+++ b/src/Window.hpp
@@ -9,6 +9,10 @@ struct SWindowSpecialRenderData {
float alpha = 1.f;
};
+struct SWindowAdditionalConfigData {
+ std::string animationStyle = "";
+};
+
class CWindow {
public:
CWindow();
@@ -81,6 +85,7 @@ public:
// Special render data, rules, etc
SWindowSpecialRenderData m_sSpecialRenderData;
+ SWindowAdditionalConfigData m_sAdditionalConfigData;
// For the list lookup
bool operator==(const CWindow& rhs) {
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 7635b257..6cb51797 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -398,6 +398,7 @@ void CConfigManager::handleWindowRule(const std::string& command, const std::str
&& RULE.find("pseudo") != 0
&& RULE.find("monitor") != 0
&& RULE.find("nofocus") != 0
+ && RULE.find("animation") != 0
&& RULE.find("workspace") != 0) {
Debug::log(ERR, "Invalid rule found: %s", RULE.c_str());
parseError = "Invalid rule found: " + RULE;
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index 0bbe1629..a6ae6c5d 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -95,6 +95,9 @@ void Events::listener_mapWindow(void* owner, void* data) {
} catch(std::exception& e) {
Debug::log(ERR, "Opacity rule \"%s\" failed with: %s", r.szRule.c_str(), e.what());
}
+ } else if (r.szRule.find("animation") == 0) {
+ auto STYLE = r.szRule.substr(r.szRule.find_first_of(' ') + 1);
+ PWINDOW->m_sAdditionalConfigData.animationStyle = STYLE;
}
}
diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp
index 686d80dd..20302da6 100644
--- a/src/managers/AnimationManager.cpp
+++ b/src/managers/AnimationManager.cpp
@@ -203,52 +203,91 @@ bool CAnimationManager::deltazero(const CColor& a, const CColor& b) {
return a.r == b.r && a.g == b.g && a.b == b.b && a.a == b.a;
}
+//
+// Anims
+//
+//
-// animation on events
-void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
- auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style");
- transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower);
+void CAnimationManager::animationPopin(CWindow* pWindow) {
+ const auto GOALPOS = pWindow->m_vRealPosition.goalv();
+ const auto GOALSIZE = pWindow->m_vRealSize.goalv();
- // if the window is not being animated, that means the layout set a fixed size for it, don't animate.
- if (!pWindow->m_vRealPosition.isBeingAnimated() && !pWindow->m_vRealSize.isBeingAnimated())
- return;
+ pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
+ pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+}
+
+void CAnimationManager::animationSlide(CWindow* pWindow, std::string force) {
+ pWindow->m_vRealSize.warp(); // size we preserve in slide
const auto GOALPOS = pWindow->m_vRealPosition.goalv();
const auto GOALSIZE = pWindow->m_vRealSize.goalv();
- if (ANIMSTYLE == "slide") {
- pWindow->m_vRealSize.warp(); // size we preserve in slide
+ const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
+
+ 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));
+
+ return;
+ }
+
+ const auto MIDPOINT = GOALPOS + GOALSIZE / 2.f;
+
+ // check sides it touches
+ const bool DISPLAYLEFT = STICKS(pWindow->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
+ const bool DISPLAYRIGHT = STICKS(pWindow->m_vPosition.x + pWindow->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
+ const bool DISPLAYTOP = STICKS(pWindow->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
+ const bool DISPLAYBOTTOM = STICKS(pWindow->m_vPosition.y + pWindow->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
- const auto MIDPOINT = GOALPOS + GOALSIZE / 2.f;
+ if (DISPLAYBOTTOM && DISPLAYTOP) {
+ if (DISPLAYLEFT && DISPLAYRIGHT) {
+ pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
+ } else if (DISPLAYLEFT) {
+ pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ } else {
+ pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ }
+ } else if (DISPLAYTOP) {
+ pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(0, GOALSIZE.y));
+ } else if (DISPLAYBOTTOM) {
+ pWindow->m_vRealPosition.setValue(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));
+ else
+ pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ }
+}
+
+void CAnimationManager::onWindowPostCreate(CWindow* pWindow) {
+ auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style");
+ transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower);
- // check sides it touches
- const auto PMONITOR = g_pCompositor->getMonitorFromID(pWindow->m_iMonitorID);
- const bool DISPLAYLEFT = STICKS(pWindow->m_vPosition.x, PMONITOR->vecPosition.x + PMONITOR->vecReservedTopLeft.x);
- const bool DISPLAYRIGHT = STICKS(pWindow->m_vPosition.x + pWindow->m_vSize.x, PMONITOR->vecPosition.x + PMONITOR->vecSize.x - PMONITOR->vecReservedBottomRight.x);
- const bool DISPLAYTOP = STICKS(pWindow->m_vPosition.y, PMONITOR->vecPosition.y + PMONITOR->vecReservedTopLeft.y);
- const bool DISPLAYBOTTOM = STICKS(pWindow->m_vPosition.y + pWindow->m_vSize.y, PMONITOR->vecPosition.y + PMONITOR->vecSize.y - PMONITOR->vecReservedBottomRight.y);
+ // if the window is not being animated, that means the layout set a fixed size for it, don't animate.
+ if (!pWindow->m_vRealPosition.isBeingAnimated() && !pWindow->m_vRealSize.isBeingAnimated())
+ return;
- if (DISPLAYBOTTOM && DISPLAYTOP) {
- if (DISPLAYLEFT && DISPLAYRIGHT) {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(0, GOALSIZE.y));
- } else if (DISPLAYLEFT) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(GOALSIZE.x, 0));
+ if (pWindow->m_sAdditionalConfigData.animationStyle != "") {
+ // the window has config'd special anim
+ 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));
} else {
- pWindow->m_vRealPosition.setValue(GOALPOS + Vector2D(GOALSIZE.x, 0));
+ animationSlide(pWindow);
}
- } else if (DISPLAYTOP) {
- pWindow->m_vRealPosition.setValue(GOALPOS - Vector2D(0, GOALSIZE.y));
- } else if (DISPLAYBOTTOM) {
- pWindow->m_vRealPosition.setValue(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));
- else
- pWindow->m_vRealPosition.setValue(Vector2D(GOALPOS.x, PMONITOR->vecPosition.y - GOALSIZE.y));
+ // anim popin, fallback
+ animationPopin(pWindow);
}
} else {
- // anim popin, fallback
- pWindow->m_vRealPosition.setValue(GOALPOS + GOALSIZE / 2.f);
- pWindow->m_vRealSize.setValue(Vector2D(5, 5));
+ if (ANIMSTYLE == "slide") {
+ animationSlide(pWindow);
+ } else {
+ // anim popin, fallback
+ animationPopin(pWindow);
+ }
}
} \ No newline at end of file
diff --git a/src/managers/AnimationManager.hpp b/src/managers/AnimationManager.hpp
index f3343ede..ef554171 100644
--- a/src/managers/AnimationManager.hpp
+++ b/src/managers/AnimationManager.hpp
@@ -29,6 +29,10 @@ private:
bool deltazero(const float& a, const float& b);
std::unordered_map<std::string, CBezierCurve> m_mBezierCurves;
+
+ // Anim stuff
+ void animationPopin(CWindow*);
+ void animationSlide(CWindow*, std::string force = "");
};
inline std::unique_ptr<CAnimationManager> g_pAnimationManager; \ No newline at end of file