From 23727eed8a8ce55d4318b7f5715a96e4d6edea0a Mon Sep 17 00:00:00 2001 From: Nikolai Papin Date: Mon, 2 Mar 2026 18:40:41 +0300 Subject: [PATCH] fix: hosting-monitor classes not recheck on monitor disconnect/waybar restart --- .../modules/{cava => cava.old}/cavaGLSL.hpp | 0 .../modules/{cava => cava.old}/cavaRaw.hpp | 0 .../{cava => cava.old}/cava_backend.hpp | 0 .../{cava => cava.old}/cava_frontend.hpp | 0 meson.build | 12 ---- src/factory.cpp | 5 +- src/modules/{cava => cava.old}/cavaGLSL.cpp | 0 src/modules/{cava => cava.old}/cavaRaw.cpp | 0 .../{cava => cava.old}/cava_backend.cpp | 0 src/modules/hyprland/workspace.cpp | 60 ++++++++----------- 10 files changed, 27 insertions(+), 50 deletions(-) rename include/modules/{cava => cava.old}/cavaGLSL.hpp (100%) rename include/modules/{cava => cava.old}/cavaRaw.hpp (100%) rename include/modules/{cava => cava.old}/cava_backend.hpp (100%) rename include/modules/{cava => cava.old}/cava_frontend.hpp (100%) rename src/modules/{cava => cava.old}/cavaGLSL.cpp (100%) rename src/modules/{cava => cava.old}/cavaRaw.cpp (100%) rename src/modules/{cava => cava.old}/cava_backend.cpp (100%) diff --git a/include/modules/cava/cavaGLSL.hpp b/include/modules/cava.old/cavaGLSL.hpp similarity index 100% rename from include/modules/cava/cavaGLSL.hpp rename to include/modules/cava.old/cavaGLSL.hpp diff --git a/include/modules/cava/cavaRaw.hpp b/include/modules/cava.old/cavaRaw.hpp similarity index 100% rename from include/modules/cava/cavaRaw.hpp rename to include/modules/cava.old/cavaRaw.hpp diff --git a/include/modules/cava/cava_backend.hpp b/include/modules/cava.old/cava_backend.hpp similarity index 100% rename from include/modules/cava/cava_backend.hpp rename to include/modules/cava.old/cava_backend.hpp diff --git a/include/modules/cava/cava_frontend.hpp b/include/modules/cava.old/cava_frontend.hpp similarity index 100% rename from include/modules/cava/cava_frontend.hpp rename to include/modules/cava.old/cava_frontend.hpp diff --git a/meson.build b/meson.build index db9407eb..530ae98b 100644 --- a/meson.build +++ b/meson.build @@ -505,18 +505,6 @@ cava = dependency('libcava', eproxy = dependency('epoxy', required: false) -if cava.found() - add_project_arguments('-DHAVE_LIBCAVA', language: 'cpp') - src_files += files('src/modules/cava/cavaRaw.cpp', - 'src/modules/cava/cava_backend.cpp') - man_files += files('man/waybar-cava.5.scd') - - if eproxy.found() - add_project_arguments('-DHAVE_LIBCAVAGLSL', language: 'cpp') - src_files += files('src/modules/cava/cavaGLSL.cpp') - endif -endif - if libgps.found() add_project_arguments('-DHAVE_LIBGPS', language: 'cpp') src_files += files('src/modules/gps.cpp') diff --git a/src/factory.cpp b/src/factory.cpp index 2fd3e3b8..e7cb5087 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -114,7 +114,7 @@ #ifdef HAVE_LIBGPS #include "modules/gps.hpp" #endif -#include "modules/cava/cava_frontend.hpp" +// #include "modules/cava/cava_frontend.hpp" #include "modules/cffi.hpp" #include "modules/custom.hpp" #include "modules/image.hpp" @@ -339,9 +339,6 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name, return new waybar::modules::Wireplumber(id, config_[name]); } #endif - if (ref == "cava") { - return waybar::modules::cava::getModule(id, config_[name]); - } #ifdef HAVE_SYSTEMD_MONITOR if (ref == "systemd-failed-units") { return new waybar::modules::SystemdFailedUnits(id, config_[name]); diff --git a/src/modules/cava/cavaGLSL.cpp b/src/modules/cava.old/cavaGLSL.cpp similarity index 100% rename from src/modules/cava/cavaGLSL.cpp rename to src/modules/cava.old/cavaGLSL.cpp diff --git a/src/modules/cava/cavaRaw.cpp b/src/modules/cava.old/cavaRaw.cpp similarity index 100% rename from src/modules/cava/cavaRaw.cpp rename to src/modules/cava.old/cavaRaw.cpp diff --git a/src/modules/cava/cava_backend.cpp b/src/modules/cava.old/cava_backend.cpp similarity index 100% rename from src/modules/cava/cava_backend.cpp rename to src/modules/cava.old/cava_backend.cpp diff --git a/src/modules/hyprland/workspace.cpp b/src/modules/hyprland/workspace.cpp index 426420dc..ae66bc84 100644 --- a/src/modules/hyprland/workspace.cpp +++ b/src/modules/hyprland/workspace.cpp @@ -11,8 +11,8 @@ namespace waybar::modules::hyprland { -Workspace::Workspace(const Json::Value& workspace_data, Workspaces& workspace_manager, - const Json::Value& clients_data) +Workspace::Workspace(const Json::Value &workspace_data, Workspaces &workspace_manager, + const Json::Value &clients_data) : m_workspaceManager(workspace_manager), m_id(workspace_data["id"].asInt()), m_name(workspace_data["name"].asString()), @@ -45,8 +45,8 @@ Workspace::Workspace(const Json::Value& workspace_data, Workspaces& workspace_ma initializeWindowMap(clients_data); } -void addOrRemoveClass(const Glib::RefPtr& context, bool condition, - const std::string& class_name) { +void addOrRemoveClass(const Glib::RefPtr &context, bool condition, + const std::string &class_name) { if (condition) { context->add_class(class_name); } else { @@ -54,9 +54,9 @@ void addOrRemoveClass(const Glib::RefPtr& context, bool condi } } -std::optional Workspace::closeWindow(WindowAddress const& addr) { +std::optional Workspace::closeWindow(WindowAddress const &addr) { auto it = std::ranges::find_if(m_windowMap, - [&addr](const auto& window) { return window.address == addr; }); + [&addr](const auto &window) { return window.address == addr; }); // If the vector contains the address, remove it and return the window representation if (it != m_windowMap.end()) { WindowRepr windowRepr = *it; @@ -66,7 +66,7 @@ std::optional Workspace::closeWindow(WindowAddress const& addr) { return std::nullopt; } -bool Workspace::handleClicked(GdkEventButton* bt) const { +bool Workspace::handleClicked(GdkEventButton *bt) const { if (bt->type == GDK_BUTTON_PRESS) { try { if (id() > 0) { // normal @@ -87,14 +87,14 @@ bool Workspace::handleClicked(GdkEventButton* bt) const { m_ipc.getSocket1Reply("dispatch togglespecialworkspace"); } return true; - } catch (const std::exception& e) { + } catch (const std::exception &e) { spdlog::error("Failed to dispatch workspace: {}", e.what()); } } return false; } -void Workspace::initializeWindowMap(const Json::Value& clients_data) { +void Workspace::initializeWindowMap(const Json::Value &clients_data) { m_windowMap.clear(); for (auto client : clients_data) { if (client["workspace"]["id"].asInt() == id()) { @@ -103,10 +103,10 @@ void Workspace::initializeWindowMap(const Json::Value& clients_data) { } } -void Workspace::setActiveWindow(WindowAddress const& addr) { +void Workspace::setActiveWindow(WindowAddress const &addr) { std::optional activeIdx; for (size_t i = 0; i < m_windowMap.size(); ++i) { - auto& window = m_windowMap[i]; + auto &window = m_windowMap[i]; bool isActive = (window.address == addr); window.setActive(isActive); if (isActive) { @@ -133,7 +133,7 @@ void Workspace::insertWindow(WindowCreationPayload create_window_payload) { if (!repr.empty() || m_workspaceManager.enableTaskbar()) { auto addr = create_window_payload.getAddress(); auto it = std::ranges::find_if( - m_windowMap, [&addr](const auto& window) { return window.address == addr; }); + m_windowMap, [&addr](const auto &window) { return window.address == addr; }); // If the vector contains the address, update the window representation, otherwise insert it if (it != m_windowMap.end()) { *it = repr; @@ -144,7 +144,7 @@ void Workspace::insertWindow(WindowCreationPayload create_window_payload) { } }; -bool Workspace::onWindowOpened(WindowCreationPayload const& create_window_payload) { +bool Workspace::onWindowOpened(WindowCreationPayload const &create_window_payload) { if (create_window_payload.getWorkspaceName() == name()) { insertWindow(create_window_payload); return true; @@ -152,7 +152,7 @@ bool Workspace::onWindowOpened(WindowCreationPayload const& create_window_payloa return false; } -std::string& Workspace::selectIcon(std::map& icons_map) { +std::string &Workspace::selectIcon(std::map &icons_map) { spdlog::trace("Selecting icon for workspace {}", name()); if (isUrgent()) { auto urgentIconIt = icons_map.find("urgent"); @@ -209,7 +209,7 @@ std::string& Workspace::selectIcon(std::map& icons_map return m_name; } -void Workspace::update(const std::string& workspace_icon) { +void Workspace::update(const std::string &workspace_icon) { if (this->m_workspaceManager.persistentOnly() && !this->isPersistent()) { m_button.hide(); return; @@ -248,7 +248,7 @@ void Workspace::update(const std::string& workspace_icon) { bool isNotFirst = false; - for (const auto& window_repr : m_windowMap) { + for (const auto &window_repr : m_windowMap) { if (isNotFirst) { windows.append(windowSeparator); } @@ -270,24 +270,16 @@ void Workspace::update(const std::string& workspace_icon) { bool Workspace::isEmpty() const { auto ignore_list = m_workspaceManager.getIgnoredWindows(); - - // If there are no windows at all, the workspace is empty - if (m_windowMap.empty()) { - return true; - } - - // If no windows are ignored, any window means the workspace is not empty if (ignore_list.empty()) { - return false; + return m_windows == 0; } - - // Otherwise, check if every window in the map should be skipped (ignored) + // If there are windows but they are all ignored, consider the workspace empty return std::all_of( m_windowMap.begin(), m_windowMap.end(), - [this, &ignore_list](const auto& window_repr) { return shouldSkipWindow(window_repr); }); + [this, &ignore_list](const auto &window_repr) { return shouldSkipWindow(window_repr); }); } -void Workspace::updateTaskbar(const std::string& workspace_icon) { +void Workspace::updateTaskbar(const std::string &workspace_icon) { for (auto child : m_content.get_children()) { if (child != &m_labelBefore) { m_content.remove(*child); @@ -295,7 +287,7 @@ void Workspace::updateTaskbar(const std::string& workspace_icon) { } bool isFirst = true; - auto processWindow = [&](const WindowRepr& window_repr) { + auto processWindow = [&](const WindowRepr &window_repr) { if (shouldSkipWindow(window_repr)) { return; // skip } @@ -308,7 +300,7 @@ void Workspace::updateTaskbar(const std::string& workspace_icon) { } auto window_box = Gtk::make_managed(Gtk::ORIENTATION_HORIZONTAL); - window_box->set_tooltip_markup(window_repr.window_title); + window_box->set_tooltip_text(window_repr.window_title); window_box->get_style_context()->add_class("taskbar-window"); if (window_repr.isActive) { window_box->get_style_context()->add_class("active"); @@ -351,7 +343,7 @@ void Workspace::updateTaskbar(const std::string& workspace_icon) { processWindow(*it); } } else { - for (const auto& window_repr : m_windowMap) { + for (const auto &window_repr : m_windowMap) { processWindow(window_repr); } } @@ -366,7 +358,7 @@ void Workspace::updateTaskbar(const std::string& workspace_icon) { } } -bool Workspace::handleClick(const GdkEventButton* event_button, WindowAddress const& addr) const { +bool Workspace::handleClick(const GdkEventButton *event_button, WindowAddress const &addr) const { if (event_button->type == GDK_BUTTON_PRESS) { std::string command = std::regex_replace(m_workspaceManager.onClickWindow(), std::regex("\\{address\\}"), "0x" + addr); @@ -380,9 +372,9 @@ bool Workspace::handleClick(const GdkEventButton* event_button, WindowAddress co return true; } -bool Workspace::shouldSkipWindow(const WindowRepr& window_repr) const { +bool Workspace::shouldSkipWindow(const WindowRepr &window_repr) const { auto ignore_list = m_workspaceManager.getIgnoredWindows(); - auto it = std::ranges::find_if(ignore_list, [&window_repr](const auto& ignoreItem) { + auto it = std::ranges::find_if(ignore_list, [&window_repr](const auto &ignoreItem) { return std::regex_match(window_repr.window_class, ignoreItem) || std::regex_match(window_repr.window_title, ignoreItem); });