#pragma once #include #include #include #include class CScrollingLayout; struct SColumnData; struct SWorkspaceData; struct SScrollingWindowData { SScrollingWindowData(PHLWINDOW w, SP col, float ws = 1.F) : window(w), column(col), windowSize(ws) { ; } PHLWINDOWREF window; WP column; float windowSize = 1.F; bool ignoreFullscreenChecks = false; PHLWORKSPACEREF overrideWorkspace; CBox layoutBox; }; struct SColumnData { SColumnData(SP ws) : workspace(ws) { ; } void add(PHLWINDOW w); void add(SP w); void remove(PHLWINDOW w); bool has(PHLWINDOW w); void up(SP w); void down(SP w); SP next(SP w); SP prev(SP w); std::vector> windowDatas; float columnSize = 1.F; float columnWidth = 1.F; WP workspace; WP self; }; struct SWorkspaceData { SWorkspaceData(PHLWORKSPACE w, CScrollingLayout* l) : workspace(w), layout(l) { ; } PHLWORKSPACEREF workspace; std::vector> columns; int leftOffset = 0; SP add(); SP add(size_t after); int64_t idx(SP c); void remove(SP c); double maxWidth(); SP next(SP c); SP prev(SP c); SP atCenter(); bool visible(SP c); void centerCol(SP c); void fitCol(SP c); void recalculate(); CScrollingLayout* layout = nullptr; WP self; }; class CScrollingLayout : public IHyprLayout { public: virtual void onWindowCreatedTiling(PHLWINDOW, eDirection direction = DIRECTION_DEFAULT); virtual void onWindowRemovedTiling(PHLWINDOW); virtual bool isWindowTiled(PHLWINDOW); virtual void recalculateMonitor(const MONITORID&); virtual void recalculateWindow(PHLWINDOW); virtual void onBeginDragWindow(); virtual void resizeActiveWindow(const Vector2D&, eRectCorner corner = CORNER_NONE, PHLWINDOW pWindow = nullptr); virtual void fullscreenRequestForWindow(PHLWINDOW pWindow, const eFullscreenMode CURRENT_EFFECTIVE_MODE, const eFullscreenMode EFFECTIVE_MODE); virtual std::any layoutMessage(SLayoutMessageHeader, std::string); virtual SWindowRenderLayoutHints requestRenderHints(PHLWINDOW); virtual void switchWindows(PHLWINDOW, PHLWINDOW); virtual void moveWindowTo(PHLWINDOW, const std::string& dir, bool silent); virtual void alterSplitRatio(PHLWINDOW, float, bool); virtual std::string getLayoutName(); virtual void replaceWindowDataWith(PHLWINDOW from, PHLWINDOW to); virtual Vector2D predictSizeForNewWindowTiled(); virtual void onEnable(); virtual void onDisable(); CBox usableAreaFor(PHLMONITOR m); private: std::vector> m_workspaceDatas; SP m_configCallback; struct { std::vector configuredWidths; } m_config; SP dataFor(PHLWORKSPACE ws); SP dataFor(PHLWINDOW w); SP currentWorkspaceData(); void applyNodeDataToWindow(SP node, bool force); friend struct SWorkspaceData; };