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,8 +203,64 @@ 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 +// +// + +void CAnimationManager::animationPopin(CWindow* pWindow) { + 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)); +} + +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(); + + 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); + + 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)); + } +} -// animation on events void CAnimationManager::onWindowPostCreate(CWindow* pWindow) { auto ANIMSTYLE = g_pConfigManager->getString("animations:windows_style"); transform(ANIMSTYLE.begin(), ANIMSTYLE.end(), ANIMSTYLE.begin(), ::tolower); @@ -213,42 +269,25 @@ void CAnimationManager::onWindowPostCreate(CWindow* pWindow) { if (!pWindow->m_vRealPosition.isBeingAnimated() && !pWindow->m_vRealSize.isBeingAnimated()) return; - 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 MIDPOINT = GOALPOS + GOALSIZE / 2.f; - - // 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 (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 m_mBezierCurves; + + // Anim stuff + void animationPopin(CWindow*); + void animationSlide(CWindow*, std::string force = ""); }; inline std::unique_ptr g_pAnimationManager; \ No newline at end of file