aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorVaxry <[email protected]>2024-11-22 16:01:02 +0000
committerVaxry <[email protected]>2024-11-22 16:01:02 +0000
commit745a82ce8ab19d958e344f5925bb1dc8ea7d6a53 (patch)
tree6ef992f0b52c5ca2492e248d5433f8edbc7cb1ba
parenta847bc67b1efcf3a0fa9c8a3a1da1a79743940c1 (diff)
downloadHyprland-745a82ce8ab19d958e344f5925bb1dc8ea7d6a53.tar.gz
Hyprland-745a82ce8ab19d958e344f5925bb1dc8ea7d6a53.zip
core: workspace-related function cleanup / refactor
CCompositor is massive, and has a lot of functions that could be better optimized if in CWorkspace
-rw-r--r--src/Compositor.cpp182
-rw-r--r--src/Compositor.hpp13
-rw-r--r--src/config/ConfigManager.cpp4
-rw-r--r--src/debug/HyprCtl.cpp10
-rw-r--r--src/desktop/Window.cpp38
-rw-r--r--src/desktop/Workspace.cpp149
-rw-r--r--src/desktop/Workspace.hpp20
-rw-r--r--src/events/Windows.cpp12
-rw-r--r--src/helpers/MiscFunctions.cpp2
-rw-r--r--src/helpers/Monitor.cpp6
-rw-r--r--src/layout/DwindleLayout.cpp6
-rw-r--r--src/layout/IHyprLayout.cpp10
-rw-r--r--src/layout/MasterLayout.cpp2
-rw-r--r--src/managers/AnimationManager.cpp2
-rw-r--r--src/managers/KeybindManager.cpp30
-rw-r--r--src/managers/input/IdleInhibitor.cpp2
-rw-r--r--src/managers/input/InputManager.cpp8
-rw-r--r--src/managers/input/Swipe.cpp13
-rw-r--r--src/render/Renderer.cpp18
19 files changed, 267 insertions, 260 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 0e0c75a1..3fe5acec 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -833,6 +833,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper
if (special && !w->onSpecialWorkspace()) // because special floating may creep up into regular
continue;
+ if (!w->m_pWorkspace)
+ continue;
+
const auto PWINDOWMONITOR = w->m_pMonitor.lock();
// to avoid focusing windows behind special workspaces from other monitors
@@ -844,7 +847,7 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper
continue;
}
- if (w->m_bIsFloating && w->m_bIsMapped && isWorkspaceVisible(w->m_pWorkspace) && !w->isHidden() && !w->m_bPinned && !w->m_sWindowData.noFocus.valueOrDefault() &&
+ if (w->m_bIsFloating && w->m_bIsMapped && w->m_pWorkspace->isVisible() && !w->isHidden() && !w->m_bPinned && !w->m_sWindowData.noFocus.valueOrDefault() &&
w != pIgnoreWindow && (!aboveFullscreen || w->m_bCreatedOverFullscreen)) {
// OR windows should add focus to parent
if (w->m_bX11ShouldntFocus && !w->isX11OverrideRedirect())
@@ -887,7 +890,7 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper
const auto PWORKSPACE = getWorkspaceByID(WSPID);
if (PWORKSPACE->m_bHasFullscreenWindow)
- return getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ return PWORKSPACE->getFullscreenWindow();
auto found = floating(false);
if (found)
@@ -898,6 +901,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper
if (special != w->onSpecialWorkspace())
continue;
+ if (!w->m_pWorkspace)
+ continue;
+
if (!w->m_bIsX11 && !w->m_bIsFloating && w->m_bIsMapped && w->workspaceID() == WSPID && !w->isHidden() && !w->m_bX11ShouldntFocus &&
!w->m_sWindowData.noFocus.valueOrDefault() && w != pIgnoreWindow) {
if (w->hasPopupAt(pos))
@@ -909,6 +915,9 @@ PHLWINDOW CCompositor::vectorToWindowUnified(const Vector2D& pos, uint8_t proper
if (special != w->onSpecialWorkspace())
continue;
+ if (!w->m_pWorkspace)
+ continue;
+
if (!w->m_bIsFloating && w->m_bIsMapped && w->workspaceID() == WSPID && !w->isHidden() && !w->m_bX11ShouldntFocus && !w->m_sWindowData.noFocus.valueOrDefault() &&
w != pIgnoreWindow) {
CBox box = (properties & USE_PROP_TILED) ? w->getWindowBoxUnified(properties) : CBox{w->m_vPosition, w->m_vSize};
@@ -1070,7 +1079,7 @@ void CCompositor::focusWindow(PHLWINDOW pWindow, SP<CWLSurfaceResource> pSurface
const auto PMONITOR = pWindow->m_pMonitor.lock();
- if (!isWorkspaceVisible(pWindow->m_pWorkspace)) {
+ if (!pWindow->m_pWorkspace || !pWindow->m_pWorkspace->isVisible()) {
const auto PWORKSPACE = pWindow->m_pWorkspace;
// This is to fix incorrect feedback on the focus history.
PWORKSPACE->m_pLastFocusedWindow = pWindow;
@@ -1247,30 +1256,6 @@ PHLWINDOW CCompositor::getWindowFromHandle(uint32_t handle) {
return nullptr;
}
-PHLWINDOW CCompositor::getFullscreenWindowOnWorkspace(const WORKSPACEID& ID) {
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() == ID && w->isFullscreen())
- return w;
- }
-
- return nullptr;
-}
-
-bool CCompositor::isWorkspaceVisible(PHLWORKSPACE w) {
- return valid(w) && w->m_bVisible;
-}
-
-bool CCompositor::isWorkspaceVisibleNotCovered(PHLWORKSPACE w) {
- if (!valid(w))
- return false;
-
- const auto PMONITOR = w->m_pMonitor.lock();
- if (PMONITOR->activeSpecialWorkspace)
- return PMONITOR->activeSpecialWorkspace->m_iID == w->m_iID;
-
- return PMONITOR->activeWorkspace->m_iID == w->m_iID;
-}
-
PHLWORKSPACE CCompositor::getWorkspaceByID(const WORKSPACEID& id) {
for (auto const& w : m_vWorkspaces) {
if (w->m_iID == id && !w->inert())
@@ -1295,37 +1280,6 @@ void CCompositor::sanityCheckWorkspaces() {
}
}
-int CCompositor::getWindowsOnWorkspace(const WORKSPACEID& id, std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) {
- int no = 0;
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() != id || !w->m_bIsMapped)
- continue;
- if (onlyTiled.has_value() && w->m_bIsFloating == onlyTiled.value())
- continue;
- if (onlyVisible.has_value() && w->isHidden() == onlyVisible.value())
- continue;
- no++;
- }
-
- return no;
-}
-
-int CCompositor::getGroupsOnWorkspace(const WORKSPACEID& id, std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) {
- int no = 0;
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() != id || !w->m_bIsMapped)
- continue;
- if (!w->m_sGroupData.head)
- continue;
- if (onlyTiled.has_value() && w->m_bIsFloating == onlyTiled.value())
- continue;
- if (onlyVisible.has_value() && w->isHidden() == onlyVisible.value())
- continue;
- no++;
- }
- return no;
-}
-
PHLWINDOW CCompositor::getUrgentWindow() {
for (auto const& w : m_vWindows) {
if (w->m_bIsMapped && w->m_bIsUrgent)
@@ -1335,44 +1289,6 @@ PHLWINDOW CCompositor::getUrgentWindow() {
return nullptr;
}
-bool CCompositor::hasUrgentWindowOnWorkspace(const WORKSPACEID& id) {
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() == id && w->m_bIsMapped && w->m_bIsUrgent)
- return true;
- }
-
- return false;
-}
-
-PHLWINDOW CCompositor::getFirstWindowOnWorkspace(const WORKSPACEID& id) {
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() == id && w->m_bIsMapped && !w->isHidden())
- return w;
- }
-
- return nullptr;
-}
-
-PHLWINDOW CCompositor::getTopLeftWindowOnWorkspace(const WORKSPACEID& id) {
- const auto PWORKSPACE = getWorkspaceByID(id);
-
- if (!PWORKSPACE)
- return nullptr;
-
- const auto PMONITOR = PWORKSPACE->m_pMonitor.lock();
-
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() != id || !w->m_bIsMapped || w->isHidden())
- continue;
-
- const auto WINDOWIDEALBB = w->getWindowIdealBoundingBoxIgnoreReserved();
-
- if (WINDOWIDEALBB.x <= PMONITOR->vecPosition.x + 1 && WINDOWIDEALBB.y <= PMONITOR->vecPosition.y + 1)
- return w;
- }
- return nullptr;
-}
-
bool CCompositor::isWindowActive(PHLWINDOW pWindow) {
if (m_pLastWindow.expired() && !m_pLastFocus)
return false;
@@ -1560,7 +1476,7 @@ PHLWINDOW CCompositor::getWindowInDirection(PHLWINDOW pWindow, char dir) {
// for tiled windows, we calc edges
for (auto const& w : m_vWindows) {
- if (w == pWindow || !w->m_bIsMapped || w->isHidden() || (!w->isFullscreen() && w->m_bIsFloating) || !isWorkspaceVisible(w->m_pWorkspace))
+ if (w == pWindow || !w->m_pWorkspace || !w->m_bIsMapped || w->isHidden() || (!w->isFullscreen() && w->m_bIsFloating) || !w->m_pWorkspace->isVisible())
continue;
if (pWindow->m_pMonitor == w->m_pMonitor && pWindow->m_pWorkspace != w->m_pWorkspace)
@@ -1652,7 +1568,7 @@ PHLWINDOW CCompositor::getWindowInDirection(PHLWINDOW pWindow, char dir) {
constexpr float THRESHOLD = 0.3 * M_PI;
for (auto const& w : m_vWindows) {
- if (w == pWindow || !w->m_bIsMapped || w->isHidden() || (!w->isFullscreen() && !w->m_bIsFloating) || !isWorkspaceVisible(w->m_pWorkspace))
+ if (w == pWindow || !w->m_bIsMapped || !w->m_pWorkspace || w->isHidden() || (!w->isFullscreen() && !w->m_bIsFloating) || !w->m_pWorkspace->isVisible())
continue;
if (pWindow->m_pMonitor == w->m_pMonitor && pWindow->m_pWorkspace != w->m_pWorkspace)
@@ -1678,7 +1594,7 @@ PHLWINDOW CCompositor::getWindowInDirection(PHLWINDOW pWindow, char dir) {
}
if (!leaderWindow && PWORKSPACE->m_bHasFullscreenWindow)
- leaderWindow = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ leaderWindow = PWORKSPACE->getFullscreenWindow();
}
if (leaderValue != -1)
@@ -1871,15 +1787,6 @@ void CCompositor::updateAllWindowsAnimatedDecorationValues() {
}
}
-void CCompositor::updateWorkspaceWindows(const int64_t& id) {
- for (auto const& w : m_vWindows) {
- if (!w->m_bIsMapped || w->workspaceID() != id)
- continue;
-
- w->updateDynamicRules();
- }
-}
-
void CCompositor::updateWindowAnimatedDecorationValues(PHLWINDOW pWindow) {
// optimization
static auto PACTIVECOL = CConfigValue<Hyprlang::CUSTOMTYPE>("general:col.active_border");
@@ -2391,7 +2298,7 @@ void CCompositor::setWindowFullscreenState(const PHLWINDOW PWINDOW, sFullscreenS
g_pXWaylandManager->setWindowSize(PWINDOW, PWINDOW->m_vRealSize.goal(), true);
- forceReportSizesToWindowsOnWorkspace(PWINDOW->workspaceID());
+ PWORKSPACE->forceReportSizesToWindows();
g_pInputManager->recheckIdleInhibitorStatus();
@@ -2422,27 +2329,6 @@ PHLWINDOW CCompositor::getX11Parent(PHLWINDOW pWindow) {
return nullptr;
}
-void CCompositor::updateWorkspaceWindowDecos(const WORKSPACEID& id) {
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() != id)
- continue;
-
- w->updateWindowDecos();
- }
-}
-
-void CCompositor::updateWorkspaceWindowData(const WORKSPACEID& id) {
- const auto PWORKSPACE = getWorkspaceByID(id);
- const auto WORKSPACERULE = PWORKSPACE ? g_pConfigManager->getWorkspaceRuleFor(PWORKSPACE) : SWorkspaceRule{};
-
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() != id)
- continue;
-
- w->updateWindowData(WORKSPACERULE);
- }
-}
-
void CCompositor::scheduleFrameForMonitor(PHLMONITOR pMonitor, IOutput::scheduleFrameReason reason) {
if ((m_pAqBackend->hasSession() && !m_pAqBackend->session->active) || !m_bSessionActive)
return;
@@ -2654,14 +2540,6 @@ Vector2D CCompositor::parseWindowVectorArgsRelative(const std::string& args, con
return Vector2D(X, Y);
}
-void CCompositor::forceReportSizesToWindowsOnWorkspace(const WORKSPACEID& wid) {
- for (auto const& w : m_vWindows) {
- if (w->workspaceID() == wid && w->m_bIsMapped && !w->isHidden()) {
- g_pXWaylandManager->setWindowSize(w, w->m_vRealSize.value(), true);
- }
- }
-}
-
PHLWORKSPACE CCompositor::createNewWorkspace(const WORKSPACEID& id, const MONITORID& monid, const std::string& name, bool isEmpty) {
const auto NAME = name == "" ? std::to_string(id) : name;
auto monID = monid;
@@ -2679,21 +2557,6 @@ PHLWORKSPACE CCompositor::createNewWorkspace(const WORKSPACEID& id, const MONITO
return PWORKSPACE;
}
-void CCompositor::renameWorkspace(const WORKSPACEID& id, const std::string& name) {
- const auto PWORKSPACE = getWorkspaceByID(id);
-
- if (!PWORKSPACE)
- return;
-
- if (isWorkspaceSpecial(id))
- return;
-
- Debug::log(LOG, "renameWorkspace: Renaming workspace {} to '{}'", id, name);
- PWORKSPACE->m_szName = name;
-
- g_pEventManager->postEvent({"renameworkspace", std::to_string(PWORKSPACE->m_iID) + "," + PWORKSPACE->m_szName});
-}
-
void CCompositor::setActiveMonitor(PHLMONITOR pMonitor) {
if (m_pLastMonitor == pMonitor)
return;
@@ -2758,8 +2621,8 @@ void CCompositor::moveWindowToWorkspaceSafe(PHLWINDOW pWindow, PHLWORKSPACE pWor
if (FULLSCREEN)
setWindowFullscreenInternal(pWindow, FSMODE_NONE);
- const PHLWINDOW pFirstWindowOnWorkspace = g_pCompositor->getFirstWindowOnWorkspace(pWorkspace->m_iID);
- const int visibleWindowsOnWorkspace = g_pCompositor->getWindowsOnWorkspace(pWorkspace->m_iID, std::nullopt, true);
+ const PHLWINDOW pFirstWindowOnWorkspace = pWorkspace->getFirstWindow();
+ const int visibleWindowsOnWorkspace = pWorkspace->getWindows(std::nullopt, true);
const auto PWINDOWMONITOR = pWindow->m_pMonitor.lock();
const auto POSTOMON = pWindow->m_vRealPosition.goal() - PWINDOWMONITOR->vecPosition;
const auto PWORKSPACEMONITOR = pWorkspace->m_pMonitor.lock();
@@ -2817,14 +2680,15 @@ void CCompositor::moveWindowToWorkspaceSafe(PHLWINDOW pWindow, PHLWORKSPACE pWor
if (FULLSCREEN)
setWindowFullscreenInternal(pWindow, FULLSCREENMODE);
- g_pCompositor->updateWorkspaceWindows(pWorkspace->m_iID);
- g_pCompositor->updateWorkspaceWindows(pWindow->workspaceID());
+ pWorkspace->updateWindows();
+ if (pWindow->m_pWorkspace)
+ pWindow->m_pWorkspace->updateWindows();
g_pCompositor->updateSuspendedStates();
}
PHLWINDOW CCompositor::getForceFocus() {
for (auto const& w : m_vWindows) {
- if (!w->m_bIsMapped || w->isHidden() || !isWorkspaceVisible(w->m_pWorkspace))
+ if (!w->m_bIsMapped || w->isHidden() || !w->m_pWorkspace || !w->m_pWorkspace->isVisible())
continue;
if (!w->m_bStayFocused)
@@ -3002,7 +2866,7 @@ void CCompositor::updateSuspendedStates() {
if (!w->m_bIsMapped)
continue;
- w->setSuspended(w->isHidden() || !isWorkspaceVisible(w->m_pWorkspace));
+ w->setSuspended(w->isHidden() || !w->m_pWorkspace || !w->m_pWorkspace->isVisible());
}
}
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 208b6ecf..c02be579 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -115,21 +115,11 @@ class CCompositor {
PHLMONITOR getRealMonitorFromOutput(SP<Aquamarine::IOutput>);
PHLWINDOW getWindowFromSurface(SP<CWLSurfaceResource>);
PHLWINDOW getWindowFromHandle(uint32_t);
- bool isWorkspaceVisible(PHLWORKSPACE);
- bool isWorkspaceVisibleNotCovered(PHLWORKSPACE);
PHLWORKSPACE getWorkspaceByID(const WORKSPACEID&);
PHLWORKSPACE getWorkspaceByName(const std::string&);
PHLWORKSPACE getWorkspaceByString(const std::string&);
void sanityCheckWorkspaces();
- void updateWorkspaceWindowDecos(const WORKSPACEID&);
- void updateWorkspaceWindowData(const WORKSPACEID&);
- int getWindowsOnWorkspace(const WORKSPACEID& id, std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {});
- int getGroupsOnWorkspace(const WORKSPACEID& id, std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {});
PHLWINDOW getUrgentWindow();
- bool hasUrgentWindowOnWorkspace(const WORKSPACEID&);
- PHLWINDOW getFirstWindowOnWorkspace(const WORKSPACEID&);
- PHLWINDOW getTopLeftWindowOnWorkspace(const WORKSPACEID&);
- PHLWINDOW getFullscreenWindowOnWorkspace(const WORKSPACEID&);
bool isWindowActive(PHLWINDOW);
void changeWindowZOrder(PHLWINDOW, bool);
void cleanupFadingOut(const MONITORID& monid);
@@ -142,7 +132,6 @@ class CCompositor {
PHLMONITOR getMonitorInDirection(const char&);
PHLMONITOR getMonitorInDirection(PHLMONITOR, const char&);
void updateAllWindowsAnimatedDecorationValues();
- void updateWorkspaceWindows(const WORKSPACEID& id);
void updateWindowAnimatedDecorationValues(PHLWINDOW);
MONITORID getNextAvailableMonitorID(std::string const& name);
void moveWorkspaceToMonitor(PHLWORKSPACE, PHLMONITOR, bool noWarpCursor = false);
@@ -165,10 +154,8 @@ class CCompositor {
PHLLS getLayerSurfaceFromSurface(SP<CWLSurfaceResource>);
void closeWindow(PHLWINDOW);
Vector2D parseWindowVectorArgsRelative(const std::string&, const Vector2D&);
- void forceReportSizesToWindowsOnWorkspace(const WORKSPACEID&);
PHLWORKSPACE createNewWorkspace(const WORKSPACEID&, const MONITORID&, const std::string& name = "",
bool isEmpty = true); // will be deleted next frame if left empty and unfocused!
- void renameWorkspace(const WORKSPACEID&, const std::string& name = "");
void setActiveMonitor(PHLMONITOR);
bool isWorkspaceSpecial(const WORKSPACEID&);
WORKSPACEID getNewSpecialID();
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 357e7a60..f6734011 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -927,8 +927,8 @@ void CConfigManager::postConfigReload(const Hyprlang::CParseResult& result) {
for (auto const& w : g_pCompositor->m_vWorkspaces) {
if (w->inert())
continue;
- g_pCompositor->updateWorkspaceWindows(w->m_iID);
- g_pCompositor->updateWorkspaceWindowData(w->m_iID);
+ w->updateWindows();
+ w->updateWindowData();
}
// Update window border colors
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 7c0a9417..11c16f0e 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -306,12 +306,12 @@ std::string CHyprCtl::getWorkspaceData(PHLWORKSPACE w, eHyprCtlOutputFormat form
"lastwindowtitle": "{}"
}})#",
w->m_iID, escapeJSONStrings(w->m_szName), escapeJSONStrings(PMONITOR ? PMONITOR->szName : "?"),
- escapeJSONStrings(PMONITOR ? std::to_string(PMONITOR->ID) : "null"), g_pCompositor->getWindowsOnWorkspace(w->m_iID),
- ((int)w->m_bHasFullscreenWindow == 1 ? "true" : "false"), (uintptr_t)PLASTW.get(), PLASTW ? escapeJSONStrings(PLASTW->m_szTitle) : "");
+ escapeJSONStrings(PMONITOR ? std::to_string(PMONITOR->ID) : "null"), w->getWindows(), ((int)w->m_bHasFullscreenWindow == 1 ? "true" : "false"),
+ (uintptr_t)PLASTW.get(), PLASTW ? escapeJSONStrings(PLASTW->m_szTitle) : "");
} else {
return std::format("workspace ID {} ({}) on monitor {}:\n\tmonitorID: {}\n\twindows: {}\n\thasfullscreen: {}\n\tlastwindow: 0x{:x}\n\tlastwindowtitle: {}\n\n", w->m_iID,
- w->m_szName, PMONITOR ? PMONITOR->szName : "?", PMONITOR ? std::to_string(PMONITOR->ID) : "null", g_pCompositor->getWindowsOnWorkspace(w->m_iID),
- (int)w->m_bHasFullscreenWindow, (uintptr_t)PLASTW.get(), PLASTW ? PLASTW->m_szTitle : "");
+ w->m_szName, PMONITOR ? PMONITOR->szName : "?", PMONITOR ? std::to_string(PMONITOR->ID) : "null", w->getWindows(), (int)w->m_bHasFullscreenWindow,
+ (uintptr_t)PLASTW.get(), PLASTW ? PLASTW->m_szTitle : "");
}
}
@@ -1764,7 +1764,7 @@ std::string CHyprCtl::getReply(std::string request) {
}
for (auto const& w : g_pCompositor->m_vWindows) {
- if (!w->m_bIsMapped || !g_pCompositor->isWorkspaceVisible(w->m_pWorkspace))
+ if (!w->m_bIsMapped || !w->m_pWorkspace || !w->m_pWorkspace->isVisible())
continue;
w->updateDynamicRules();
diff --git a/src/desktop/Window.cpp b/src/desktop/Window.cpp
index 117d301c..12e81b76 100644
--- a/src/desktop/Window.cpp
+++ b/src/desktop/Window.cpp
@@ -413,12 +413,12 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) {
setAnimationsToMove();
- g_pCompositor->updateWorkspaceWindows(OLDWORKSPACE->m_iID);
- g_pCompositor->updateWorkspaceWindowData(OLDWORKSPACE->m_iID);
+ OLDWORKSPACE->updateWindows();
+ OLDWORKSPACE->updateWindowData();
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(OLDWORKSPACE->monitorID());
- g_pCompositor->updateWorkspaceWindows(workspaceID());
- g_pCompositor->updateWorkspaceWindowData(workspaceID());
+ pWorkspace->updateWindows();
+ pWorkspace->updateWindowData();
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -437,7 +437,7 @@ void CWindow::moveToWorkspace(PHLWORKSPACE pWorkspace) {
// update xwayland coords
g_pXWaylandManager->setWindowSize(m_pSelf.lock(), m_vRealSize.value());
- if (OLDWORKSPACE && g_pCompositor->isWorkspaceSpecial(OLDWORKSPACE->m_iID) && g_pCompositor->getWindowsOnWorkspace(OLDWORKSPACE->m_iID) == 0 && *PCLOSEONLASTSPECIAL) {
+ if (OLDWORKSPACE && g_pCompositor->isWorkspaceSpecial(OLDWORKSPACE->m_iID) && OLDWORKSPACE->getWindows() == 0 && *PCLOSEONLASTSPECIAL) {
if (const auto PMONITOR = OLDWORKSPACE->m_pMonitor.lock(); PMONITOR)
PMONITOR->setSpecialWorkspace(nullptr);
}
@@ -516,7 +516,7 @@ void CWindow::onUnmap() {
std::erase_if(g_pCompositor->m_vWindowFocusHistory, [&](const auto& other) { return other.expired() || other.lock().get() == this; });
- if (*PCLOSEONLASTSPECIAL && g_pCompositor->getWindowsOnWorkspace(workspaceID()) == 0 && onSpecialWorkspace()) {
+ if (*PCLOSEONLASTSPECIAL && m_pWorkspace && m_pWorkspace->getWindows() == 0 && onSpecialWorkspace()) {
const auto PMONITOR = m_pMonitor.lock();
if (PMONITOR && PMONITOR->activeSpecialWorkspace && PMONITOR->activeSpecialWorkspace == m_pWorkspace)
PMONITOR->setSpecialWorkspace(nullptr);
@@ -527,8 +527,10 @@ void CWindow::onUnmap() {
if (PMONITOR && PMONITOR->solitaryClient.lock().get() == this)
PMONITOR->solitaryClient.reset();
- g_pCompositor->updateWorkspaceWindows(workspaceID());
- g_pCompositor->updateWorkspaceWindowData(workspaceID());
+ if (m_pWorkspace) {
+ m_pWorkspace->updateWindows();
+ m_pWorkspace->updateWindowData();
+ }
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -855,8 +857,10 @@ void CWindow::createGroup() {
addWindowDeco(std::make_unique<CHyprGroupBarDecoration>(m_pSelf.lock()));
- g_pCompositor->updateWorkspaceWindows(workspaceID());
- g_pCompositor->updateWorkspaceWindowData(workspaceID());
+ if (m_pWorkspace) {
+ m_pWorkspace->updateWindows();
+ m_pWorkspace->updateWindowData();
+ }
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -873,8 +877,10 @@ void CWindow::destroyGroup() {
m_sGroupData.pNextWindow.reset();
m_sGroupData.head = false;
updateWindowDecos();
- g_pCompositor->updateWorkspaceWindows(workspaceID());
- g_pCompositor->updateWorkspaceWindowData(workspaceID());
+ if (m_pWorkspace) {
+ m_pWorkspace->updateWindows();
+ m_pWorkspace->updateWindowData();
+ }
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -909,8 +915,10 @@ void CWindow::destroyGroup() {
}
g_pKeybindManager->m_bGroupsLocked = GROUPSLOCKEDPREV;
- g_pCompositor->updateWorkspaceWindows(workspaceID());
- g_pCompositor->updateWorkspaceWindowData(workspaceID());
+ if (m_pWorkspace) {
+ m_pWorkspace->updateWindows();
+ m_pWorkspace->updateWindowData();
+ }
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -1507,7 +1515,7 @@ void CWindow::onX11Configure(CBox box) {
updateWindowDecos();
- if (!g_pCompositor->isWorkspaceVisible(m_pWorkspace))
+ if (!m_pWorkspace || !m_pWorkspace->isVisible())
return; // further things are only for visible windows
m_pWorkspace = g_pCompositor->getMonitorFromVector(m_vRealPosition.value() + m_vRealSize.value() / 2.f)->activeWorkspace;
diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp
index 8cddbb6b..7c3d47d7 100644
--- a/src/desktop/Workspace.cpp
+++ b/src/desktop/Workspace.cpp
@@ -422,11 +422,11 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {
int count;
if (wantsCountGroup)
- count = g_pCompositor->getGroupsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
- wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
+ count = getGroups(wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
+ wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
else
- count = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
- wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
+ count = getWindows(wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
+ wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
if (count != from)
return false;
@@ -456,11 +456,11 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {
WORKSPACEID count;
if (wantsCountGroup)
- count = g_pCompositor->getGroupsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
- wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
+ count = getGroups(wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
+ wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
else
- count = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
- wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
+ count = getWindows(wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled),
+ wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt);
if (std::clamp(count, from, to) != count)
return false;
@@ -525,3 +525,136 @@ bool CWorkspace::inert() {
MONITORID CWorkspace::monitorID() {
return m_pMonitor ? m_pMonitor->ID : MONITOR_INVALID;
}
+
+PHLWINDOW CWorkspace::getFullscreenWindow() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace == m_pSelf && w->isFullscreen())
+ return w;
+ }
+
+ return nullptr;
+}
+
+bool CWorkspace::isVisible() {
+ return m_bVisible;
+}
+
+bool CWorkspace::isVisibleNotCovered() {
+ const auto PMONITOR = m_pMonitor.lock();
+ if (PMONITOR->activeSpecialWorkspace)
+ return PMONITOR->activeSpecialWorkspace->m_iID == m_iID;
+
+ return PMONITOR->activeWorkspace->m_iID == m_iID;
+}
+
+int CWorkspace::getWindows(std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) {
+ int no = 0;
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->workspaceID() != m_iID || !w->m_bIsMapped)
+ continue;
+ if (onlyTiled.has_value() && w->m_bIsFloating == onlyTiled.value())
+ continue;
+ if (onlyVisible.has_value() && w->isHidden() == onlyVisible.value())
+ continue;
+ no++;
+ }
+
+ return no;
+}
+
+int CWorkspace::getGroups(std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) {
+ int no = 0;
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->workspaceID() != m_iID || !w->m_bIsMapped)
+ continue;
+ if (!w->m_sGroupData.head)
+ continue;
+ if (onlyTiled.has_value() && w->m_bIsFloating == onlyTiled.value())
+ continue;
+ if (onlyVisible.has_value() && w->isHidden() == onlyVisible.value())
+ continue;
+ no++;
+ }
+ return no;
+}
+
+PHLWINDOW CWorkspace::getFirstWindow() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace == m_pSelf && w->m_bIsMapped && !w->isHidden())
+ return w;
+ }
+
+ return nullptr;
+}
+
+PHLWINDOW CWorkspace::getTopLeftWindow() {
+ const auto PMONITOR = m_pMonitor.lock();
+
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace != m_pSelf || !w->m_bIsMapped || w->isHidden())
+ continue;
+
+ const auto WINDOWIDEALBB = w->getWindowIdealBoundingBoxIgnoreReserved();
+
+ if (WINDOWIDEALBB.x <= PMONITOR->vecPosition.x + 1 && WINDOWIDEALBB.y <= PMONITOR->vecPosition.y + 1)
+ return w;
+ }
+ return nullptr;
+}
+
+bool CWorkspace::hasUrgentWindow() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace == m_pSelf && w->m_bIsMapped && w->m_bIsUrgent)
+ return true;
+ }
+
+ return false;
+}
+
+void CWorkspace::updateWindowDecos() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace != m_pSelf)
+ continue;
+
+ w->updateWindowDecos();
+ }
+}
+
+void CWorkspace::updateWindowData() {
+ const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(m_pSelf.lock());
+
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace != m_pSelf)
+ continue;
+
+ w->updateWindowData(WORKSPACERULE);
+ }
+}
+
+void CWorkspace::forceReportSizesToWindows() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (w->m_pWorkspace != m_pSelf || !w->m_bIsMapped || w->isHidden())
+ continue;
+
+ g_pXWaylandManager->setWindowSize(w, w->m_vRealSize.value(), true);
+ }
+}
+
+void CWorkspace::rename(const std::string& name) {
+ if (g_pCompositor->isWorkspaceSpecial(m_iID))
+ return;
+
+ Debug::log(LOG, "CWorkspace::rename: Renaming workspace {} to '{}'", m_iID, name);
+ m_szName = name;
+
+ g_pEventManager->postEvent({"renameworkspace", std::to_string(m_iID) + "," + m_szName});
+}
+
+void CWorkspace::updateWindows() {
+ for (auto const& w : g_pCompositor->m_vWindows) {
+ if (!w->m_bIsMapped || w->m_pWorkspace != m_pSelf)
+ continue;
+
+ w->updateDynamicRules();
+ }
+}
diff --git a/src/desktop/Workspace.hpp b/src/desktop/Workspace.hpp
index 3ed9f50c..606485a2 100644
--- a/src/desktop/Workspace.hpp
+++ b/src/desktop/Workspace.hpp
@@ -63,23 +63,29 @@ class CWorkspace {
// Inert: destroyed and invalid. If this is true, release the ptr you have.
bool inert();
-
void startAnim(bool in, bool left, bool instant = false);
void setActive(bool on);
-
void moveToMonitor(const MONITORID&);
MONITORID monitorID();
-
PHLWINDOW getLastFocusedWindow();
void rememberPrevWorkspace(const PHLWORKSPACE& prevWorkspace);
-
std::string getConfigName();
-
bool matchesStaticSelector(const std::string& selector);
-
void markInert();
-
SWorkspaceIDName getPrevWorkspaceIDName(bool perMonitor) const;
+ void updateWindowDecos();
+ void updateWindowData();
+ int getWindows(std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {});
+ int getGroups(std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {});
+ bool hasUrgentWindow();
+ PHLWINDOW getFirstWindow();
+ PHLWINDOW getTopLeftWindow();
+ PHLWINDOW getFullscreenWindow();
+ bool isVisible();
+ bool isVisibleNotCovered();
+ void rename(const std::string& name = "");
+ void forceReportSizesToWindows();
+ void updateWindows();
private:
void init(PHLWORKSPACE self);
diff --git a/src/events/Windows.cpp b/src/events/Windows.cpp
index 73ab45c1..a607d7ce 100644
--- a/src/events/Windows.cpp
+++ b/src/events/Windows.cpp
@@ -509,7 +509,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
else if (*PNEWTAKESOVERFS == 1)
requestedInternalFSMode = PWINDOW->m_pWorkspace->m_efFullscreenMode;
else if (*PNEWTAKESOVERFS == 2)
- g_pCompositor->setWindowFullscreenInternal(g_pCompositor->getFullscreenWindowOnWorkspace(PWINDOW->m_pWorkspace->m_iID), FSMODE_NONE);
+ g_pCompositor->setWindowFullscreenInternal(PWINDOW->m_pWorkspace->getFullscreenWindow(), FSMODE_NONE);
}
if (!PWINDOW->m_sWindowData.noFocus.valueOrDefault() && !PWINDOW->m_bNoInitialFocus &&
@@ -531,7 +531,7 @@ void Events::listener_mapWindow(void* owner, void* data) {
if (!PWINDOW->m_bNoInitialFocus && (requestedInternalFSMode.has_value() || requestedClientFSMode.has_value() || requestedFSState.has_value())) {
// fix fullscreen on requested (basically do a switcheroo)
if (PWINDOW->m_pWorkspace->m_bHasFullscreenWindow)
- g_pCompositor->setWindowFullscreenInternal(g_pCompositor->getFullscreenWindowOnWorkspace(PWINDOW->m_pWorkspace->m_iID), FSMODE_NONE);
+ g_pCompositor->setWindowFullscreenInternal(PWINDOW->m_pWorkspace->getFullscreenWindow(), FSMODE_NONE);
PWINDOW->m_vRealPosition.warp();
PWINDOW->m_vRealSize.warp();
@@ -603,7 +603,8 @@ void Events::listener_mapWindow(void* owner, void* data) {
// fix some xwayland apps that don't behave nicely
PWINDOW->m_vReportedSize = PWINDOW->m_vPendingReportedSize;
- g_pCompositor->updateWorkspaceWindows(PWINDOW->workspaceID());
+ if (PWINDOW->m_pWorkspace)
+ PWINDOW->m_pWorkspace->updateWindows();
if (PMONITOR && PWINDOW->isX11OverrideRedirect())
PWINDOW->m_fX11SurfaceScaledBy = PMONITOR->scale;
@@ -699,7 +700,7 @@ void Events::listener_unmapWindow(void* owner, void* data) {
g_pCompositor->setWindowFullscreenInternal(PWINDOWCANDIDATE, CURRENTFSMODE);
}
- if (!PWINDOWCANDIDATE && g_pCompositor->getWindowsOnWorkspace(PWINDOW->workspaceID()) == 0)
+ if (!PWINDOWCANDIDATE && PWINDOW->m_pWorkspace && PWINDOW->m_pWorkspace->getWindows() == 0)
g_pInputManager->refocus();
g_pInputManager->sendMotionEventsToFocused();
@@ -729,7 +730,8 @@ void Events::listener_unmapWindow(void* owner, void* data) {
g_pInputManager->recheckIdleInhibitorStatus();
// force report all sizes (QT sometimes has an issue with this)
- g_pCompositor->forceReportSizesToWindowsOnWorkspace(PWINDOW->workspaceID());
+ if (PWINDOW->m_pWorkspace)
+ PWINDOW->m_pWorkspace->forceReportSizesToWindows();
// update lastwindow after focus
PWINDOW->onUnmap();
diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp
index fa2f84ab..dc181d4f 100644
--- a/src/helpers/MiscFunctions.cpp
+++ b/src/helpers/MiscFunctions.cpp
@@ -264,7 +264,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
WORKSPACEID id = next ? g_pCompositor->m_pLastMonitor->activeWorkspaceID() : 0;
while (++id < LONG_MAX) {
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(id);
- if (!invalidWSes.contains(id) && (!PWORKSPACE || g_pCompositor->getWindowsOnWorkspace(id) == 0)) {
+ if (!invalidWSes.contains(id) && (!PWORKSPACE || PWORKSPACE->getWindows() == 0)) {
result.id = id;
return result;
}
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp
index 63268c8a..cbad959e 100644
--- a/src/helpers/Monitor.cpp
+++ b/src/helpers/Monitor.cpp
@@ -629,17 +629,17 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo
if (!noFocus && !g_pCompositor->m_pLastMonitor->activeSpecialWorkspace &&
!(g_pCompositor->m_pLastWindow.lock() && g_pCompositor->m_pLastWindow->m_bPinned && g_pCompositor->m_pLastWindow->m_pMonitor == self)) {
static auto PFOLLOWMOUSE = CConfigValue<Hyprlang::INT>("input:follow_mouse");
- auto pWindow = pWorkspace->m_bHasFullscreenWindow ? g_pCompositor->getFullscreenWindowOnWorkspace(pWorkspace->m_iID) : pWorkspace->getLastFocusedWindow();
+ auto pWindow = pWorkspace->m_bHasFullscreenWindow ? pWorkspace->getFullscreenWindow() : pWorkspace->getLastFocusedWindow();
if (!pWindow) {
if (*PFOLLOWMOUSE == 1)
pWindow = g_pCompositor->vectorToWindowUnified(g_pInputManager->getMouseCoordsInternal(), RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (!pWindow)
- pWindow = g_pCompositor->getTopLeftWindowOnWorkspace(pWorkspace->m_iID);
+ pWindow = pWorkspace->getTopLeftWindow();
if (!pWindow)
- pWindow = g_pCompositor->getFirstWindowOnWorkspace(pWorkspace->m_iID);
+ pWindow = pWorkspace->getFirstWindow();
}
g_pCompositor->focusWindow(pWindow);
diff --git a/src/layout/DwindleLayout.cpp b/src/layout/DwindleLayout.cpp
index c3e394f3..864c8564 100644
--- a/src/layout/DwindleLayout.cpp
+++ b/src/layout/DwindleLayout.cpp
@@ -514,7 +514,7 @@ void CHyprDwindleLayout::calculateWorkspace(const PHLWORKSPACE& pWorkspace) {
if (pWorkspace->m_bHasFullscreenWindow) {
// massive hack from the fullscreen func
- const auto PFULLWINDOW = g_pCompositor->getFullscreenWindowOnWorkspace(pWorkspace->m_iID);
+ const auto PFULLWINDOW = pWorkspace->getFullscreenWindow();
if (pWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) {
PFULLWINDOW->m_vRealPosition = PMONITOR->vecPosition;
@@ -1054,7 +1054,7 @@ void CHyprDwindleLayout::moveToRoot(PHLWINDOW pWindow, bool stable) {
std::swap(pRoot->children[0], pRoot->children[1]);
// if the workspace is visible, recalculate layout
- if (g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace))
+ if (pWindow->m_pWorkspace && pWindow->m_pWorkspace->isVisible())
pRoot->recalcSizePosRecursive();
}
@@ -1094,7 +1094,7 @@ Vector2D CHyprDwindleLayout::predictSizeForNewWindowTiled() {
PHLWINDOW candidate = g_pCompositor->m_pLastWindow.lock();
if (!candidate)
- candidate = g_pCompositor->getFirstWindowOnWorkspace(g_pCompositor->m_pLastMonitor->activeWorkspace->m_iID);
+ candidate = g_pCompositor->m_pLastMonitor->activeWorkspace->getFirstWindow();
// create a fake node
SDwindleNodeData node;
diff --git a/src/layout/IHyprLayout.cpp b/src/layout/IHyprLayout.cpp
index af8b907c..22e1d947 100644
--- a/src/layout/IHyprLayout.cpp
+++ b/src/layout/IHyprLayout.cpp
@@ -187,7 +187,7 @@ bool IHyprLayout::onWindowCreatedAutoGroup(PHLWINDOW pWindow) {
static auto PAUTOGROUP = CConfigValue<Hyprlang::INT>("group:auto_group");
const PHLWINDOW OPENINGON = g_pCompositor->m_pLastWindow.lock() && g_pCompositor->m_pLastWindow->m_pWorkspace == pWindow->m_pWorkspace ?
g_pCompositor->m_pLastWindow.lock() :
- g_pCompositor->getFirstWindowOnWorkspace(pWindow->workspaceID());
+ (pWindow->m_pWorkspace ? pWindow->m_pWorkspace->getFirstWindow() : nullptr);
const bool FLOATEDINTOTILED = pWindow->m_bIsFloating && !OPENINGON->m_bIsFloating;
const bool SWALLOWING = pWindow->m_pSwallowed || pWindow->m_bGroupSwallowed;
@@ -714,7 +714,7 @@ void IHyprLayout::changeWindowFloatingMode(PHLWINDOW pWindow) {
const auto PWORKSPACE = PNEWMON->activeSpecialWorkspace ? PNEWMON->activeSpecialWorkspace : PNEWMON->activeWorkspace;
if (PWORKSPACE->m_bHasFullscreenWindow)
- g_pCompositor->setWindowFullscreenInternal(g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID), FSMODE_NONE);
+ g_pCompositor->setWindowFullscreenInternal(PWORKSPACE->getFullscreenWindow(), FSMODE_NONE);
// save real pos cuz the func applies the default 5,5 mid
const auto PSAVEDPOS = pWindow->m_vRealPosition.goal();
@@ -803,7 +803,7 @@ PHLWINDOW IHyprLayout::getNextWindowCandidate(PHLWINDOW pWindow) {
// first of all, if this is a fullscreen workspace,
if (PWORKSPACE->m_bHasFullscreenWindow)
- return g_pCompositor->getFullscreenWindowOnWorkspace(pWindow->workspaceID());
+ return PWORKSPACE->getFullscreenWindow();
if (pWindow->m_bIsFloating) {
@@ -842,10 +842,10 @@ PHLWINDOW IHyprLayout::getNextWindowCandidate(PHLWINDOW pWindow) {
auto pWindowCandidate = g_pCompositor->vectorToWindowUnified(pWindow->middle(), RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (!pWindowCandidate)
- pWindowCandidate = g_pCompositor->getTopLeftWindowOnWorkspace(pWindow->workspaceID());
+ pWindowCandidate = PWORKSPACE->getTopLeftWindow();
if (!pWindowCandidate)
- pWindowCandidate = g_pCompositor->getFirstWindowOnWorkspace(pWindow->workspaceID());
+ pWindowCandidate = PWORKSPACE->getFirstWindow();
if (!pWindowCandidate || pWindow == pWindowCandidate || !pWindowCandidate->m_bIsMapped || pWindowCandidate->isHidden() || pWindowCandidate->m_bX11ShouldntFocus ||
pWindowCandidate->isX11OverrideRedirect() || pWindowCandidate->m_pMonitor != g_pCompositor->m_pLastMonitor)
diff --git a/src/layout/MasterLayout.cpp b/src/layout/MasterLayout.cpp
index 695dcc99..bf808627 100644
--- a/src/layout/MasterLayout.cpp
+++ b/src/layout/MasterLayout.cpp
@@ -298,7 +298,7 @@ void CHyprMasterLayout::calculateWorkspace(PHLWORKSPACE pWorkspace) {
if (pWorkspace->m_bHasFullscreenWindow) {
// massive hack from the fullscreen func
- const auto PFULLWINDOW = g_pCompositor->getFullscreenWindowOnWorkspace(pWorkspace->m_iID);
+ const auto PFULLWINDOW = pWorkspace->getFullscreenWindow();
if (pWorkspace->m_efFullscreenMode == FSMODE_FULLSCREEN) {
PFULLWINDOW->m_vRealPosition = PMONITOR->vecPosition;
diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp
index ceb594aa..68dbdda1 100644
--- a/src/managers/AnimationManager.cpp
+++ b/src/managers/AnimationManager.cpp
@@ -149,7 +149,7 @@ void CAnimationManager::tick() {
animationsDisabled = animationsDisabled || PLAYER->noAnimations;
}
- const bool VISIBLE = PWINDOW && PWINDOW->m_pWorkspace ? g_pCompositor->isWorkspaceVisible(PWINDOW->m_pWorkspace) : true;
+ const bool VISIBLE = PWINDOW && PWINDOW->m_pWorkspace ? PWINDOW->m_pWorkspace->isVisible() : true;
// beziers are with a switch unforto
// TODO: maybe do something cleaner
diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp
index 8cf39c1b..a5327149 100644
--- a/src/managers/KeybindManager.cpp
+++ b/src/managers/KeybindManager.cpp
@@ -1036,8 +1036,12 @@ static SDispatchResult toggleActiveFloatingCore(std::string args, std::optional<
g_pLayoutManager->getCurrentLayout()->changeWindowFloatingMode(PWINDOW);
}
- g_pCompositor->updateWorkspaceWindows(PWINDOW->workspaceID());
- g_pCompositor->updateWorkspaceWindowData(PWINDOW->workspaceID());
+
+ if (PWINDOW->m_pWorkspace) {
+ PWINDOW->m_pWorkspace->updateWindows();
+ PWINDOW->m_pWorkspace->updateWindowData();
+ }
+
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PWINDOW->monitorID());
g_pCompositor->updateAllWindowsAnimatedDecorationValues();
@@ -1305,7 +1309,7 @@ SDispatchResult CKeybindManager::moveActiveToWorkspace(std::string args) {
g_pCompositor->moveWindowToWorkspaceSafe(PWINDOW, pWorkspace);
}
- POLDWS->m_pLastFocusedWindow = g_pCompositor->getFirstWindowOnWorkspace(POLDWS->m_iID);
+ POLDWS->m_pLastFocusedWindow = POLDWS->getFirstWindow();
if (pWorkspace->m_bIsSpecialWorkspace)
pMonitor->setSpecialWorkspace(pWorkspace);
@@ -1799,10 +1803,14 @@ SDispatchResult CKeybindManager::renameWorkspace(std::string args) {
if (FIRSTSPACEPOS != std::string::npos) {
int workspace = std::stoi(args.substr(0, FIRSTSPACEPOS));
std::string name = args.substr(FIRSTSPACEPOS + 1);
- g_pCompositor->renameWorkspace(workspace, name);
- } else {
- g_pCompositor->renameWorkspace(std::stoi(args), "");
- }
+ if (const auto& PWS = g_pCompositor->getWorkspaceByID(workspace); PWS)
+ PWS->rename(name);
+ else
+ return {.success = false, .error = "No such workspace"};
+ } else if (const auto& PWS = g_pCompositor->getWorkspaceByID(std::stoi(args)); PWS)
+ PWS->rename("");
+ else
+ return {.success = false, .error = "No such workspace"};
} catch (std::exception& e) {
Debug::log(ERR, "Invalid arg in renameWorkspace, expected numeric id only or a numeric id and string name. \"{}\": \"{}\"", args, e.what());
return {.success = false, .error = std::format("Invalid arg in renameWorkspace, expected numeric id only or a numeric id and string name. \"{}\": \"{}\"", args, e.what())};
@@ -2069,9 +2077,9 @@ SDispatchResult CKeybindManager::circleNext(std::string arg) {
if (g_pCompositor->m_pLastWindow.expired()) {
// if we have a clear focus, find the first window and get the next focusable.
- if (g_pCompositor->getWindowsOnWorkspace(g_pCompositor->m_pLastMonitor->activeWorkspaceID()) > 0) {
- const auto PWINDOW = g_pCompositor->getFirstWindowOnWorkspace(g_pCompositor->m_pLastMonitor->activeWorkspaceID());
-
+ const auto PWS = g_pCompositor->m_pLastMonitor->activeWorkspace;
+ if (PWS && PWS->getWindows() > 0) {
+ const auto PWINDOW = PWS->getFirstWindow();
switchToWindow(PWINDOW);
}
@@ -2117,7 +2125,7 @@ SDispatchResult CKeybindManager::focusWindow(std::string regexp) {
}
if (PWORKSPACE->m_bHasFullscreenWindow) {
- const auto FSWINDOW = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ const auto FSWINDOW = PWORKSPACE->getFullscreenWindow();
const auto FSMODE = PWORKSPACE->m_efFullscreenMode;
if (PWINDOW->m_bIsFloating) {
diff --git a/src/managers/input/IdleInhibitor.cpp b/src/managers/input/IdleInhibitor.cpp
index a6f25142..7c91258e 100644
--- a/src/managers/input/IdleInhibitor.cpp
+++ b/src/managers/input/IdleInhibitor.cpp
@@ -63,7 +63,7 @@ void CInputManager::recheckIdleInhibitorStatus() {
return;
}
- if (w->m_eIdleInhibitMode == IDLEINHIBIT_FULLSCREEN && w->isFullscreen() && g_pCompositor->isWorkspaceVisible(w->m_pWorkspace)) {
+ if (w->m_eIdleInhibitMode == IDLEINHIBIT_FULLSCREEN && w->isFullscreen() && w->m_pWorkspace && w->m_pWorkspace->isVisible()) {
PROTO::idle->setInhibit(true);
return;
}
diff --git a/src/managers/input/InputManager.cpp b/src/managers/input/InputManager.cpp
index 9110cd15..525ca954 100644
--- a/src/managers/input/InputManager.cpp
+++ b/src/managers/input/InputManager.cpp
@@ -294,7 +294,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
const auto PWORKSPACE = PMONITOR->activeWorkspace;
const auto PWINDOWIDEAL = g_pCompositor->vectorToWindowUnified(mouseCoords, RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (PWORKSPACE->m_bHasFullscreenWindow && !foundSurface && PWORKSPACE->m_efFullscreenMode == FSMODE_FULLSCREEN) {
- pFoundWindow = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ pFoundWindow = PWORKSPACE->getFullscreenWindow();
if (!pFoundWindow) {
// what the fuck, somehow happens occasionally??
@@ -325,7 +325,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
pFoundWindow = g_pCompositor->vectorToWindowUnified(mouseCoords, RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (pFoundWindow && !pFoundWindow->onSpecialWorkspace()) {
- pFoundWindow = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ pFoundWindow = PWORKSPACE->getFullscreenWindow();
}
} else {
// if we have a maximized window, allow focusing on a bar or something if in reserved area.
@@ -339,7 +339,7 @@ void CInputManager::mouseMoveUnified(uint32_t time, bool refocus) {
pFoundWindow = g_pCompositor->vectorToWindowUnified(mouseCoords, RESERVED_EXTENTS | INPUT_EXTENTS | ALLOW_FLOATING);
if (!(pFoundWindow && pFoundWindow->m_bIsFloating && pFoundWindow->m_bCreatedOverFullscreen))
- pFoundWindow = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ pFoundWindow = PWORKSPACE->getFullscreenWindow();
}
}
}
@@ -1402,7 +1402,7 @@ void CInputManager::refocusLastWindow(PHLMONITOR pMonitor) {
foundSurface = nullptr;
}
- if (!foundSurface && g_pCompositor->m_pLastWindow.lock() && g_pCompositor->isWorkspaceVisibleNotCovered(g_pCompositor->m_pLastWindow->m_pWorkspace)) {
+ if (!foundSurface && g_pCompositor->m_pLastWindow.lock() && g_pCompositor->m_pLastWindow->m_pWorkspace && g_pCompositor->m_pLastWindow->m_pWorkspace->isVisibleNotCovered()) {
// then the last focused window if we're on the same workspace as it
const auto PLASTWINDOW = g_pCompositor->m_pLastWindow.lock();
g_pCompositor->focusWindow(PLASTWINDOW);
diff --git a/src/managers/input/Swipe.cpp b/src/managers/input/Swipe.cpp
index ba0783fa..6cfe5a24 100644
--- a/src/managers/input/Swipe.cpp
+++ b/src/managers/input/Swipe.cpp
@@ -243,8 +243,7 @@ void CInputManager::updateWorkspaceSwipe(double delta) {
m_sActiveSwipe.delta = std::clamp(m_sActiveSwipe.delta, (double)-SWIPEDISTANCE, (double)SWIPEDISTANCE);
if ((m_sActiveSwipe.pWorkspaceBegin->m_iID == workspaceIDLeft && *PSWIPENEW && (m_sActiveSwipe.delta < 0)) ||
- (m_sActiveSwipe.delta > 0 && g_pCompositor->getWindowsOnWorkspace(m_sActiveSwipe.pWorkspaceBegin->m_iID) == 0 &&
- workspaceIDRight <= m_sActiveSwipe.pWorkspaceBegin->m_iID) ||
+ (m_sActiveSwipe.delta > 0 && m_sActiveSwipe.pWorkspaceBegin->getWindows() == 0 && workspaceIDRight <= m_sActiveSwipe.pWorkspaceBegin->m_iID) ||
(m_sActiveSwipe.delta < 0 && m_sActiveSwipe.pWorkspaceBegin->m_iID <= workspaceIDLeft)) {
m_sActiveSwipe.delta = 0;
@@ -270,7 +269,7 @@ void CInputManager::updateWorkspaceSwipe(double delta) {
else
m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((-m_sActiveSwipe.delta) / SWIPEDISTANCE) * XDISTANCE, 0.0));
- g_pCompositor->updateWorkspaceWindowDecos(m_sActiveSwipe.pWorkspaceBegin->m_iID);
+ m_sActiveSwipe.pWorkspaceBegin->updateWindowDecos();
return;
}
m_sActiveSwipe.delta = 0;
@@ -297,7 +296,7 @@ void CInputManager::updateWorkspaceSwipe(double delta) {
m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((-m_sActiveSwipe.delta) / SWIPEDISTANCE) * XDISTANCE, 0.0));
}
- g_pCompositor->updateWorkspaceWindowDecos(workspaceIDLeft);
+ PWORKSPACE->updateWindowDecos();
} else {
const auto PWORKSPACE = g_pCompositor->getWorkspaceByID(workspaceIDRight);
@@ -310,7 +309,7 @@ void CInputManager::updateWorkspaceSwipe(double delta) {
else
m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((-m_sActiveSwipe.delta) / SWIPEDISTANCE) * XDISTANCE, 0.0));
- g_pCompositor->updateWorkspaceWindowDecos(m_sActiveSwipe.pWorkspaceBegin->m_iID);
+ m_sActiveSwipe.pWorkspaceBegin->updateWindowDecos();
return;
}
m_sActiveSwipe.delta = 0;
@@ -337,12 +336,12 @@ void CInputManager::updateWorkspaceSwipe(double delta) {
m_sActiveSwipe.pWorkspaceBegin->m_vRenderOffset.setValueAndWarp(Vector2D(((-m_sActiveSwipe.delta) / SWIPEDISTANCE) * XDISTANCE, 0.0));
}
- g_pCompositor->updateWorkspaceWindowDecos(workspaceIDRight);
+ PWORKSPACE->updateWindowDecos();
}
g_pHyprRenderer->damageMonitor(m_sActiveSwipe.pMonitor.lock());
- g_pCompositor->updateWorkspaceWindowDecos(m_sActiveSwipe.pWorkspaceBegin->m_iID);
+ m_sActiveSwipe.pWorkspaceBegin->updateWindowDecos();
if (*PSWIPEFOREVER) {
if (abs(m_sActiveSwipe.delta) >= SWIPEDISTANCE) {
diff --git a/src/render/Renderer.cpp b/src/render/Renderer.cpp
index 42545bc1..57490d23 100644
--- a/src/render/Renderer.cpp
+++ b/src/render/Renderer.cpp
@@ -310,8 +310,8 @@ bool CHyprRenderer::shouldRenderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor) {
return true;
// if the window is being moved to a workspace that is not invisible, and the alpha is > 0.F, render it.
- if (pWindow->m_iMonitorMovedFrom != -1 && pWindow->m_fMovingToWorkspaceAlpha.isBeingAnimated() && pWindow->m_fMovingToWorkspaceAlpha.value() > 0.F &&
- !g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace))
+ if (pWindow->m_iMonitorMovedFrom != -1 && pWindow->m_fMovingToWorkspaceAlpha.isBeingAnimated() && pWindow->m_fMovingToWorkspaceAlpha.value() > 0.F && pWindow->m_pWorkspace &&
+ !pWindow->m_pWorkspace->isVisible())
return true;
const auto PWINDOWWORKSPACE = pWindow->m_pWorkspace;
@@ -324,18 +324,18 @@ bool CHyprRenderer::shouldRenderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor) {
pWindow->m_fAlpha.value() == 0)
return false;
- if (!PWINDOWWORKSPACE->m_vRenderOffset.isBeingAnimated() && !PWINDOWWORKSPACE->m_fAlpha.isBeingAnimated() && !g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace))
+ if (!PWINDOWWORKSPACE->m_vRenderOffset.isBeingAnimated() && !PWINDOWWORKSPACE->m_fAlpha.isBeingAnimated() && !PWINDOWWORKSPACE->isVisible())
return false;
}
if (pWindow->m_pMonitor == pMonitor)
return true;
- if (!g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace) && pWindow->m_pMonitor != pMonitor)
+ if (!(!pWindow->m_pWorkspace || !pWindow->m_pWorkspace->isVisible()) && pWindow->m_pMonitor != pMonitor)
return false;
// if not, check if it maybe is active on a different monitor.
- if (g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace) && pWindow->m_bIsFloating /* tiled windows can't be multi-ws */)
+ if (pWindow->m_pWorkspace && pWindow->m_pWorkspace->isVisible() && pWindow->m_bIsFloating /* tiled windows can't be multi-ws */)
return !pWindow->isFullscreen(); // Do not draw fullscreen windows on other monitors
if (pMonitor->activeSpecialWorkspace == pWindow->m_pWorkspace)
@@ -376,7 +376,7 @@ bool CHyprRenderer::shouldRenderWindow(PHLWINDOW pWindow) {
if (pWindow->m_bPinned || PWORKSPACE->m_bForceRendering)
return true;
- if (g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace))
+ if (PWORKSPACE && PWORKSPACE->isVisible())
return true;
for (auto const& m : g_pCompositor->m_vMonitors) {
@@ -591,7 +591,7 @@ void CHyprRenderer::renderWindow(PHLWINDOW pWindow, PHLMONITOR pMonitor, timespe
decorate = false;
// whether to use m_fMovingToWorkspaceAlpha, only if fading out into an invisible ws
- const bool USE_WORKSPACE_FADE_ALPHA = pWindow->m_iMonitorMovedFrom != -1 && !g_pCompositor->isWorkspaceVisible(pWindow->m_pWorkspace);
+ const bool USE_WORKSPACE_FADE_ALPHA = pWindow->m_iMonitorMovedFrom != -1 && (!PWORKSPACE || !PWORKSPACE->isVisible());
const bool DONT_BLUR = pWindow->m_sWindowData.noBlur.valueOrDefault() || pWindow->m_sWindowData.RGBX.valueOrDefault() || pWindow->opaque();
renderdata.surface = pWindow->m_pWLSurface->resource();
@@ -933,7 +933,7 @@ void CHyprRenderer::renderAllClientsForWorkspace(PHLMONITOR pMonitor, PHLWORKSPA
// Render layer surfaces below windows for monitor
// if we have a fullscreen, opaque window that convers the screen, we can skip this.
// TODO: check better with solitary after MR for tearing.
- const auto PFULLWINDOW = pWorkspace ? g_pCompositor->getFullscreenWindowOnWorkspace(pWorkspace->m_iID) : nullptr;
+ const auto PFULLWINDOW = pWorkspace ? pWorkspace->getFullscreenWindow() : nullptr;
if (!pWorkspace->m_bHasFullscreenWindow || pWorkspace->m_efFullscreenMode != FSMODE_FULLSCREEN || !PFULLWINDOW || PFULLWINDOW->m_vRealSize.isBeingAnimated() ||
!PFULLWINDOW->opaque() || pWorkspace->m_vRenderOffset.value() != Vector2D{} || g_pHyprOpenGL->preBlurQueued()) {
@@ -2639,7 +2639,7 @@ void CHyprRenderer::recheckSolitaryForMonitor(PHLMONITOR pMonitor) {
PWORKSPACE->m_vRenderOffset.value() != Vector2D{})
return;
- const auto PCANDIDATE = g_pCompositor->getFullscreenWindowOnWorkspace(PWORKSPACE->m_iID);
+ const auto PCANDIDATE = PWORKSPACE->getFullscreenWindow();
if (!PCANDIDATE)
return; // ????