diff --git a/src/wayland/hyprland/ipc/connection.cpp b/src/wayland/hyprland/ipc/connection.cpp index c797b609..794ecff6 100644 --- a/src/wayland/hyprland/ipc/connection.cpp +++ b/src/wayland/hyprland/ipc/connection.cpp @@ -333,7 +333,6 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) { auto* monitor = this->findMonitorByName(name, true); this->setFocusedMonitor(monitor); monitor->setActiveWorkspace(workspace); - qCDebug(logHyprlandIpc) << "Monitor" << name << "focused with workspace" << workspace->id(); } else if (event->name == "workspacev2") { auto args = event->parseView(2); auto id = args.at(0).toInt(); @@ -342,8 +341,6 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) { if (this->mFocusedMonitor != nullptr) { auto* workspace = this->findWorkspaceByName(name, true, id); this->mFocusedMonitor->setActiveWorkspace(workspace); - qCDebug(logHyprlandIpc) << "Workspace" << id << "activated on" - << this->mFocusedMonitor->name(); } } else if (event->name == "moveworkspacev2") { auto args = event->parseView(3); @@ -354,7 +351,6 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) { auto* workspace = this->findWorkspaceByName(name, true, id); auto* monitor = this->findMonitorByName(monitorName, true); - qCDebug(logHyprlandIpc) << "Workspace" << id << "moved to monitor" << monitorName; workspace->setMonitor(monitor); } else if (event->name == "renameworkspace") { auto args = event->parseView(2); @@ -378,28 +374,15 @@ void HyprlandIpc::onEvent(HyprlandIpcEvent* event) { HyprlandWorkspace* HyprlandIpc::findWorkspaceByName(const QString& name, bool createIfMissing, qint32 id) { const auto& mList = this->mWorkspaces.valueList(); - HyprlandWorkspace* workspace = nullptr; - if (id != -1) { - auto workspaceIter = - std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->id() == id; }); + auto workspaceIter = + std::ranges::find_if(mList, [name](const HyprlandWorkspace* m) { return m->name() == name; }); - workspace = workspaceIter == mList.end() ? nullptr : *workspaceIter; - } - - if (!workspace) { - auto workspaceIter = - std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->name() == name; }); - - workspace = workspaceIter == mList.end() ? nullptr : *workspaceIter; - } - - if (workspace) { - return workspace; + if (workspaceIter != mList.end()) { + return *workspaceIter; } else if (createIfMissing) { qCDebug(logHyprlandIpc) << "Workspace" << name - << "requested before creation, performing early init with id" << id; - + << "requested before creation, performing early init"; auto* workspace = new HyprlandWorkspace(this); workspace->updateInitial(id, name); this->mWorkspaces.insertObject(workspace); @@ -417,34 +400,24 @@ void HyprlandIpc::refreshWorkspaces(bool canCreate) { this->requestingWorkspaces = false; if (!success) return; - qCDebug(logHyprlandIpc) << "Parsing workspaces response"; + qCDebug(logHyprlandIpc) << "parsing workspaces response"; auto json = QJsonDocument::fromJson(resp).array(); const auto& mList = this->mWorkspaces.valueList(); - auto ids = QVector(); + auto names = QVector(); for (auto entry: json) { auto object = entry.toObject().toVariantMap(); + auto name = object.value("name").toString(); - auto id = object.value("id").toInt(); - - auto workspaceIter = - std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { return m->id() == id; }); - - // Only fall back to name-based filtering as a last resort, for workspaces where - // no ID has been determined yet. - if (workspaceIter == mList.end()) { - auto name = object.value("name").toString(); - - workspaceIter = std::ranges::find_if(mList, [&](const HyprlandWorkspace* m) { - return m->id() == -1 && m->name() == name; - }); - } + auto workspaceIter = std::ranges::find_if(mList, [name](const HyprlandWorkspace* m) { + return m->name() == name; + }); auto* workspace = workspaceIter == mList.end() ? nullptr : *workspaceIter; auto existed = workspace != nullptr; - if (!existed) { + if (workspace == nullptr) { if (!canCreate) continue; workspace = new HyprlandWorkspace(this); } @@ -455,22 +428,20 @@ void HyprlandIpc::refreshWorkspaces(bool canCreate) { this->mWorkspaces.insertObject(workspace); } - ids.push_back(id); + names.push_back(name); } - if (canCreate) { - auto removedWorkspaces = QVector(); + auto removedWorkspaces = QVector(); - for (auto* workspace: mList) { - if (!ids.contains(workspace->id())) { - removedWorkspaces.push_back(workspace); - } + for (auto* workspace: mList) { + if (!names.contains(workspace->name())) { + removedWorkspaces.push_back(workspace); } + } - for (auto* workspace: removedWorkspaces) { - this->mWorkspaces.removeObject(workspace); - delete workspace; - } + for (auto* workspace: removedWorkspaces) { + this->mWorkspaces.removeObject(workspace); + delete workspace; } }); } diff --git a/src/wayland/hyprland/ipc/connection.hpp b/src/wayland/hyprland/ipc/connection.hpp index 287b1ee8..856d4173 100644 --- a/src/wayland/hyprland/ipc/connection.hpp +++ b/src/wayland/hyprland/ipc/connection.hpp @@ -81,7 +81,7 @@ public: [[nodiscard]] ObjectModel* workspaces(); // No byId because these preemptively create objects. The given id is set if created. - HyprlandWorkspace* findWorkspaceByName(const QString& name, bool createIfMissing, qint32 id = -1); + HyprlandWorkspace* findWorkspaceByName(const QString& name, bool createIfMissing, qint32 id = 0); HyprlandMonitor* findMonitorByName(const QString& name, bool createIfMissing, qint32 id = -1); // canCreate avoids making ghost workspaces when the connection races diff --git a/src/wayland/hyprland/ipc/monitor.cpp b/src/wayland/hyprland/ipc/monitor.cpp index 190ab668..8ee5e207 100644 --- a/src/wayland/hyprland/ipc/monitor.cpp +++ b/src/wayland/hyprland/ipc/monitor.cpp @@ -117,8 +117,6 @@ void HyprlandMonitor::setActiveWorkspace(HyprlandWorkspace* workspace) { this->mActiveWorkspace = workspace; if (workspace != nullptr) { - workspace->setMonitor(this); - QObject::connect( workspace, &QObject::destroyed, diff --git a/src/wayland/hyprland/ipc/workspace.cpp b/src/wayland/hyprland/ipc/workspace.cpp index 428edd6b..153dea6b 100644 --- a/src/wayland/hyprland/ipc/workspace.cpp +++ b/src/wayland/hyprland/ipc/workspace.cpp @@ -35,22 +35,18 @@ void HyprlandWorkspace::updateInitial(qint32 id, QString name) { } void HyprlandWorkspace::updateFromObject(QVariantMap object) { + auto id = object.value("id").value(); auto name = object.value("name").value(); auto monitorId = object.value("monitorID").value(); auto monitorName = object.value("monitor").value(); - auto initial = this->mId = -1; - - // ID cannot be updated after creation - if (initial) { - this->mId = object.value("id").value(); + if (id != this->mId) { + this->mId = id; emit this->idChanged(); } - // No events we currently handle give a workspace id but not a name, - // so we shouldn't set this if it isn't an initial query - if (initial && name != this->mName) { - this->mName = name; + if (name != this->mName) { + this->mName = std::move(name); emit this->nameChanged(); }