summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud <arnaudma.code@gmail.com>2025-08-13 09:45:34 +0200
committerGitHub <noreply@github.com>2025-08-13 08:45:34 +0100
commitaa6a78f0a4e17c49ed4aff8b58c3f7ec7ef0408f (patch)
tree0467f52be27e283a489edff09009a78a7fbecb03
parent2b6e2ceb2e66407e80b98015eb9f559f06405b2f (diff)
internal: Ensure unique identifiers for persistent workspaces (#11409)
-rw-r--r--hyprtester/src/tests/main/persistent.cpp4
-rw-r--r--src/Compositor.cpp8
2 files changed, 11 insertions, 1 deletions
diff --git a/hyprtester/src/tests/main/persistent.cpp b/hyprtester/src/tests/main/persistent.cpp
index 8a2324a7..bd93e916 100644
--- a/hyprtester/src/tests/main/persistent.cpp
+++ b/hyprtester/src/tests/main/persistent.cpp
@@ -30,6 +30,7 @@ static bool test() {
OK(getFromSocket("/keyword workspace 5, monitor:HEADLESS-2, persistent:1"));
OK(getFromSocket("/keyword workspace 6, monitor:HEADLESS-PERSISTENT-TEST, persistent:1"));
OK(getFromSocket("/keyword workspace name:PERSIST, monitor:HEADLESS-PERSISTENT-TEST, persistent:1"));
+ OK(getFromSocket("/keyword workspace name:PERSIST-2, monitor:HEADLESS-PERSISTENT-TEST, persistent:1"));
{
auto str = getFromSocket("/workspaces");
@@ -52,7 +53,8 @@ static bool test() {
EXPECT_CONTAINS(str, "ID 5 (5)");
EXPECT_CONTAINS(str, "ID 6 (6)");
EXPECT_CONTAINS(str, "(PERSIST) on monitor");
- EXPECT_COUNT_STRING(str, "workspace ID ", 5);
+ EXPECT_CONTAINS(str, "(PERSIST-2) on monitor");
+ EXPECT_COUNT_STRING(str, "workspace ID ", 6);
}
OK(getFromSocket("/reload"));
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 4d0a917b..3b8fb0a5 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -1727,6 +1727,14 @@ WORKSPACEID CCompositor::getNextAvailableNamedWorkspace() {
lowest = w->m_id;
}
+ // Give priority to persistent workspaces to avoid any conflicts between them.
+ for (auto const& rule : g_pConfigManager->getAllWorkspaceRules()) {
+ if (!rule.isPersistent)
+ continue;
+ if (rule.workspaceId < -1 && rule.workspaceId < lowest)
+ lowest = rule.workspaceId;
+ }
+
return lowest - 1;
}