77
88#define private public
99#include < hyprland/src/Compositor.hpp>
10+ #include < hyprland/src/desktop/state/FocusState.hpp>
1011#include < hyprland/src/desktop/Window.hpp>
1112#include < hyprland/src/config/ConfigManager.hpp>
1213#include < hyprland/src/render/Renderer.hpp>
@@ -28,19 +29,22 @@ APICALL EXPORT std::string PLUGIN_API_VERSION() {
2829static SDispatchResult moveOrExec (std::string in) {
2930 CVarList vars (in, 0 , ' ,' );
3031
31- if (!g_pCompositor->m_lastMonitor || !g_pCompositor->m_lastMonitor ->m_activeWorkspace )
32+ auto focusState = Desktop::focusState ();
33+ auto monitor = focusState->monitor ();
34+
35+ if (!monitor || !monitor->m_activeWorkspace )
3236 return SDispatchResult{.success = false , .error = " No active workspace" };
3337
3438 const auto PWINDOW = g_pCompositor->getWindowByRegex (vars[0 ]);
3539
3640 if (!PWINDOW)
3741 g_pKeybindManager->spawn (vars[1 ]);
3842 else {
39- if (g_pCompositor-> m_lastMonitor ->m_activeWorkspace != PWINDOW->m_workspace )
40- g_pCompositor->moveWindowToWorkspaceSafe (PWINDOW, g_pCompositor-> m_lastMonitor ->m_activeWorkspace );
43+ if (monitor ->m_activeWorkspace != PWINDOW->m_workspace )
44+ g_pCompositor->moveWindowToWorkspaceSafe (PWINDOW, monitor ->m_activeWorkspace );
4145 else
4246 g_pCompositor->warpCursorTo (PWINDOW->middle ());
43- g_pCompositor-> focusWindow (PWINDOW);
47+ focusState-> fullWindowFocus (PWINDOW);
4448 }
4549
4650 return SDispatchResult{};
@@ -52,15 +56,18 @@ static SDispatchResult throwUnfocused(std::string in) {
5256 if (id == WORKSPACE_INVALID)
5357 return SDispatchResult{.success = false , .error = " Failed to find workspace" };
5458
55- if (!g_pCompositor->m_lastWindow || !g_pCompositor->m_lastWindow ->m_workspace )
59+ auto focusState = Desktop::focusState ();
60+ auto window = focusState->window ();
61+
62+ if (!window || !window->m_workspace )
5663 return SDispatchResult{.success = false , .error = " No valid last window" };
5764
5865 auto pWorkspace = g_pCompositor->getWorkspaceByID (id);
5966 if (!pWorkspace)
60- pWorkspace = g_pCompositor->createNewWorkspace (id, g_pCompositor-> m_lastWindow ->m_workspace ->monitorID (), name, false );
67+ pWorkspace = g_pCompositor->createNewWorkspace (id, window ->m_workspace ->monitorID (), name, false );
6168
6269 for (const auto & w : g_pCompositor->m_windows ) {
63- if (w == g_pCompositor-> m_lastWindow || w->m_workspace != g_pCompositor-> m_lastWindow ->m_workspace )
70+ if (w == window || w->m_workspace != window ->m_workspace )
6471 continue ;
6572
6673 g_pCompositor->moveWindowToWorkspaceSafe (w, pWorkspace);
@@ -75,36 +82,44 @@ static SDispatchResult bringAllFrom(std::string in) {
7582 if (id == WORKSPACE_INVALID)
7683 return SDispatchResult{.success = false , .error = " Failed to find workspace" };
7784
78- if (!g_pCompositor->m_lastMonitor || !g_pCompositor->m_lastMonitor ->m_activeWorkspace )
85+ auto focusState = Desktop::focusState ();
86+ auto monitor = focusState->monitor ();
87+ auto window = focusState->window ();
88+
89+ if (!monitor || !monitor->m_activeWorkspace )
7990 return SDispatchResult{.success = false , .error = " No active monitor" };
8091
8192 auto pWorkspace = g_pCompositor->getWorkspaceByID (id);
8293 if (!pWorkspace)
8394 return SDispatchResult{.success = false , .error = " Workspace isnt open" };
8495
85- const auto PLASTWINDOW = g_pCompositor-> m_lastWindow . lock () ;
96+ const auto PLASTWINDOW = window ;
8697
8798 for (const auto & w : g_pCompositor->m_windows ) {
8899 if (w->m_workspace != pWorkspace)
89100 continue ;
90101
91- g_pCompositor->moveWindowToWorkspaceSafe (w, g_pCompositor-> m_lastMonitor ->m_activeWorkspace );
102+ g_pCompositor->moveWindowToWorkspaceSafe (w, monitor ->m_activeWorkspace );
92103 }
93104
94105 if (PLASTWINDOW) {
95- g_pCompositor-> focusWindow (PLASTWINDOW);
106+ Desktop::focusState ()-> fullWindowFocus (PLASTWINDOW);
96107 g_pCompositor->warpCursorTo (PLASTWINDOW->middle ());
97108 }
98109
99110 return SDispatchResult{};
100111}
101112
102113static SDispatchResult closeUnfocused (std::string in) {
103- if (!g_pCompositor->m_lastMonitor )
114+ auto focusState = Desktop::focusState ();
115+ auto monitor = focusState->monitor ();
116+ auto window = focusState->window ();
117+
118+ if (!window)
104119 return SDispatchResult{.success = false , .error = " No focused monitor" };
105120
106121 for (const auto & w : g_pCompositor->m_windows ) {
107- if (w->m_workspace != g_pCompositor-> m_lastMonitor -> m_activeWorkspace || w->m_monitor != g_pCompositor-> m_lastMonitor || !w->m_isMapped || w == g_pCompositor-> m_lastWindow )
122+ if (w->m_workspace != monitor-> m_activeWorkspace || w->m_monitor != monitor || !w->m_isMapped || w == window )
108123 continue ;
109124
110125 g_pCompositor->closeWindow (w);
0 commit comments