fix: Use workspace ID to handle workspace updates

This commit is contained in:
Emiliano Deustua
2026-07-04 01:42:54 +02:00
committed by Alexays
parent 0bb207d56f
commit 7c86f1ccb4
+9 -16
View File
@@ -79,18 +79,14 @@ Json::Value Workspaces::createMonitorWorkspaceData(std::string const& name,
void Workspaces::createWorkspace(Json::Value const& workspace_data, void Workspaces::createWorkspace(Json::Value const& workspace_data,
Json::Value const& clients_data) { Json::Value const& clients_data) {
auto workspaceName = workspace_data["name"].asString();
auto workspaceId = workspace_data["id"].asInt(); auto workspaceId = workspace_data["id"].asInt();
spdlog::debug("Creating workspace {}", workspaceName); spdlog::debug("Creating workspace {}", workspaceId);
// avoid recreating existing workspaces // avoid recreating existing workspaces
auto workspace = std::ranges::find_if(m_workspaces, [&](std::unique_ptr<Workspace> const& w) { auto workspace =
if (workspaceId > 0) { std::ranges::find_if(m_workspaces, [workspaceId](std::unique_ptr<Workspace> const& w) {
return w->id() == workspaceId; return workspaceId == w->id();
} });
return (workspaceName.starts_with("special:") && workspaceName.substr(8) == w->name()) ||
workspaceName == w->name();
});
if (workspace != m_workspaces.end()) { if (workspace != m_workspaces.end()) {
// don't recreate workspace, but update persistency if necessary // don't recreate workspace, but update persistency if necessary
@@ -98,14 +94,14 @@ void Workspaces::createWorkspace(Json::Value const& workspace_data,
const auto* k = "persistent-rule"; const auto* k = "persistent-rule";
if (std::ranges::find(keys, k) != keys.end()) { if (std::ranges::find(keys, k) != keys.end()) {
spdlog::debug("Set dynamic persistency of workspace {} to: {}", workspaceName, spdlog::debug("Set dynamic persistency of workspace {} to: {}", workspaceId,
workspace_data[k].asBool() ? "true" : "false"); workspace_data[k].asBool() ? "true" : "false");
(*workspace)->setPersistentRule(workspace_data[k].asBool()); (*workspace)->setPersistentRule(workspace_data[k].asBool());
} }
k = "persistent-config"; k = "persistent-config";
if (std::ranges::find(keys, k) != keys.end()) { if (std::ranges::find(keys, k) != keys.end()) {
spdlog::debug("Set config persistency of workspace {} to: {}", workspaceName, spdlog::debug("Set config persistency of workspace {} to: {}", workspaceId,
workspace_data[k].asBool() ? "true" : "false"); workspace_data[k].asBool() ? "true" : "false");
(*workspace)->setPersistentConfig(workspace_data[k].asBool()); (*workspace)->setPersistentConfig(workspace_data[k].asBool());
} }
@@ -1101,8 +1097,7 @@ void Workspaces::updateWindowCount() {
const Json::Value workspacesJson = m_ipc.getSocket1JsonReply("workspaces"); const Json::Value workspacesJson = m_ipc.getSocket1JsonReply("workspaces");
for (auto const& workspace : m_workspaces) { for (auto const& workspace : m_workspaces) {
auto workspaceJson = std::ranges::find_if(workspacesJson, [&](Json::Value const& x) { auto workspaceJson = std::ranges::find_if(workspacesJson, [&](Json::Value const& x) {
return x["name"].asString() == workspace->name() || return x["id"].asInt() == workspace->id();
(workspace->isSpecial() && x["name"].asString() == "special:" + workspace->name());
}); });
uint32_t count = 0; uint32_t count = 0;
if (workspaceJson != workspacesJson.end()) { if (workspaceJson != workspacesJson.end()) {
@@ -1171,9 +1166,7 @@ void Workspaces::updateWorkspaceStates() {
workspaceTooltip = workspace->selectString(m_tooltipMap); workspaceTooltip = workspace->selectString(m_tooltipMap);
} }
auto updatedWorkspace = std::ranges::find_if(updatedWorkspaces, [&workspace](const auto& w) { auto updatedWorkspace = std::ranges::find_if(updatedWorkspaces, [&workspace](const auto& w) {
auto wNameRaw = w["name"].asString(); return w["id"].asInt() == workspace->id();
auto wName = wNameRaw.starts_with("special:") ? wNameRaw.substr(8) : wNameRaw;
return wName == workspace->name();
}); });
if (updatedWorkspace != updatedWorkspaces.end()) { if (updatedWorkspace != updatedWorkspaces.end()) {
workspace->setOutput((*updatedWorkspace)["monitor"].asString()); workspace->setOutput((*updatedWorkspace)["monitor"].asString());