From 5ef2da41be02303848c8317816de0fa8f53501cc Mon Sep 17 00:00:00 2001 From: Guilherme Daher <> Date: Wed, 12 Aug 2026 16:09:48 -0300 Subject: [PATCH 1/2] fix(hyprland/workspaces): handle workspace ID changes --- include/modules/hyprland/workspace.hpp | 1 + include/modules/hyprland/workspaces.hpp | 1 + src/modules/hyprland/workspaces.cpp | 32 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/include/modules/hyprland/workspace.hpp b/include/modules/hyprland/workspace.hpp index 519c347b..b8cbc889 100644 --- a/include/modules/hyprland/workspace.hpp +++ b/include/modules/hyprland/workspace.hpp @@ -61,6 +61,7 @@ class Workspace { void setUrgent(bool value = true) { m_isUrgent = value; }; void setVisible(bool value = true) { m_isVisible = value; }; void setWindows(uint value) { m_windows = value; }; + void setId(int value) { m_id = value; }; void setName(std::string const& value) { m_name = value; }; void setOutput(std::string const& value) { m_output = value; }; bool containsWindow(WindowAddress const& addr) const { diff --git a/include/modules/hyprland/workspaces.hpp b/include/modules/hyprland/workspaces.hpp index c29ec30c..5b14d294 100644 --- a/include/modules/hyprland/workspaces.hpp +++ b/include/modules/hyprland/workspaces.hpp @@ -108,6 +108,7 @@ class Workspaces : public AModule, public EventHandler { Json::Value const& clientsData = Json::Value::nullRef); void onWorkspaceMoved(std::string const& payload); void onWorkspaceRenamed(std::string const& payload); + void onWorkspaceIdChanged(std::string const& payload); static std::optional parseWorkspaceId(std::string const& workspaceIdStr); // monitor events diff --git a/src/modules/hyprland/workspaces.cpp b/src/modules/hyprland/workspaces.cpp index 780e041d..61144609 100644 --- a/src/modules/hyprland/workspaces.cpp +++ b/src/modules/hyprland/workspaces.cpp @@ -312,6 +312,8 @@ void Workspaces::onEvent(const std::string& ev) { onSpecialWorkspaceActivated(payload); } else if (eventName == "destroyworkspacev2") { onWorkspaceDestroyed(payload); + } else if (eventName == "changeworkspaceid") { + onWorkspaceIdChanged(payload); } else if (eventName == "createworkspacev2") { onWorkspaceCreated(payload); } else if (eventName == "focusedmonv2") { @@ -449,6 +451,35 @@ void Workspaces::onWorkspaceRenamed(std::string const& payload) { sortWorkspaces(); } +void Workspaces::onWorkspaceIdChanged(std::string const& payload) { + spdlog::debug("Workspace ID changed: {}", payload); + + const auto [oldIdStr, newIdStr] = splitDoublePayload(payload); + + const auto oldId = parseWorkspaceId(oldIdStr); + const auto newId = parseWorkspaceId(newIdStr); + + if (!oldId.has_value() || !newId.has_value()) { + spdlog::warn("Invalid workspace ID change payload: {}", payload); + return; + } + + for (auto& workspace : m_workspaces) { + if (workspace->id() == *oldId) { + spdlog::debug("Changing workspace ID from {} to {}", *oldId, *newId); + workspace->setId(*newId); + break; + } + } + + if (m_activeWorkspaceId == *oldId) { + m_activeWorkspaceId = *newId; + } + + sortWorkspaces(); + updateWindowCount(); +} + void Workspaces::onMonitorFocused(std::string const& payload) { spdlog::trace("Monitor focused: {}", payload); @@ -827,6 +858,7 @@ auto Workspaces::registerIpc() -> void { m_ipc.registerForIPC("createworkspacev2", this); m_ipc.registerForIPC("destroyworkspacev2", this); m_ipc.registerForIPC("focusedmonv2", this); + m_ipc.registerForIPC("changeworkspaceid", this); m_ipc.registerForIPC("moveworkspacev2", this); m_ipc.registerForIPC("renameworkspace", this); m_ipc.registerForIPC("openwindow", this); From e92f280a9429bda024df96f4fd9cb5b597daa356 Mon Sep 17 00:00:00 2001 From: Guilherme Daher <> Date: Wed, 12 Aug 2026 17:06:44 -0300 Subject: [PATCH 2/2] fix: formatted with clang --- include/modules/hyprland/workspaces.hpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/include/modules/hyprland/workspaces.hpp b/include/modules/hyprland/workspaces.hpp index 5b14d294..f71a6e42 100644 --- a/include/modules/hyprland/workspaces.hpp +++ b/include/modules/hyprland/workspaces.hpp @@ -169,11 +169,12 @@ class Workspaces : public AModule, public EventHandler { enum class SortMethod { ID, NAME, NUMBER, SPECIAL_CENTERED, DEFAULT }; SortMethod m_sortBy = SortMethod::DEFAULT; - static inline const std::map m_sortMap = {{"ID", SortMethod::ID}, - {"NAME", SortMethod::NAME}, - {"NUMBER", SortMethod::NUMBER}, - {"SPECIAL-CENTERED", SortMethod::SPECIAL_CENTERED}, - {"DEFAULT", SortMethod::DEFAULT}}; + static inline const std::map m_sortMap = { + {"ID", SortMethod::ID}, + {"NAME", SortMethod::NAME}, + {"NUMBER", SortMethod::NUMBER}, + {"SPECIAL-CENTERED", SortMethod::SPECIAL_CENTERED}, + {"DEFAULT", SortMethod::DEFAULT}}; std::string m_formatBefore; std::string m_formatAfter;