summaryrefslogtreecommitdiff
path: root/src/layout/DwindleLayout.hpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2026-02-21 21:30:39 +0000
committerGitHub <noreply@github.com>2026-02-21 21:30:39 +0000
commit723870337f299d4c80aa0048144f3a1ca1c885bd (patch)
treeca3279ae5dbc841f676c64d2f58f895de13cd3bf /src/layout/DwindleLayout.hpp
parent51f8849e541f0a8150ac3a43fa928c1e299daf18 (diff)
layout: rethonk layouts from the ground up (#12890)
Rewrites layouts to be much smaller, and deal with much less annoying BS. Improves the overall architecture, unifies handling of pseudotiling, and various other improvements.
Diffstat (limited to 'src/layout/DwindleLayout.hpp')
-rw-r--r--src/layout/DwindleLayout.hpp110
1 files changed, 0 insertions, 110 deletions
diff --git a/src/layout/DwindleLayout.hpp b/src/layout/DwindleLayout.hpp
deleted file mode 100644
index e704b8f4..00000000
--- a/src/layout/DwindleLayout.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#pragma once
-
-#include "IHyprLayout.hpp"
-#include "../desktop/DesktopTypes.hpp"
-
-#include <list>
-#include <vector>
-#include <array>
-#include <optional>
-#include <format>
-
-class CHyprDwindleLayout;
-enum eFullscreenMode : int8_t;
-
-struct SDwindleNodeData {
- WP<SDwindleNodeData> pParent;
- bool isNode = false;
-
- PHLWINDOWREF pWindow;
-
- std::array<WP<SDwindleNodeData>, 2> children = {};
- WP<SDwindleNodeData> self;
-
- bool splitTop = false; // for preserve_split
-
- CBox box = {0};
-
- WORKSPACEID workspaceID = WORKSPACE_INVALID;
-
- float splitRatio = 1.f;
-
- bool valid = true;
-
- bool ignoreFullscreenChecks = false;
-
- // For list lookup
- bool operator==(const SDwindleNodeData& rhs) const {
- return pWindow.lock() == rhs.pWindow.lock() && workspaceID == rhs.workspaceID && box == rhs.box && pParent == rhs.pParent && children[0] == rhs.children[0] &&
- children[1] == rhs.children[1];
- }
-
- void recalcSizePosRecursive(bool force = false, bool horizontalOverride = false, bool verticalOverride = false);
- void applyRootBox();
- CHyprDwindleLayout* layout = nullptr;
-};
-
-class CHyprDwindleLayout : 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();
-
- private:
- std::vector<SP<SDwindleNodeData>> m_dwindleNodesData;
-
- struct {
- bool started = false;
- bool pseudo = false;
- bool xExtent = false;
- bool yExtent = false;
- } m_pseudoDragFlags;
-
- std::optional<Vector2D> m_overrideFocalPoint; // for onWindowCreatedTiling.
-
- int getNodesOnWorkspace(const WORKSPACEID&);
- void applyNodeDataToWindow(SP<SDwindleNodeData>, bool force = false);
- void calculateWorkspace(const PHLWORKSPACE& pWorkspace);
- SP<SDwindleNodeData> getNodeFromWindow(PHLWINDOW);
- SP<SDwindleNodeData> getFirstNodeOnWorkspace(const WORKSPACEID&);
- SP<SDwindleNodeData> getClosestNodeOnWorkspace(const WORKSPACEID&, const Vector2D&);
- SP<SDwindleNodeData> getMasterNodeOnWorkspace(const WORKSPACEID&);
-
- void toggleSplit(PHLWINDOW);
- void swapSplit(PHLWINDOW);
- void moveToRoot(PHLWINDOW, bool stable = true);
-
- eDirection m_overrideDirection = DIRECTION_DEFAULT;
-
- friend struct SDwindleNodeData;
-};
-
-template <typename CharT>
-struct std::formatter<SP<SDwindleNodeData>, CharT> : std::formatter<CharT> {
- template <typename FormatContext>
- auto format(const SP<SDwindleNodeData>& node, FormatContext& ctx) const {
- auto out = ctx.out();
- if (!node)
- return std::format_to(out, "[Node nullptr]");
- std::format_to(out, "[Node {:x}: workspace: {}, pos: {:j2}, size: {:j2}", rc<uintptr_t>(node.get()), node->workspaceID, node->box.pos(), node->box.size());
- if (!node->isNode && !node->pWindow.expired())
- std::format_to(out, ", window: {:x}", node->pWindow.lock());
- return std::format_to(out, "]");
- }
-};