diff options
author | zakk4223 <[email protected]> | 2024-04-18 21:44:51 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2024-04-19 02:44:51 +0100 |
commit | 4d0a63523751a590a521fd873f770825023069ae (patch) | |
tree | 3777908a5f7414895ad7963695423289340587fb | |
parent | 82222342f10a7eff0ec9be972153e740d0f95213 (diff) | |
download | Hyprland-4d0a63523751a590a521fd873f770825023069ae.tar.gz Hyprland-4d0a63523751a590a521fd873f770825023069ae.zip |
workspace: Add 'v' flag for workspace selector that counts only visible windows (#5628)
* Add 'v' flag for workspace selector: counts only visible windows
* extra commit because I'm dumb
* guard
-rw-r--r-- | src/Compositor.cpp | 25 | ||||
-rw-r--r-- | src/Compositor.hpp | 4 | ||||
-rw-r--r-- | src/desktop/Workspace.cpp | 21 |
3 files changed, 35 insertions, 15 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 47679169..ae1c352c 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -1273,23 +1273,34 @@ void CCompositor::sanityCheckWorkspaces() { } } -int CCompositor::getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTiled) { +int CCompositor::getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) { int no = 0; for (auto& w : m_vWindows) { - if (w->workspaceID() == id && w->m_bIsMapped && !(onlyTiled.has_value() && !w->m_bIsFloating != onlyTiled.value())) - no++; + 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 int& id, std::optional<bool> onlyTiled) { +int CCompositor::getGroupsOnWorkspace(const int& id, std::optional<bool> onlyTiled, std::optional<bool> onlyVisible) { int no = 0; for (auto& w : m_vWindows) { - if (w->workspaceID() == id && w->m_bIsMapped && !(onlyTiled.has_value() && !w->m_bIsFloating != onlyTiled.value()) && w->m_sGroupData.head) - no++; + 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; } diff --git a/src/Compositor.hpp b/src/Compositor.hpp index f2d39490..11c02814 100644 --- a/src/Compositor.hpp +++ b/src/Compositor.hpp @@ -151,8 +151,8 @@ class CCompositor { void sanityCheckWorkspaces(); void updateWorkspaceWindowDecos(const int&); void updateWorkspaceSpecialRenderData(const int&); - int getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {}); - int getGroupsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {}); + int getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {}); + int getGroupsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {}, std::optional<bool> onlyVisible = {}); CWindow* getUrgentWindow(); bool hasUrgentWindowOnWorkspace(const int&); CWindow* getFirstWindowOnWorkspace(const int&); diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp index 5789e54f..25015c5a 100644 --- a/src/desktop/Workspace.cpp +++ b/src/desktop/Workspace.cpp @@ -251,6 +251,7 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) { // m - monitor: m[monitor_selector] // w - windowCount: w[1-4] or w[1], optional flag t or f for tiled or floating and // flag g to count groups instead of windows, e.g. w[t1-2], w[fg4] + // flag v will count only visible windows const auto NEXTSPACE = selector.find_first_of(' ', i); std::string prop = selector.substr(i, NEXTSPACE == std::string::npos ? std::string::npos : NEXTSPACE - i); @@ -355,8 +356,9 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) { prop = prop.substr(2, prop.length() - 3); - int wantsOnlyTiled = -1; - bool wantsCountGroup = false; + int wantsOnlyTiled = -1; + bool wantsCountGroup = false; + bool wantsCountVisible = false; int flagCount = 0; for (auto& flag : prop) { @@ -369,6 +371,9 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) { } else if (flag == 'g' && !wantsCountGroup) { wantsCountGroup = true; flagCount++; + } else if (flag == 'v' && !wantsCountVisible) { + wantsCountVisible = true; + flagCount++; } else { break; } @@ -392,9 +397,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)); + count = g_pCompositor->getGroupsOnWorkspace(m_iID, 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)); + count = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled), + wantsCountVisible ? std::optional<bool>(wantsCountVisible) : std::nullopt); if (count != from) return false; @@ -424,9 +431,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)); + count = g_pCompositor->getGroupsOnWorkspace(m_iID, 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)); + count = g_pCompositor->getWindowsOnWorkspace(m_iID, 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; |