#include "../../TiledAlgorithm.hpp" #include namespace Layout { class CAlgorithm; } namespace Layout::Tiled { struct SMasterNodeData; //orientation determines which side of the screen the master area resides enum eOrientation : uint8_t { ORIENTATION_LEFT = 0, ORIENTATION_TOP, ORIENTATION_RIGHT, ORIENTATION_BOTTOM, ORIENTATION_CENTER }; struct SMasterWorkspaceData { WORKSPACEID workspaceID = WORKSPACE_INVALID; eOrientation orientation = ORIENTATION_LEFT; // Previously focused non-master window when `focusmaster previous` command was issued WP focusMasterPrev; // bool operator==(const SMasterWorkspaceData& rhs) const { return workspaceID == rhs.workspaceID; } }; class CMasterAlgorithm : public ITiledAlgorithm { public: CMasterAlgorithm() = default; virtual ~CMasterAlgorithm() = default; virtual void newTarget(SP target); virtual void movedTarget(SP target, std::optional focalPoint = std::nullopt); virtual void removeTarget(SP target); virtual void resizeTarget(const Vector2D& Δ, SP target, eRectCorner corner = CORNER_NONE); virtual void recalculate(); virtual SP getNextCandidate(SP old); virtual std::expected layoutMsg(const std::string_view& sv); virtual std::optional predictSizeForNewTarget(); virtual void swapTargets(SP a, SP b); virtual void moveTargetInDirection(SP t, Math::eDirection dir, bool silent); private: std::vector> m_masterNodesData; SMasterWorkspaceData m_workspaceData; void addTarget(SP target, bool firstMap); bool m_forceWarps = false; void buildOrientationCycleVectorFromVars(std::vector& cycle, Hyprutils::String::CVarList2* vars); void buildOrientationCycleVectorFromEOperation(std::vector& cycle); void runOrientationCycle(Hyprutils::String::CVarList2* vars, int next); eOrientation getDynamicOrientation(); int getNodesNo(); SP getNodeFromWindow(PHLWINDOW); SP getNodeFromTarget(SP); SP getMasterNode(); SP getClosestNode(const Vector2D&); void calculateWorkspace(); SP getNextTarget(SP, bool, bool); int getMastersNo(); bool isWindowTiled(PHLWINDOW); }; };