summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoberto Previdi <hariseldon78@gmail.com>2025-02-15 15:01:52 +0100
committerGitHub <noreply@github.com>2025-02-15 15:01:52 +0100
commit410da2e46fc44d93196cd902a070391a416cff01 (patch)
treec66effd5facc0a7e30efad024ba49e952b9046c2 /src
parent7a6fde8414ae200759ac41569f189ac5e1ba0fbb (diff)
workspaces: update persistence on workspace rename (#9368)
Diffstat (limited to 'src')
-rw-r--r--src/Compositor.cpp49
-rw-r--r--src/Compositor.hpp2
-rw-r--r--src/debug/HyprCtl.cpp14
-rw-r--r--src/desktop/Workspace.cpp6
4 files changed, 48 insertions, 23 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp
index 6d9e8d7e..5389844f 100644
--- a/src/Compositor.cpp
+++ b/src/Compositor.cpp
@@ -3043,34 +3043,53 @@ bool CCompositor::shouldChangePreferredImageDescription() {
return false;
}
-void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspaceRule>& rules) {
+void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspaceRule>& rules, PHLWORKSPACE pWorkspace) {
+
for (const auto& rule : rules) {
if (!rule.isPersistent)
continue;
+ PHLWORKSPACE PWORKSPACE = nullptr;
+ if (pWorkspace) {
+ if (pWorkspace->matchesStaticSelector(rule.workspaceString))
+ PWORKSPACE = pWorkspace;
+ else
+ continue;
+ }
+
const auto PMONITOR = getMonitorFromString(rule.monitor);
- if (!PMONITOR) {
- Debug::log(ERR, "ensurePersistentWorkspacesPresent: couldn't resolve monitor for {}, skipping", rule.monitor);
- continue;
- }
+ if (!PWORKSPACE) {
+ WORKSPACEID id = rule.workspaceId;
+ std::string wsname = rule.workspaceName;
- WORKSPACEID id = rule.workspaceId;
- std::string wsname = rule.workspaceName;
- if (id == WORKSPACE_INVALID) {
- const auto R = getWorkspaceIDNameFromString(rule.workspaceString);
- id = R.id;
- wsname = R.name;
+ if (id == WORKSPACE_INVALID) {
+ const auto R = getWorkspaceIDNameFromString(rule.workspaceString);
+ id = R.id;
+ wsname = R.name;
+ }
+
+ if (id == WORKSPACE_INVALID) {
+ Debug::log(ERR, "ensurePersistentWorkspacesPresent: couldn't resolve id for workspace {}", rule.workspaceString);
+ continue;
+ }
+ PWORKSPACE = getWorkspaceByID(id);
+ if (!PWORKSPACE)
+ createNewWorkspace(id, PMONITOR ? PMONITOR : m_pLastMonitor.lock(), wsname, false);
}
- if (id == WORKSPACE_INVALID) {
- Debug::log(ERR, "ensurePersistentWorkspacesPresent: couldn't resolve id for workspace {}", rule.workspaceString);
+ if (PWORKSPACE)
+ PWORKSPACE->m_bPersistent = true;
+
+ if (!PMONITOR) {
+ Debug::log(ERR, "ensurePersistentWorkspacesPresent: couldn't resolve monitor for {}, skipping", rule.monitor);
continue;
}
- if (const auto PWORKSPACE = getWorkspaceByID(id); PWORKSPACE) {
+ if (PWORKSPACE) {
if (PWORKSPACE->m_pMonitor == PMONITOR) {
Debug::log(LOG, "ensurePersistentWorkspacesPresent: workspace persistent {} already on {}", rule.workspaceString, PMONITOR->szName);
+
continue;
}
@@ -3078,8 +3097,6 @@ void CCompositor::ensurePersistentWorkspacesPresent(const std::vector<SWorkspace
moveWorkspaceToMonitor(PWORKSPACE, PMONITOR);
continue;
}
-
- createNewWorkspace(id, PMONITOR ? PMONITOR : m_pLastMonitor.lock(), wsname, false);
}
// cleanup old
diff --git a/src/Compositor.hpp b/src/Compositor.hpp
index 893ffadd..1ae367a3 100644
--- a/src/Compositor.hpp
+++ b/src/Compositor.hpp
@@ -147,7 +147,7 @@ class CCompositor {
void setPreferredTransformForSurface(SP<CWLSurfaceResource> pSurface, wl_output_transform transform);
void updateSuspendedStates();
void onNewMonitor(SP<Aquamarine::IOutput> output);
- void ensurePersistentWorkspacesPresent(const std::vector<SWorkspaceRule>& rules);
+ void ensurePersistentWorkspacesPresent(const std::vector<SWorkspaceRule>& rules, PHLWORKSPACE pWorkspace = nullptr);
SImageDescription getPreferredImageDescription();
bool shouldChangePreferredImageDescription();
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index cd6451e2..a155474d 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -319,15 +319,17 @@ std::string CHyprCtl::getWorkspaceData(PHLWORKSPACE w, eHyprCtlOutputFormat form
"windows": {},
"hasfullscreen": {},
"lastwindow": "0x{:x}",
- "lastwindowtitle": "{}"
+ "lastwindowtitle": "{}",
+ "ispersistent": {}
}})#",
w->m_iID, escapeJSONStrings(w->m_szName), escapeJSONStrings(PMONITOR ? PMONITOR->szName : "?"),
- 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) : "");
+ escapeJSONStrings(PMONITOR ? std::to_string(PMONITOR->ID) : "null"), w->getWindows(), w->m_bHasFullscreenWindow ? "true" : "false",
+ (uintptr_t)PLASTW.get(), PLASTW ? escapeJSONStrings(PLASTW->m_szTitle) : "", w->m_bPersistent ? "true" : "false");
} 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", w->getWindows(), (int)w->m_bHasFullscreenWindow,
- (uintptr_t)PLASTW.get(), PLASTW ? PLASTW->m_szTitle : "");
+ return std::format(
+ "workspace ID {} ({}) on monitor {}:\n\tmonitorID: {}\n\twindows: {}\n\thasfullscreen: {}\n\tlastwindow: 0x{:x}\n\tlastwindowtitle: {}\n\tispersistent: {}\n\n",
+ w->m_iID, 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 : "", (int)w->m_bPersistent);
}
}
diff --git a/src/desktop/Workspace.cpp b/src/desktop/Workspace.cpp
index f2c22195..322c4e33 100644
--- a/src/desktop/Workspace.cpp
+++ b/src/desktop/Workspace.cpp
@@ -648,6 +648,12 @@ void CWorkspace::rename(const std::string& name) {
Debug::log(LOG, "CWorkspace::rename: Renaming workspace {} to '{}'", m_iID, name);
m_szName = name;
+ const auto WORKSPACERULE = g_pConfigManager->getWorkspaceRuleFor(m_pSelf.lock());
+ m_bPersistent = WORKSPACERULE.isPersistent;
+
+ if (WORKSPACERULE.isPersistent)
+ g_pCompositor->ensurePersistentWorkspacesPresent(std::vector<SWorkspaceRule>{WORKSPACERULE}, m_pSelf.lock());
+
g_pEventManager->postEvent({"renameworkspace", std::to_string(m_iID) + "," + m_szName});
}