all: chase hyprland for 40d8fa8 (#549)

* hyprexpo: Fixes for 40d8fa8

* csgo-vulkan-fix: Fixes for 40d8fa8

* hyprbars: Fixes for 40d8fa8

I am not entirely sure whether I was supposed to use fullWindowFocus()
or rawWindowFocus() in hyprbars/barDeco.cpp at line 220

* xtra-dispatchers: Fixes for 40d8fa8

I am not entirely sure whether I was supposed to use fullWindowFocus()
or rawWindowFocus() in xtra-dispatchers/main.cpp at lines 47 and 106

* hyprscrolling: Fixes for 40d8fa8

A lot of repeated code can be removed if it's safe to store
`Desktop::focusState()`, `Desktop::focusState()->monitor()` and
`Desktop::focusState()->window()` at the top of the
`CScrollingLayout::findBestNeighbor` function.
This change requires further review as I don't know if any of those
change during this function so I didn't wanna introduce any unexpected
issues.
I am not entirely sure whether I was supposed to use fullWindowFocus()
or rawWindowFocus() in xtra-dispatchers/main.cpp at lines 786, 789 and
1344
This commit is contained in:
nnra
2025-11-26 23:10:33 +01:00
committed by GitHub
parent 7ffc0b314e
commit 84659a2502
7 changed files with 83 additions and 55 deletions

View File

@ -3,6 +3,7 @@
#include <unistd.h>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/desktop/Window.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/xwayland/XSurface.hpp>
@ -46,14 +47,17 @@ static const SAppConfig* getAppConfig(const std::string& appClass) {
void hkNotifyMotion(CSeatManager* thisptr, uint32_t time_msec, const Vector2D& local) {
static auto* const PFIX = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:csgo-vulkan-fix:fix_mouse")->getDataStaticPtr();
Vector2D newCoords = local;
Vector2D newCoords = local;
auto focusState = Desktop::focusState();
auto window = focusState->window();
auto monitor = focusState->monitor();
const auto CONFIG = g_pCompositor->m_lastWindow && g_pCompositor->m_lastMonitor ? getAppConfig(g_pCompositor->m_lastWindow->m_initialClass) : nullptr;
const auto CONFIG = window && monitor ? getAppConfig(window->m_initialClass) : nullptr;
if (**PFIX && CONFIG) {
// fix the coords
newCoords.x *= (CONFIG->res.x / g_pCompositor->m_lastMonitor->m_size.x) / g_pCompositor->m_lastWindow->m_X11SurfaceScaledBy;
newCoords.y *= (CONFIG->res.y / g_pCompositor->m_lastMonitor->m_size.y) / g_pCompositor->m_lastWindow->m_X11SurfaceScaledBy;
newCoords.x *= (CONFIG->res.x / monitor->m_size.x) / window->m_X11SurfaceScaledBy;
newCoords.y *= (CONFIG->res.y / monitor->m_size.y) / window->m_X11SurfaceScaledBy;
}
(*(origMotion)g_pMouseMotionHook->m_original)(thisptr, time_msec, newCoords);

View File

@ -1,6 +1,7 @@
#include "barDeco.hpp"
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/desktop/Window.hpp>
#include <hyprland/src/helpers/MiscFunctions.hpp>
#include <hyprland/src/managers/SeatManager.hpp>
@ -90,11 +91,15 @@ bool CHyprBar::inputIsValid() {
const auto WINDOWATCURSOR = g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (WINDOWATCURSOR != m_pWindow && m_pWindow != g_pCompositor->m_lastWindow)
auto focusState = Desktop::focusState();
auto window = focusState->window();
auto monitor = focusState->monitor();
if (WINDOWATCURSOR != m_pWindow && m_pWindow != window)
return false;
// check if input is on top or overlay shell layers
auto PMONITOR = g_pCompositor->m_lastMonitor.lock();
auto PMONITOR = monitor;
PHLLS foundSurface = nullptr;
Vector2D surfaceCoords;
@ -158,7 +163,7 @@ void CHyprBar::onTouchMove(SCallbackInfo& info, ITouch::SMotionEvent e) {
return;
auto PMONITOR = m_pWindow->m_monitor.lock();
PMONITOR = PMONITOR ? PMONITOR : g_pCompositor->m_lastMonitor.lock();
PMONITOR = PMONITOR ? PMONITOR : Desktop::focusState()->monitor();
const auto COORDS = Vector2D(PMONITOR->m_position.x + e.pos.x * PMONITOR->m_size.x, PMONITOR->m_position.y + e.pos.y * PMONITOR->m_size.y);
if (!m_bDraggingThis) {
@ -183,7 +188,7 @@ void CHyprBar::handleDownEvent(SCallbackInfo& info, std::optional<ITouch::SDownE
if (m_bTouchEv) {
ITouch::SDownEvent e = touchEvent.value();
auto PMONITOR = g_pCompositor->getMonitorFromName(!e.device->m_boundOutput.empty() ? e.device->m_boundOutput : "");
PMONITOR = PMONITOR ? PMONITOR : g_pCompositor->m_lastMonitor.lock();
PMONITOR = PMONITOR ? PMONITOR : Desktop::focusState()->monitor();
COORDS = Vector2D(PMONITOR->m_position.x + e.pos.x * PMONITOR->m_size.x, PMONITOR->m_position.y + e.pos.y * PMONITOR->m_size.y) - assignedBoxGlobal().pos();
}
@ -211,8 +216,8 @@ void CHyprBar::handleDownEvent(SCallbackInfo& info, std::optional<ITouch::SDownE
return;
}
if (g_pCompositor->m_lastWindow.lock() != PWINDOW)
g_pCompositor->focusWindow(PWINDOW);
if (Desktop::focusState()->window() != PWINDOW)
Desktop::focusState()->fullWindowFocus(PWINDOW);
if (PWINDOW->m_isFloating)
g_pCompositor->changeWindowZOrder(PWINDOW, true);
@ -234,7 +239,7 @@ void CHyprBar::handleDownEvent(SCallbackInfo& info, std::optional<ITouch::SDownE
}
void CHyprBar::handleUpEvent(SCallbackInfo& info) {
if (m_pWindow.lock() != g_pCompositor->m_lastWindow.lock())
if (m_pWindow.lock() != Desktop::focusState()->window())
return;
if (m_bCancelledDown)
@ -593,7 +598,7 @@ void CHyprBar::renderPass(PHLMONITOR pMonitor, const float& a) {
static auto* const PINACTIVECOLOR = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprbars:inactive_button_color")->getDataStaticPtr();
if (**PINACTIVECOLOR > 0) {
bool currentWindowFocus = PWINDOW == g_pCompositor->m_lastWindow.lock();
bool currentWindowFocus = PWINDOW == Desktop::focusState()->window();
if (currentWindowFocus != m_bWindowHasFocus) {
m_bWindowHasFocus = currentWindowFocus;
m_bButtonsDirty = true;

View File

@ -3,6 +3,7 @@
#include "overview.hpp"
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/helpers/Monitor.hpp>
void CExpoGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) {
@ -12,7 +13,7 @@ void CExpoGesture::begin(const ITrackpadGesture::STrackpadGestureBegin& e) {
m_firstUpdate = true;
if (!g_pOverview)
g_pOverview = std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
g_pOverview = std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
else {
g_pOverview->selectHoveredWorkspace();
g_pOverview->setClosing(true);

View File

@ -3,6 +3,7 @@
#include <unistd.h>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/desktop/Window.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/desktop/DesktopTypes.hpp>
@ -81,7 +82,7 @@ static SDispatchResult onExpoDispatcher(std::string arg) {
g_pOverview->close();
else {
renderingOverview = true;
g_pOverview = std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
g_pOverview = std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
renderingOverview = false;
}
return {};
@ -97,7 +98,7 @@ static SDispatchResult onExpoDispatcher(std::string arg) {
return {};
renderingOverview = true;
g_pOverview = std::make_unique<COverview>(g_pCompositor->m_lastMonitor->m_activeWorkspace);
g_pOverview = std::make_unique<COverview>(Desktop::focusState()->monitor()->m_activeWorkspace);
renderingOverview = false;
return {};
}

View File

@ -3,6 +3,7 @@
#define private public
#include <hyprland/src/render/Renderer.hpp>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/config/ConfigValue.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/managers/animation/AnimationManager.hpp>
@ -29,7 +30,7 @@ COverview::~COverview() {
}
COverview::COverview(PHLWORKSPACE startedOn_, bool swipe_) : startedOn(startedOn_), swipe(swipe_) {
const auto PMONITOR = g_pCompositor->m_lastMonitor.lock();
const auto PMONITOR = Desktop::focusState()->monitor();
pMonitor = PMONITOR;
static auto* const* PCOLUMNS = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:hyprexpo:columns")->getDataStaticPtr();

View File

@ -3,6 +3,7 @@
#include <algorithm>
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/managers/input/InputManager.hpp>
#include <hyprland/src/managers/eventLoop/EventLoopManager.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
@ -534,7 +535,7 @@ void CScrollingLayout::onWindowCreatedTiling(PHLWINDOW window, eDirection direct
workspaceData->self = workspaceData;
}
auto droppingOn = g_pCompositor->m_lastWindow.lock();
auto droppingOn = Desktop::focusState()->window();
if (droppingOn == window)
droppingOn = g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), RESERVED_EXTENTS | INPUT_EXTENTS);
@ -630,7 +631,7 @@ void CScrollingLayout::onBeginDragWindow() {
}
void CScrollingLayout::resizeActiveWindow(const Vector2D& delta, eRectCorner corner, PHLWINDOW pWindow) {
const auto PWINDOW = pWindow ? pWindow : g_pCompositor->m_lastWindow.lock();
const auto PWINDOW = pWindow ? pWindow : Desktop::focusState()->window();
Vector2D modDelta = delta;
if (!validMapped(PWINDOW))
@ -782,10 +783,10 @@ void CScrollingLayout::fullscreenRequestForWindow(PHLWINDOW pWindow, const eFull
void CScrollingLayout::focusWindowUpdate(PHLWINDOW pWindow) {
if (!validMapped(pWindow)) {
g_pCompositor->focusWindow(nullptr);
Desktop::focusState()->fullWindowFocus(nullptr);
return;
}
g_pCompositor->focusWindow(pWindow);
Desktop::focusState()->fullWindowFocus(pWindow);
const auto WINDOWDATA = dataFor(pWindow);
if (WINDOWDATA) {
if (auto col = WINDOWDATA->column.lock())
@ -841,7 +842,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
return {};
if (ARGS[1] == "+col" || ARGS[1] == "col") {
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA)
return {};
@ -862,7 +863,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
return {};
} else if (ARGS[1] == "-col") {
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA) {
if (DATA->leftOffset <= DATA->maxWidth() && DATA->columns.size() > 0) {
DATA->centerCol(DATA->columns.back());
@ -899,7 +900,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
focusWindowUpdate(ATCENTER ? (*ATCENTER->windowDatas.begin())->window.lock() : nullptr);
} else if (ARGS[0] == "colresize") {
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA)
return {};
@ -968,13 +969,13 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->column->columnWidth = abs;
}
} else if (ARGS[0] == "movewindowto") {
moveWindowTo(g_pCompositor->m_lastWindow.lock(), ARGS[1], false);
moveWindowTo(Desktop::focusState()->window(), ARGS[1], false);
} else if (ARGS[0] == "fit") {
if (ARGS[1] == "active") {
// fit the current column to 1.F
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WORKDATA = dataFor(g_pCompositor->m_lastWindow->m_workspace);
const auto WDATA = dataFor(Desktop::focusState()->window());
const auto WORKDATA = dataFor(Desktop::focusState()->window()->m_workspace);
if (!WDATA || !WORKDATA || WORKDATA->columns.size() == 0)
return {};
@ -985,7 +986,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WORKDATA->leftOffset = 0;
for (size_t i = 0; i < WORKDATA->columns.size(); ++i) {
if (WORKDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
if (WORKDATA->columns[i]->has(Desktop::focusState()->window()))
break;
WORKDATA->leftOffset += USABLE.w * WORKDATA->columns[i]->columnWidth;
@ -994,7 +995,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->column->workspace->recalculate();
} else if (ARGS[1] == "all") {
// fit all columns on screen
const auto WDATA = dataFor(g_pCompositor->m_lastWindow->m_workspace);
const auto WDATA = dataFor(Desktop::focusState()->window()->m_workspace);
if (!WDATA || WDATA->columns.size() == 0)
return {};
@ -1007,7 +1008,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->recalculate();
} else if (ARGS[1] == "toend") {
// fit all columns on screen that start from the current and end on the last
const auto WDATA = dataFor(g_pCompositor->m_lastWindow->m_workspace);
const auto WDATA = dataFor(Desktop::focusState()->window()->m_workspace);
if (!WDATA || WDATA->columns.size() == 0)
return {};
@ -1015,7 +1016,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
bool begun = false;
size_t foundAt = 0;
for (size_t i = 0; i < WDATA->columns.size(); ++i) {
if (!begun && !WDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
if (!begun && !WDATA->columns[i]->has(Desktop::focusState()->window()))
continue;
if (!begun) {
@ -1039,7 +1040,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->recalculate();
} else if (ARGS[1] == "tobeg") {
// fit all columns on screen that start from the current and end on the last
const auto WDATA = dataFor(g_pCompositor->m_lastWindow->m_workspace);
const auto WDATA = dataFor(Desktop::focusState()->window()->m_workspace);
if (!WDATA || WDATA->columns.size() == 0)
return {};
@ -1047,7 +1048,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
bool begun = false;
size_t foundAt = 0;
for (int64_t i = (int64_t)WDATA->columns.size() - 1; i >= 0; --i) {
if (!begun && !WDATA->columns[i]->has(g_pCompositor->m_lastWindow.lock()))
if (!begun && !WDATA->columns[i]->has(Desktop::focusState()->window()))
continue;
if (!begun) {
@ -1066,7 +1067,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->recalculate();
} else if (ARGS[1] == "visible") {
// fit all columns on screen that start from the current and end on the last
const auto WDATA = dataFor(g_pCompositor->m_lastWindow->m_workspace);
const auto WDATA = dataFor(Desktop::focusState()->window()->m_workspace);
if (!WDATA || WDATA->columns.size() == 0)
return {};
@ -1109,7 +1110,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
WDATA->recalculate();
}
} else if (ARGS[0] == "focus") {
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
static const auto PNOFALLBACK = CConfigValue<Hyprlang::INT>("general:no_focus_fallback");
if (!WDATA || ARGS[1].empty())
@ -1193,7 +1194,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
default: return {};
}
} else if (ARGS[0] == "promote") {
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA)
return {};
@ -1210,7 +1211,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
if (ARGS.size() < 2)
return {};
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA)
return {};
@ -1245,7 +1246,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
if (ARGS.size() < 2)
return {};
const auto WDATA = dataFor(g_pCompositor->m_lastWindow.lock());
const auto WDATA = dataFor(Desktop::focusState()->window());
if (!WDATA)
return {};
@ -1257,7 +1258,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
if (!SOURCE_WS_DATA)
return {};
const auto PMONITOR = g_pCompositor->m_lastWindow->m_monitor.lock();
const auto PMONITOR = Desktop::focusState()->monitor();
if (!PMONITOR)
return {};
@ -1340,7 +1341,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
g_pCompositor->moveWindowToWorkspaceSafe(win, PWORKSPACE);
}
g_pCompositor->focusWindow(windowsToMove.front());
Desktop::focusState()->fullWindowFocus(windowsToMove.front());
g_pCompositor->warpCursorTo(windowsToMove.front()->middle());
} else if (ARGS[0] == "togglefit") {
static const auto PFITMETHOD = CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:focus_fit_method");
@ -1349,7 +1350,7 @@ std::any CScrollingLayout::layoutMessage(SLayoutMessageHeader header, std::strin
fitMethod = toggled;
const auto focusedData = dataFor(g_pCompositor->m_lastWindow.lock());
const auto focusedData = dataFor(Desktop::focusState()->window());
static const auto PFSONONE = CConfigValue<Hyprlang::INT>("plugin:hyprscrolling:fullscreen_on_one_column");
for (const auto& ws : m_workspaceDatas) {
@ -1528,12 +1529,12 @@ SP<SScrollingWindowData> CScrollingLayout::dataFor(PHLWINDOW w) {
}
SP<SWorkspaceData> CScrollingLayout::currentWorkspaceData() {
if (!g_pCompositor->m_lastMonitor || !g_pCompositor->m_lastMonitor->m_activeWorkspace)
if (!Desktop::focusState()->monitor() || !Desktop::focusState()->monitor()->m_activeWorkspace)
return nullptr;
// FIXME: special
return dataFor(g_pCompositor->m_lastMonitor->m_activeWorkspace);
return dataFor(Desktop::focusState()->monitor()->m_activeWorkspace);
}
CBox CScrollingLayout::usableAreaFor(PHLMONITOR m) {

View File

@ -7,6 +7,7 @@
#define private public
#include <hyprland/src/Compositor.hpp>
#include <hyprland/src/desktop/state/FocusState.hpp>
#include <hyprland/src/desktop/Window.hpp>
#include <hyprland/src/config/ConfigManager.hpp>
#include <hyprland/src/render/Renderer.hpp>
@ -28,7 +29,10 @@ APICALL EXPORT std::string PLUGIN_API_VERSION() {
static SDispatchResult moveOrExec(std::string in) {
CVarList vars(in, 0, ',');
if (!g_pCompositor->m_lastMonitor || !g_pCompositor->m_lastMonitor->m_activeWorkspace)
auto focusState = Desktop::focusState();
auto monitor = focusState->monitor();
if (!monitor || !monitor->m_activeWorkspace)
return SDispatchResult{.success = false, .error = "No active workspace"};
const auto PWINDOW = g_pCompositor->getWindowByRegex(vars[0]);
@ -36,11 +40,11 @@ static SDispatchResult moveOrExec(std::string in) {
if (!PWINDOW)
g_pKeybindManager->spawn(vars[1]);
else {
if (g_pCompositor->m_lastMonitor->m_activeWorkspace != PWINDOW->m_workspace)
g_pCompositor->moveWindowToWorkspaceSafe(PWINDOW, g_pCompositor->m_lastMonitor->m_activeWorkspace);
if (monitor->m_activeWorkspace != PWINDOW->m_workspace)
g_pCompositor->moveWindowToWorkspaceSafe(PWINDOW, monitor->m_activeWorkspace);
else
g_pCompositor->warpCursorTo(PWINDOW->middle());
g_pCompositor->focusWindow(PWINDOW);
focusState->fullWindowFocus(PWINDOW);
}
return SDispatchResult{};
@ -52,15 +56,18 @@ static SDispatchResult throwUnfocused(std::string in) {
if (id == WORKSPACE_INVALID)
return SDispatchResult{.success = false, .error = "Failed to find workspace"};
if (!g_pCompositor->m_lastWindow || !g_pCompositor->m_lastWindow->m_workspace)
auto focusState = Desktop::focusState();
auto window = focusState->window();
if (!window || !window->m_workspace)
return SDispatchResult{.success = false, .error = "No valid last window"};
auto pWorkspace = g_pCompositor->getWorkspaceByID(id);
if (!pWorkspace)
pWorkspace = g_pCompositor->createNewWorkspace(id, g_pCompositor->m_lastWindow->m_workspace->monitorID(), name, false);
pWorkspace = g_pCompositor->createNewWorkspace(id, window->m_workspace->monitorID(), name, false);
for (const auto& w : g_pCompositor->m_windows) {
if (w == g_pCompositor->m_lastWindow || w->m_workspace != g_pCompositor->m_lastWindow->m_workspace)
if (w == window || w->m_workspace != window->m_workspace)
continue;
g_pCompositor->moveWindowToWorkspaceSafe(w, pWorkspace);
@ -75,24 +82,28 @@ static SDispatchResult bringAllFrom(std::string in) {
if (id == WORKSPACE_INVALID)
return SDispatchResult{.success = false, .error = "Failed to find workspace"};
if (!g_pCompositor->m_lastMonitor || !g_pCompositor->m_lastMonitor->m_activeWorkspace)
auto focusState = Desktop::focusState();
auto monitor = focusState->monitor();
auto window = focusState->window();
if (!monitor || !monitor->m_activeWorkspace)
return SDispatchResult{.success = false, .error = "No active monitor"};
auto pWorkspace = g_pCompositor->getWorkspaceByID(id);
if (!pWorkspace)
return SDispatchResult{.success = false, .error = "Workspace isnt open"};
const auto PLASTWINDOW = g_pCompositor->m_lastWindow.lock();
const auto PLASTWINDOW = window;
for (const auto& w : g_pCompositor->m_windows) {
if (w->m_workspace != pWorkspace)
continue;
g_pCompositor->moveWindowToWorkspaceSafe(w, g_pCompositor->m_lastMonitor->m_activeWorkspace);
g_pCompositor->moveWindowToWorkspaceSafe(w, monitor->m_activeWorkspace);
}
if (PLASTWINDOW) {
g_pCompositor->focusWindow(PLASTWINDOW);
Desktop::focusState()->fullWindowFocus(PLASTWINDOW);
g_pCompositor->warpCursorTo(PLASTWINDOW->middle());
}
@ -100,11 +111,15 @@ static SDispatchResult bringAllFrom(std::string in) {
}
static SDispatchResult closeUnfocused(std::string in) {
if (!g_pCompositor->m_lastMonitor)
auto focusState = Desktop::focusState();
auto monitor = focusState->monitor();
auto window = focusState->window();
if (!window)
return SDispatchResult{.success = false, .error = "No focused monitor"};
for (const auto& w : g_pCompositor->m_windows) {
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)
if (w->m_workspace != monitor->m_activeWorkspace || w->m_monitor != monitor || !w->m_isMapped || w == window)
continue;
g_pCompositor->closeWindow(w);