Skip to content

Commit

Permalink
workspace: Add count group flag in windowCount workspace selector prop (
Browse files Browse the repository at this point in the history
hyprwm#5499)

* Add groupCount workspace selector prop

* Intergrate groupCount with windowCount
  • Loading branch information
sungyoonc authored and lisuke committed Apr 15, 2024
1 parent 4764603 commit aca199b
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 12 deletions.
10 changes: 10 additions & 0 deletions src/Compositor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,16 @@ int CCompositor::getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTi
return no;
}

int CCompositor::getGroupsOnWorkspace(const int& id, std::optional<bool> onlyTiled) {
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++;
}

return no;
}

CWindow* CCompositor::getUrgentWindow() {
for (auto& w : m_vWindows) {
if (w->m_bIsMapped && w->m_bIsUrgent)
Expand Down
1 change: 1 addition & 0 deletions src/Compositor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ class CCompositor {
void sanityCheckWorkspaces();
void updateWorkspaceWindowDecos(const int&);
int getWindowsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {});
int getGroupsOnWorkspace(const int& id, std::optional<bool> onlyTiled = {});
CWindow* getUrgentWindow();
bool hasUrgentWindowOnWorkspace(const int&);
CWindow* getFirstWindowOnWorkspace(const int&);
Expand Down
1 change: 1 addition & 0 deletions src/desktop/Window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -852,6 +852,7 @@ void CWindow::destroyGroup() {
return;
}
m_sGroupData.pNextWindow = nullptr;
m_sGroupData.head = false;
updateWindowDecos();
return;
}
Expand Down
48 changes: 36 additions & 12 deletions src/desktop/Workspace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,8 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {
// s - special: s[true]
// n - named: n[true] or n[s:string] or n[e:string]
// m - monitor: m[monitor_selector]
// w - windowCount: w[0-4] or w[1], optional flag t or f for tiled or floating, e.g. w[t0-1]
// 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]

const auto NEXTSPACE = selector.find_first_of(' ', i);
std::string prop = selector.substr(i, NEXTSPACE == std::string::npos ? std::string::npos : NEXTSPACE - i);
Expand Down Expand Up @@ -354,15 +355,25 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {

prop = prop.substr(2, prop.length() - 3);

int wantsOnlyTiled = -1;

if (prop.starts_with("t")) {
wantsOnlyTiled = 1;
prop = prop.substr(1);
} else if (prop.starts_with("f")) {
wantsOnlyTiled = 0;
prop = prop.substr(1);
int wantsOnlyTiled = -1;
bool wantsCountGroup = false;

int flagCount = 0;
for (auto& flag : prop) {
if (flag == 't' && wantsOnlyTiled == -1) {
wantsOnlyTiled = 1;
flagCount++;
} else if (flag == 'f' && wantsOnlyTiled == -1) {
wantsOnlyTiled = 0;
flagCount++;
} else if (flag == 'g' && !wantsCountGroup) {
wantsCountGroup = true;
flagCount++;
} else {
break;
}
}
prop = prop.substr(flagCount);

if (!prop.contains("-")) {
// try single
Expand All @@ -379,7 +390,15 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {
return false;
}

return g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled)) == from;
int count;
if (wantsCountGroup)
count = g_pCompositor->getGroupsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled));
else
count = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled));

if (count != from)
return false;
continue;
}

const auto DASHPOS = prop.find("-");
Expand All @@ -403,8 +422,13 @@ bool CWorkspace::matchesStaticSelector(const std::string& selector_) {
return false;
}

const auto WINDOWSONWORKSPACE = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled));
if (std::clamp(WINDOWSONWORKSPACE, from, to) != WINDOWSONWORKSPACE)
int count;
if (wantsCountGroup)
count = g_pCompositor->getGroupsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled));
else
count = g_pCompositor->getWindowsOnWorkspace(m_iID, wantsOnlyTiled == -1 ? std::nullopt : std::optional<bool>((bool)wantsOnlyTiled));

if (std::clamp(count, from, to) != count)
return false;
continue;
}
Expand Down

0 comments on commit aca199b

Please sign in to comment.