be3bd8c535d6c9dd292f84691e0a7df514f6e25e
- Author
- outfoxxed <outfoxxed@outfoxxed.me>
- Committer
- outfoxxed <outfoxxed@outfoxxed.me>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
2index 6cbd06e5a61dddc8bba4e910da886f29b0c6fd8d..967acd5b5381045ff6fecc5fd359e7d872919b60 100644
3--- a/src/Hy3Layout.cpp
4+++ b/src/Hy3Layout.cpp
5@@ -150,7 +150,7 @@ void Hy3Node::recalcSizePosRecursive(bool force) {
6 break;
7 }
8
9- child->recalcSizePosRecursive();
10+ child->recalcSizePosRecursive(force);
11 return;
12 }
13
14@@ -166,20 +166,22 @@ void Hy3Node::recalcSizePosRecursive(bool force) {
15 break;
16 }
17
18+ double ratio_mul = group->layout != Hy3GroupLayout::Tabbed ? group->children.empty() ? 0 : constraint / group->children.size() : 0;
19+
20 double offset = 0;
21
22 for(auto child: group->children) {
23 switch (group->layout) {
24 case Hy3GroupLayout::SplitH:
25 child->position.x = this->position.x + offset;
26- child->size.x = child->size_ratio * ((double) constraint / group->children.size());
27+ child->size.x = child->size_ratio * ratio_mul;
28 offset += child->size.x;
29 child->position.y = this->position.y;
30 child->size.y = this->size.y;
31 break;
32 case Hy3GroupLayout::SplitV:
33 child->position.y = this->position.y + offset;
34- child->size.y = child->size_ratio * ((double) constraint / group->children.size());
35+ child->size.y = child->size_ratio * ratio_mul;
36 offset += child->size.y;
37 child->position.x = this->position.x;
38 child->size.x = this->size.x;
39@@ -349,7 +351,7 @@ void Hy3Layout::applyNodeDataToWindow(Hy3Node* node, bool force) {
40 g_pHyprRenderer->damageWindow(window);
41
42 window->m_vRealPosition.warp();
43- window->m_vRealPosition.warp();
44+ window->m_vRealSize.warp();
45
46 g_pHyprRenderer->damageWindow(window);
47 }
48@@ -466,6 +468,12 @@ void Hy3Layout::onWindowRemovedTiling(CWindow* window) {
49 }
50
51 group->children.remove(node);
52+
53+ auto splitmod = group->children.empty() ? 0.0 : (1.0 - node->size_ratio) / group->children.size();
54+ for (auto child: group->children) {
55+ child->size_ratio -= splitmod;
56+ }
57+
58 this->nodes.remove(*node);
59
60 if (group->children.size() == 1) {
61@@ -487,6 +495,12 @@ void Hy3Layout::onWindowRemovedTiling(CWindow* window) {
62 }
63
64 group->children.remove(child);
65+
66+ auto splitmod = group->children.empty() ? 0.0 : (1.0 - child->size_ratio) / group->children.size();
67+ for (auto child: group->children) {
68+ child->size_ratio -= splitmod;
69+ }
70+
71 this->nodes.remove(*child);
72
73 if (group->children.size() == 1) {
74@@ -570,8 +584,203 @@ void Hy3Layout::recalculateWindow(CWindow* pWindow) {
75 ; // empty
76 }
77
78+void Hy3Layout::onBeginDragWindow() {
79+ this->drag_flags.started = false;
80+ IHyprLayout::onBeginDragWindow();
81+}
82+
83 void Hy3Layout::resizeActiveWindow(const Vector2D& delta, CWindow* pWindow) {
84- ; // empty
85+ auto window = pWindow ? pWindow : g_pCompositor->m_pLastWindow;
86+ if (!g_pCompositor->windowValidMapped(window)) return;
87+
88+ auto* node = this->getNodeFromWindow(window);
89+ if (node == nullptr) return;
90+
91+ if (!this->drag_flags.started) {
92+ auto mouse = g_pInputManager->getMouseCoordsInternal();
93+ auto mouseOffset = mouse - window->m_vPosition;
94+
95+ this->drag_flags = {
96+ .started = true,
97+ .xExtent = mouseOffset.x > window->m_vSize.x / 2,
98+ .yExtent = mouseOffset.y > window->m_vSize.y / 2,
99+ };
100+
101+ Debug::log(LOG, "Positive offsets - x: %d, y: %d", this->drag_flags.xExtent, this->drag_flags.yExtent);
102+ }
103+
104+ const auto animate = &g_pConfigManager->getConfigValuePtr("misc:animate_manual_resizes")->intValue;
105diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
106index bbc5c33f2ff9e48487903c03f6bec91f198a69c4..c33c97c5e88b21848293cfd9303796851df4f370 100644
107--- a/src/Hy3Layout.hpp
108+++ b/src/Hy3Layout.hpp
109@@ -86,6 +86,7 @@ public:
110 virtual bool isWindowTiled(CWindow*);
111 virtual void recalculateMonitor(const int&);
112 virtual void recalculateWindow(CWindow*);
113+ virtual void onBeginDragWindow();
114 virtual void resizeActiveWindow(const Vector2D&, CWindow* pWindow = nullptr);
115 virtual void fullscreenRequestForWindow(CWindow*, eFullscreenMode, bool);
116 virtual std::any layoutMessage(SLayoutMessageHeader, std::string);
117@@ -107,6 +108,12 @@ public:
118 private:
119 CWindow* lastActiveWindow = nullptr;
120
121+ struct {
122+ bool started = false;
123+ bool xExtent = false;
124+ bool yExtent = false;
125+ } drag_flags;
126+
127 int getWorkspaceNodeCount(const int&);
128 Hy3Node* getNodeFromWindow(CWindow*);
129 Hy3Node* getWorkspaceRootGroup(const int&);