#pragma once #include "../../helpers/math/Math.hpp" #include "../../helpers/math/Direction.hpp" #include "../../helpers/memory/Memory.hpp" #include "../LayoutManager.hpp" #include "../space/Space.hpp" #include #include namespace Layout { class ITarget; class IFloatingAlgorithm; class ITiledAlgorithm; class CSpace; class CAlgorithm { public: static SP create(UP&& tiled, UP&& floating, SP space); ~CAlgorithm() = default; void addTarget(SP target); void moveTarget(SP target, std::optional focalPoint = std::nullopt, bool reposition = false); void removeTarget(SP target); void swapTargets(SP a, SP b); void moveTargetInDirection(SP t, Math::eDirection dir, bool silent); SP getNextCandidate(SP old); void setFloating(SP target, bool floating, bool reposition = false); Config::ErrorResult layoutMsg(const std::string_view& sv); std::optional predictSizeForNewTiledTarget(); void recalculate(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN); void recenter(SP t); void resizeTarget(const Vector2D& Δ, SP target, eRectCorner corner = CORNER_NONE); void moveTarget(const Vector2D& Δ, SP target); void setTargetGeom(const CBox& box, SP target); // only for float eFullscreenRequestResult requestFullscreen(SP target, eFullscreenMode currentEffectiveMode, eFullscreenMode effectiveMode); SP layoutFullscreenTarget() const; bool layoutFullscreenCoversMonitor() const; void updateFloatingAlgo(UP&& algo); void updateTiledAlgo(UP&& algo); const UP& tiledAlgo() const; const UP& floatingAlgo() const; SP space() const; size_t tiledTargets() const; size_t floatingTargets() const; private: CAlgorithm(UP&& tiled, UP&& floating, SP space); UP m_tiled; UP m_floating; WP m_space; WP m_self; std::vector> m_tiledTargets, m_floatingTargets; }; }