fdc4749ac7010a05ed4cc9f7450dcf93aeb65999
- Author
- outfoxxed <outfoxxed@outfoxxed.me>
- Committer
- outfoxxed <outfoxxed@outfoxxed.me>
- Date
Message
Diff
This diff is truncated to protect this page.
1diff --git a/flake.lock b/flake.lock
2index f3a4c3633eab7f91bea0e07e9b67d76f13dde907..ce30305ebd632d78ff60a65dc49fd50b05d27373 100644
3--- a/flake.lock
4+++ b/flake.lock
5@@ -37,16 +37,15 @@
6 "xdph": "xdph"
7 },
8 "locked": {
9- "lastModified": 1711996237,
10- "narHash": "sha256-oa82eFINs1HkEnx3Nu+GEQQxXXNkJzSci3HZU//OJ2Y=",
11+ "lastModified": 1712189807,
12+ "narHash": "sha256-hmEBPDk1GbpPzpa0gLhJ0XJ5rvt+dMddKNQGr9J8XyA=",
13 "owner": "hyprwm",
14 "repo": "Hyprland",
15- "rev": "3875679755014997776e091ff8903acfb311dd2f",
16+ "rev": "b7d71bc0e1084bc1a296ae906503709a74fde4d9",
17 "type": "github"
18 },
19 "original": {
20 "owner": "hyprwm",
21- "ref": "v0.38.0",
22 "repo": "Hyprland",
23 "type": "github"
24 }
25diff --git a/flake.nix b/flake.nix
26index f675e782702034a924c7515101e6e81474bc2064..a375308b98bc8c5caa8e69646dfbab4ef69e3f70 100644
27--- a/flake.nix
28+++ b/flake.nix
29@@ -1,6 +1,6 @@
30 {
31 inputs = {
32- hyprland.url = "github:hyprwm/Hyprland?ref=v0.38.0";
33+ hyprland.url = "github:hyprwm/Hyprland";
34 };
35
36 outputs = { self, hyprland, ... }: let
37diff --git a/src/Hy3Layout.cpp b/src/Hy3Layout.cpp
38index 5fc334670402ca73e3127cb95253d424964437ef..a1f54a03fb32ba29ad460c97ed255e37c858eaba 100644
39--- a/src/Hy3Layout.cpp
40+++ b/src/Hy3Layout.cpp
41@@ -2,6 +2,7 @@
42 #include <set>
43
44 #include <hyprland/src/Compositor.hpp>
45+#include <hyprland/src/desktop/DesktopTypes.hpp>
46 #include <hyprland/src/plugins/PluginAPI.hpp>
47 #include <ranges>
48
49@@ -36,7 +37,7 @@ bool performContainment(Hy3Node& node, bool contained, CWindow* window) {
50 node.layout->nodes.push_back({
51 .parent = &node,
52 .data = window,
53- .workspace_id = node.workspace_id,
54+ .workspace = node.workspace,
55 .layout = node.layout,
56 });
57
58@@ -78,7 +79,7 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window, eDirection) {
59 (uintptr_t) window,
60 window->m_bIsFloating,
61 window->m_iMonitorID,
62- window->m_iWorkspaceID
63+ window->m_pWorkspace->m_iID
64 );
65
66 if (window->m_bIsFloating) return;
67@@ -97,7 +98,7 @@ void Hy3Layout::onWindowCreatedTiling(CWindow* window, eDirection) {
68 this->nodes.push_back({
69 .parent = nullptr,
70 .data = window,
71- .workspace_id = window->m_iWorkspaceID,
72+ .workspace = window->m_pWorkspace,
73 .layout = this,
74 });
75
76@@ -115,26 +116,24 @@ void Hy3Layout::insertNode(Hy3Node& node) {
77 return;
78 }
79
80- auto* workspace = g_pCompositor->getWorkspaceByID(node.workspace_id);
81-
82- if (workspace == nullptr) {
83+ if (!valid(node.workspace)) {
84 hy3_log(
85 ERR,
86 "insertNode called for node {:x} with invalid workspace id {}",
87 (uintptr_t) &node,
88- node.workspace_id
89+ node.workspace->m_iID
90 );
91 return;
92 }
93
94 node.reparenting = true;
95
96- auto* monitor = g_pCompositor->getMonitorFromID(workspace->m_iMonitorID);
97+ auto* monitor = g_pCompositor->getMonitorFromID(node.workspace->m_iMonitorID);
98
99 Hy3Node* opening_into;
100 Hy3Node* opening_after = nullptr;
101
102- auto* root = this->getWorkspaceRootGroup(node.workspace_id);
103+ auto* root = this->getWorkspaceRootGroup(node.workspace);
104
105 if (root != nullptr) {
106 opening_after = root->getFocusedNode();
107@@ -148,7 +147,7 @@ void Hy3Layout::insertNode(Hy3Node& node) {
108
109 if (opening_after == nullptr) {
110 if (g_pCompositor->m_pLastWindow != nullptr
111- && g_pCompositor->m_pLastWindow->m_iWorkspaceID == node.workspace_id
112+ && g_pCompositor->m_pLastWindow->m_pWorkspace == node.workspace
113 && !g_pCompositor->m_pLastWindow->m_bIsFloating
114 && (node.data.type == Hy3NodeType::Window
115 || g_pCompositor->m_pLastWindow != node.data.as_window)
116@@ -161,7 +160,7 @@ void Hy3Layout::insertNode(Hy3Node& node) {
117 RESERVED_EXTENTS | INPUT_EXTENTS
118 );
119
120- if (mouse_window != nullptr && mouse_window->m_iWorkspaceID == node.workspace_id) {
121+ if (mouse_window != nullptr && mouse_window->m_pWorkspace == node.workspace) {
122 opening_after = this->getNodeFromWindow(mouse_window);
123 }
124 }
125@@ -178,7 +177,7 @@ void Hy3Layout::insertNode(Hy3Node& node) {
126 if (opening_after != nullptr) {
127 opening_into = opening_after->parent;
128 } else {
129- if ((opening_into = this->getWorkspaceRootGroup(node.workspace_id)) == nullptr) {
130+ if ((opening_into = this->getWorkspaceRootGroup(node.workspace)) == nullptr) {
131 static const auto tab_first_window =
132 ConfigValue<Hyprlang::INT>("plugin:hy3:tab_first_window");
133
134@@ -191,7 +190,7 @@ void Hy3Layout::insertNode(Hy3Node& node) {
135 .data = height > width ? Hy3GroupLayout::SplitV : Hy3GroupLayout::SplitH,
136 .position = monitor->vecPosition + monitor->vecReservedTopLeft,
137 .size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight,
138- .workspace_id = node.workspace_id,
139+ .workspace = node.workspace,
140 .layout = this,
141diff --git a/src/Hy3Layout.hpp b/src/Hy3Layout.hpp
142index d269229f6acd6fdad1f84eef739146a5f189262b..93333c307b5d1cd7277c9a76b26ca00716d6f22e 100644
143--- a/src/Hy3Layout.hpp
144+++ b/src/Hy3Layout.hpp
145@@ -1,5 +1,6 @@
146 #pragma once
147
148+#include <hyprland/src/desktop/DesktopTypes.hpp>
149 class Hy3Layout;
150
151 enum class GroupEphemeralityOption {
152@@ -95,13 +96,13 @@ public:
153 virtual void onDisable();
154
155 void insertNode(Hy3Node& node);
156- void makeGroupOnWorkspace(int workspace, Hy3GroupLayout, GroupEphemeralityOption);
157- void makeOppositeGroupOnWorkspace(int workspace, GroupEphemeralityOption);
158- void changeGroupOnWorkspace(int workspace, Hy3GroupLayout);
159- void untabGroupOnWorkspace(int workspace);
160- void toggleTabGroupOnWorkspace(int workspace);
161- void changeGroupToOppositeOnWorkspace(int workspace);
162- void changeGroupEphemeralityOnWorkspace(int workspace, bool ephemeral);
163+ void makeGroupOnWorkspace(const PHLWORKSPACE& workspace, Hy3GroupLayout, GroupEphemeralityOption);
164+ void makeOppositeGroupOnWorkspace(const PHLWORKSPACE& workspace, GroupEphemeralityOption);
165+ void changeGroupOnWorkspace(const PHLWORKSPACE& workspace, Hy3GroupLayout);
166+ void untabGroupOnWorkspace(const PHLWORKSPACE& workspace);
167+ void toggleTabGroupOnWorkspace(const PHLWORKSPACE& workspace);
168+ void changeGroupToOppositeOnWorkspace(const PHLWORKSPACE& workspace);
169+ void changeGroupEphemeralityOnWorkspace(const PHLWORKSPACE& workspace, bool ephemeral);
170 void makeGroupOn(Hy3Node*, Hy3GroupLayout, GroupEphemeralityOption);
171 void makeOppositeGroupOn(Hy3Node*, GroupEphemeralityOption);
172 void changeGroupOn(Hy3Node&, Hy3GroupLayout);
173@@ -110,20 +111,20 @@ public:
174 void changeGroupToOppositeOn(Hy3Node&);
175 void changeGroupEphemeralityOn(Hy3Node&, bool ephemeral);
176 void shiftNode(Hy3Node&, ShiftDirection, bool once, bool visible);
177- void shiftWindow(int workspace, ShiftDirection, bool once, bool visible);
178- void shiftFocus(int workspace, ShiftDirection, bool visible);
179- void moveNodeToWorkspace(int origin, std::string wsname, bool follow);
180- void changeFocus(int workspace, FocusShift);
181- void focusTab(int workspace, TabFocus target, TabFocusMousePriority, bool wrap_scroll, int index);
182- void setNodeSwallow(int workspace, SetSwallowOption);
183- void killFocusedNode(int workspace);
184- void expand(int workspace, ExpandOption, ExpandFullscreenOption);
185+ void shiftWindow(const PHLWORKSPACE& workspace, ShiftDirection, bool once, bool visible);
186+ void shiftFocus(const PHLWORKSPACE& workspace, ShiftDirection, bool visible);
187+ void moveNodeToWorkspace(const PHLWORKSPACE& origin, std::string wsname, bool follow);
188+ void changeFocus(const PHLWORKSPACE& workspace, FocusShift);
189+ void focusTab(const PHLWORKSPACE& workspace, TabFocus target, TabFocusMousePriority, bool wrap_scroll, int index);
190+ void setNodeSwallow(const PHLWORKSPACE& workspace, SetSwallowOption);
191+ void killFocusedNode(const PHLWORKSPACE& workspace);
192+ void expand(const PHLWORKSPACE& workspace, ExpandOption, ExpandFullscreenOption);
193
194 bool shouldRenderSelected(CWindow*);
195
196- Hy3Node* getWorkspaceRootGroup(const int& workspace);
197+ Hy3Node* getWorkspaceRootGroup(const PHLWORKSPACE& workspace);
198 Hy3Node* getWorkspaceFocusedNode(
199- const int& workspace,
200+ const PHLWORKSPACE& workspace,
201 bool ignore_group_focus = false,
202 bool stop_at_expanded = false
203 );
204@@ -146,7 +147,7 @@ private:
205 Hy3Node* shiftOrGetFocus(Hy3Node&, ShiftDirection, bool shift, bool once, bool visible);
206
207 void updateAutotileWorkspaces();
208- bool shouldAutotileWorkspace(int);
209+ bool shouldAutotileWorkspace(const PHLWORKSPACE& workspace);
210 void resizeNode(Hy3Node*, Vector2D, ShiftDirection resize_edge_x, ShiftDirection resize_edge_y);
211
212 struct {
213diff --git a/src/Hy3Node.cpp b/src/Hy3Node.cpp
214index 5eed0fcffdb8883c48e8b33dc32d39e11ee9be5b..9572d7bacfa7c720dc03663d0d30d18cd3937cbb 100644
215--- a/src/Hy3Node.cpp
216+++ b/src/Hy3Node.cpp
217@@ -290,10 +290,9 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) {
218 // clang-format on
219
220 if (this->data.type == Hy3NodeType::Window && this->data.as_window->m_bIsFullscreen) {
221- auto* workspace = g_pCompositor->getWorkspaceByID(this->workspace_id);
222- auto* monitor = g_pCompositor->getMonitorFromID(workspace->m_iMonitorID);
223+ auto* monitor = g_pCompositor->getMonitorFromID(this->workspace->m_iMonitorID);
224
225- if (workspace->m_efFullscreenMode == FULLSCREEN_FULL) {
226+ if (this->workspace->m_efFullscreenMode == FULLSCREEN_FULL) {
227 this->data.as_window->m_vRealPosition = monitor->vecPosition;
228 this->data.as_window->m_vRealSize = monitor->vecSize;
229 return;
230@@ -305,7 +304,7 @@ void Hy3Node::recalcSizePosRecursive(bool no_animation) {
231 .size = monitor->vecSize - monitor->vecReservedTopLeft - monitor->vecReservedBottomRight,
232 .gap_topleft_offset = gap_topleft_offset,
233 .gap_bottomright_offset = gap_bottomright_offset,
234- .workspace_id = this->workspace_id,
235+ .workspace = this->workspace,
236 };
237
238 this->layout->applyNodeDataToWindow(&fake_node);
239@@ -522,7 +521,7 @@ void Hy3Node::updateTabBar(bool no_animation) {
240 FindTopWindowInNodeResult result;
241 findTopWindowInNode(*this, result);
242 group.tab_bar->target_window = result.window;
243- if (result.window != nullptr) group.tab_bar->workspace_id = result.window->m_iWorkspaceID;
244+ if (result.window != nullptr) group.tab_bar->workspace = result.window->m_pWorkspace;
245 } else if (group.tab_bar != nullptr) {
246 group.tab_bar->bar.beginDestroy();
247 group.tab_bar = nullptr;
248@@ -771,7 +770,7 @@ Hy3Node* Hy3Node::intoGroup(Hy3GroupLayout layout, GroupEphemeralityOption ephem
249 this->layout->nodes.push_back({
250 .parent = this,
251 .data = layout,
252- .workspace_id = this->workspace_id,
253+ .workspace = this->workspace,
254 .layout = this->layout,
255 });
256
257diff --git a/src/Hy3Node.hpp b/src/Hy3Node.hpp
258index 759feaf777e8cb83b671db50c136f30c6af3b7a0..772d01fc612569225a3849477cbfdbccf623d5d0 100644
259--- a/src/Hy3Node.hpp
260+++ b/src/Hy3Node.hpp
261@@ -87,7 +87,7 @@ struct Hy3Node {
262 Vector2D gap_topleft_offset;
263 Vector2D gap_bottomright_offset;
264 float size_ratio = 1.0;
265- int workspace_id = -1;
266+ PHLWORKSPACE workspace = nullptr;
267 bool hidden = false;
268 Hy3Layout* layout = nullptr;
269
270diff --git a/src/TabGroup.cpp b/src/TabGroup.cpp
271index 46651dded0fbe1a566861dc8e2a90579bf8b2b26..08fe876a3886f5066678ab9548df298cafb16f5b 100644
272--- a/src/TabGroup.cpp
273+++ b/src/TabGroup.cpp
274@@ -444,12 +444,11 @@ void Hy3TabGroup::updateWithGroup(Hy3Node& node, bool warp) {
275 void Hy3TabGroup::tick() {
276 static const auto enter_from_top = ConfigValue<Hyprlang::INT>("plugin:hy3:tabs:from_top");
277 static const auto padding = ConfigValue<Hyprlang::INT>("plugin:hy3:tabs:padding");
278- auto* workspace = g_pCompositor->getWorkspaceByID(this->workspace_id);
279
280 this->bar.tick();
281
282- if (workspace != nullptr) {
283- if (workspace->m_bHasFullscreenWindow) {
284+ if (valid(this->workspace)) {
285+ if (this->workspace->m_bHasFullscreenWindow) {
286 if (this->bar.fade_opacity.goal() != 0.0) this->bar.fade_opacity = 0.0;
287 } else {
288 if (this->bar.fade_opacity.goal() != 1.0) this->bar.fade_opacity = 1.0;
289@@ -489,15 +488,14 @@ void Hy3TabGroup::renderTabBar() {
290 static const auto padding = ConfigValue<Hyprlang::INT>("plugin:hy3:tabs:padding");
291
292 auto* monitor = g_pHyprOpenGL->m_RenderData.pMonitor;
293- auto* workspace = g_pCompositor->getWorkspaceByID(this->workspace_id);
294 auto scale = monitor->scale;
295
296 auto monitor_size = monitor->vecSize;
297 auto pos = this->pos.value() - monitor->vecPosition;
298 auto size = this->size.value();
299
300- if (workspace != nullptr) {
301- pos = pos + workspace->m_vRenderOffset.value();
302+ if (valid(this->workspace)) {
303+ pos = pos + this->workspace->m_vRenderOffset.value();
304 }
305
306 auto scaled_pos = Vector2D(std::round(pos.x * scale), std::round(pos.y * scale));
307@@ -563,7 +561,7 @@ void Hy3TabGroup::renderTabBar() {
308 }
309
310 auto fade_opacity =
311- this->bar.fade_opacity.value() * (workspace == nullptr ? 1.0 : workspace->m_fAlpha.value());
312+ this->bar.fade_opacity.value() * (valid(this->workspace) ? this->workspace->m_fAlpha.value() : 1.0);
313
314 auto render_entry = [&](Hy3TabBarEntry& entry) {
315 Vector2D entry_pos = {
316diff --git a/src/TabGroup.hpp b/src/TabGroup.hpp
317index 77f78745d90b3d22c10ec7cc98dc063b27000033..3d776243c9bdfc7b2c9c6e446dd95da8ab593818 100644
318--- a/src/TabGroup.hpp
319+++ b/src/TabGroup.hpp
320@@ -86,7 +86,7 @@ private:
321 class Hy3TabGroup {
322 public:
323 CWindow* target_window = nullptr;
324- int workspace_id = -1;
325+ PHLWORKSPACE workspace = nullptr;
326 bool hidden = false;
327 Hy3TabBar bar;
328 CAnimatedVariable<Vector2D> pos;
329diff --git a/src/dispatchers.cpp b/src/dispatchers.cpp
330index 667b1cf7a8e4599523ffd8192105aa3b599d8964..843b17a8d40ae9167629f55292c42bb98b411fbe 100644
331--- a/src/dispatchers.cpp
332+++ b/src/dispatchers.cpp
333@@ -1,27 +1,26 @@
334 #include <optional>
335
336 #include <hyprland/src/Compositor.hpp>
337+#include <hyprland/src/desktop/DesktopTypes.hpp>
338 #include <hyprland/src/plugins/PluginAPI.hpp>
339
340 #include "dispatchers.hpp"
341 #include "globals.hpp"
342
343-int workspace_for_action(bool allow_fullscreen = false) {
344- if (g_pLayoutManager->getCurrentLayout() != g_Hy3Layout.get()) return -1;
345+PHLWORKSPACE workspace_for_action(bool allow_fullscreen = false) {
346+ if (g_pLayoutManager->getCurrentLayout() != g_Hy3Layout.get()) return nullptr;
347
348- int workspace_id = g_pCompositor->m_pLastMonitor->activeWorkspace;
349+ auto workspace = g_pCompositor->m_pLastMonitor->activeWorkspace;
350
351- if (workspace_id == -1) return -1;
352- auto* workspace = g_pCompositor->getWorkspaceByID(workspace_id);
353- if (workspace == nullptr) return -1;
354- if (!allow_fullscreen && workspace->m_bHasFullscreenWindow) return -1;
355+ if (!valid(workspace)) return nullptr;
356+ if (!allow_fullscreen && workspace->m_bHasFullscreenWindow) return nullptr;
357
358- return workspace_id;
359+ return workspace;
360 }
361
362 void dispatch_makegroup(std::string value) {
363- int workspace = workspace_for_action();
364- if (workspace == -1) return;
365+ auto workspace = workspace_for_action();
366+ if (!valid(workspace)) return;
367
368 auto args = CVarList(value);
369
370@@ -44,8 +43,8 @@ void dispatch_makegroup(std::string value) {
371 }
372
373 void dispatch_changegroup(std::string value) {
374- int workspace = workspace_for_action();
375- if (workspace == -1) return;
376+ auto workspace = workspace_for_action();
377+ if (!valid(workspace)) return;
378
379 auto args = CVarList(value);
380
381@@ -65,8 +64,8 @@ void dispatch_changegroup(std::string value) {
382 }
383
384 void dispatch_setephemeral(std::string value) {
385- int workspace = workspace_for_action();
386- if (workspace == -1) return;
387+ auto workspace = workspace_for_action();
388+ if (!valid(workspace)) return;
389
390 auto args = CVarList(value);
391
392@@ -84,8 +83,8 @@ std::optional<ShiftDirection> parseShiftArg(std::string arg) {
393 }
394
395 void dispatch_movewindow(std::string value) {
396- int workspace = workspace_for_action();
397- if (workspace == -1) return;
398+ auto workspace = workspace_for_action();
399+ if (!valid(workspace)) return;
400
401 auto args = CVarList(value);
402
403@@ -109,8 +108,8 @@ void dispatch_movewindow(std::string value) {
404 }
405
406 void dispatch_movefocus(std::string value) {
407- int workspace = workspace_for_action();
408- if (workspace == -1) return;
409+ auto workspace = workspace_for_action();
410+ if (!valid(workspace)) return;
411
412 auto args = CVarList(value);
413
414@@ -120,8 +119,8 @@ void dispatch_movefocus(std::string value) {
415 }
416
417 void dispatch_move_to_workspace(std::string value) {
418- int origin_workspace = workspace_for_action(true);
419- if (origin_workspace == -1) return;
420+ auto origin_workspace = workspace_for_action(true);
421+ if (!valid(origin_workspace)) return;
422
423 auto args = CVarList(value);
424
425@@ -134,8 +133,8 @@ void dispatch_move_to_workspace(std::string value) {
426 }
427
428 void dispatch_changefocus(std::string arg) {
429- int workspace = workspace_for_action();
430- if (workspace == -1) return;
431+ auto workspace = workspace_for_action();
432+ if (!valid(workspace)) return;
433diff --git a/src/globals.hpp b/src/globals.hpp
434index 48839ca34b5ca87ab3721242200c680df7fc176d..ede0c8f054abd8d1499a4da5fb83144d8425868d 100644
435--- a/src/globals.hpp
436+++ b/src/globals.hpp
437@@ -2,6 +2,7 @@
438
439 #include <type_traits>
440
441+#include <hyprland/src/desktop/Workspace.hpp>
442 #include <hyprland/src/plugins/PluginAPI.hpp>
443 #include <hyprlang.hpp>
444