diff --git a/include/AAppIconLabel.hpp b/include/AAppIconLabel.hpp index e8532e189..65f930363 100644 --- a/include/AAppIconLabel.hpp +++ b/include/AAppIconLabel.hpp @@ -10,8 +10,9 @@ namespace waybar { class AAppIconLabel : public AIconLabel { public: AAppIconLabel(const Json::Value& config, const std::string& name, const std::string& id, - const std::string& format, uint16_t interval = 0, bool ellipsize = false, - bool enable_click = false, bool enable_scroll = false); + const std::string& format, std::mutex& reap_mtx, std::list& reap, + uint16_t interval = 0, bool ellipsize = false, bool enable_click = false, + bool enable_scroll = false); virtual ~AAppIconLabel() = default; auto update() -> void override; diff --git a/include/AIconLabel.hpp b/include/AIconLabel.hpp index f0fb8614a..b9d4c5cf3 100644 --- a/include/AIconLabel.hpp +++ b/include/AIconLabel.hpp @@ -10,8 +10,9 @@ namespace waybar { class AIconLabel : public ALabel { public: AIconLabel(const Json::Value& config, const std::string& name, const std::string& id, - const std::string& format, uint16_t interval = 0, bool ellipsize = false, - bool enable_click = false, bool enable_scroll = false); + const std::string& format, std::mutex& reap_mtx, std::list& reap, + uint16_t interval = 0, bool ellipsize = false, bool enable_click = false, + bool enable_scroll = false); virtual ~AIconLabel() = default; auto update() -> void override; diff --git a/include/ALabel.hpp b/include/ALabel.hpp index b38528773..fbc537e8d 100644 --- a/include/ALabel.hpp +++ b/include/ALabel.hpp @@ -11,8 +11,8 @@ namespace waybar { class ALabel : public AModule { public: ALabel(const Json::Value&, const std::string&, const std::string&, const std::string& format, - uint16_t interval = 0, bool ellipsize = false, bool enable_click = false, - bool enable_scroll = false); + std::mutex& reap_mtx, std::list& reap, uint16_t interval = 0, + bool ellipsize = false, bool enable_click = false, bool enable_scroll = false); virtual ~ALabel() = default; auto update() -> void override; virtual std::string getIcon(uint16_t, const std::string& alt = "", uint16_t max = 0); diff --git a/include/AModule.hpp b/include/AModule.hpp index 6b29045ca..3bb3b0bba 100644 --- a/include/AModule.hpp +++ b/include/AModule.hpp @@ -25,11 +25,14 @@ class AModule : public IModule { bool expandEnabled() const; + std::mutex& reap_mtx; + std::list& reap; + protected: // Don't need to make an object directly // Derived classes are able to use it - AModule(const Json::Value&, const std::string&, const std::string&, bool enable_click = false, - bool enable_scroll = false); + AModule(const Json::Value&, const std::string&, const std::string&, std::mutex& reap_mtx, + std::list& reap, bool enable_click = false, bool enable_scroll = false); enum SCROLL_DIR { NONE, UP, DOWN, LEFT, RIGHT }; diff --git a/include/ASlider.hpp b/include/ASlider.hpp index 44cde5077..658802fa0 100644 --- a/include/ASlider.hpp +++ b/include/ASlider.hpp @@ -7,7 +7,8 @@ namespace waybar { class ASlider : public AModule { public: - ASlider(const Json::Value& config, const std::string& name, const std::string& id); + ASlider(const Json::Value& config, const std::string& name, const std::string& id, + std::mutex& reap_mtx, std::list& reap); virtual void onValueChanged(); protected: @@ -16,4 +17,4 @@ class ASlider : public AModule { Gtk::Scale scale_; }; -} // namespace waybar \ No newline at end of file +} // namespace waybar diff --git a/include/IModule.hpp b/include/IModule.hpp index b76c33e3a..5974f9e2c 100644 --- a/include/IModule.hpp +++ b/include/IModule.hpp @@ -1,6 +1,10 @@ #pragma once #include +#include + +#include +#include namespace waybar { diff --git a/include/factory.hpp b/include/factory.hpp index f805aab5e..5563f4132 100644 --- a/include/factory.hpp +++ b/include/factory.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include diff --git a/include/modules/backlight.hpp b/include/modules/backlight.hpp index 46b389722..8b44ffb6a 100644 --- a/include/modules/backlight.hpp +++ b/include/modules/backlight.hpp @@ -17,7 +17,7 @@ namespace waybar::modules { class Backlight : public ALabel { public: - Backlight(const std::string&, const Json::Value&); + Backlight(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Backlight() = default; auto update() -> void override; diff --git a/include/modules/backlight_slider.hpp b/include/modules/backlight_slider.hpp index 437c53c45..97983603b 100644 --- a/include/modules/backlight_slider.hpp +++ b/include/modules/backlight_slider.hpp @@ -9,7 +9,7 @@ namespace waybar::modules { class BacklightSlider : public ASlider { public: - BacklightSlider(const std::string&, const Json::Value&); + BacklightSlider(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~BacklightSlider() = default; void update() override; @@ -21,4 +21,4 @@ class BacklightSlider : public ASlider { util::BacklightBackend backend; }; -} // namespace waybar::modules \ No newline at end of file +} // namespace waybar::modules diff --git a/include/modules/battery.hpp b/include/modules/battery.hpp index ffc82abae..58e5b24cd 100644 --- a/include/modules/battery.hpp +++ b/include/modules/battery.hpp @@ -24,7 +24,8 @@ namespace fs = std::filesystem; class Battery : public ALabel { public: - Battery(const std::string&, const waybar::Bar&, const Json::Value&); + Battery(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Battery(); auto update() -> void override; diff --git a/include/modules/bluetooth.hpp b/include/modules/bluetooth.hpp index b89383a04..31ae19779 100644 --- a/include/modules/bluetooth.hpp +++ b/include/modules/bluetooth.hpp @@ -44,7 +44,7 @@ class Bluetooth : public ALabel { }; public: - Bluetooth(const std::string&, const Json::Value&); + Bluetooth(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Bluetooth() = default; auto update() -> void override; diff --git a/include/modules/cava/cavaGLSL.hpp b/include/modules/cava/cavaGLSL.hpp index d2632affa..bec15dc4a 100644 --- a/include/modules/cava/cavaGLSL.hpp +++ b/include/modules/cava/cavaGLSL.hpp @@ -9,7 +9,7 @@ namespace waybar::modules::cava { class CavaGLSL final : public AModule, public Gtk::GLArea { public: - CavaGLSL(const std::string&, const Json::Value&); + CavaGLSL(const std::string&, const Json::Value&, std::mutex& reap_mtx, std::list& reap); ~CavaGLSL() = default; private: diff --git a/include/modules/cava/cavaRaw.hpp b/include/modules/cava/cavaRaw.hpp index f4ceb603d..5e2ee3519 100644 --- a/include/modules/cava/cavaRaw.hpp +++ b/include/modules/cava/cavaRaw.hpp @@ -7,7 +7,7 @@ namespace waybar::modules::cava { class Cava final : public ALabel, public sigc::trackable { public: - Cava(const std::string&, const Json::Value&); + Cava(const std::string&, const Json::Value&, std::mutex&, std::list&); ~Cava() = default; auto doAction(const std::string& name) -> void override; diff --git a/include/modules/cava/cava_frontend.hpp b/include/modules/cava/cava_frontend.hpp deleted file mode 100644 index 402a9bad7..000000000 --- a/include/modules/cava/cava_frontend.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#ifdef HAVE_LIBCAVA -#include "cavaRaw.hpp" -#include "cava_backend.hpp" -#ifdef HAVE_LIBCAVAGLSL -#include "cavaGLSL.hpp" -#endif -#endif - -namespace waybar::modules::cava { -AModule* getModule(const std::string& id, const Json::Value& config) { -#ifdef HAVE_LIBCAVA - const std::shared_ptr backend_{waybar::modules::cava::CavaBackend::inst(config)}; - switch (backend_->getPrm()->output) { -#ifdef HAVE_LIBCAVAGLSL - case ::cava::output_method::OUTPUT_SDL_GLSL: - return new waybar::modules::cava::CavaGLSL(id, config); -#endif - default: - return new waybar::modules::cava::Cava(id, config); - } -#else - throw std::runtime_error("Unknown module"); -#endif -}; -} // namespace waybar::modules::cava diff --git a/include/modules/cffi.hpp b/include/modules/cffi.hpp index 85f129896..f56c04948 100644 --- a/include/modules/cffi.hpp +++ b/include/modules/cffi.hpp @@ -29,7 +29,7 @@ struct wbcffi_config_entry { class CFFI : public AModule { public: - CFFI(const std::string&, const std::string&, const Json::Value&); + CFFI(const std::string&, const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~CFFI(); virtual auto refresh(int signal) -> void override; diff --git a/include/modules/clock.hpp b/include/modules/clock.hpp index c35480634..a9de4e73e 100644 --- a/include/modules/clock.hpp +++ b/include/modules/clock.hpp @@ -15,7 +15,7 @@ enum class WS { LEFT, RIGHT, HIDDEN }; class Clock final : public ALabel { public: - Clock(const std::string&, const Json::Value&); + Clock(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Clock() = default; auto update() -> void override; auto doAction(const std::string&) -> void override; diff --git a/include/modules/cpu.hpp b/include/modules/cpu.hpp index 7f78c1650..16ff67785 100644 --- a/include/modules/cpu.hpp +++ b/include/modules/cpu.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class Cpu : public ALabel { public: - Cpu(const std::string&, const Json::Value&); + Cpu(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Cpu() = default; auto update() -> void override; diff --git a/include/modules/cpu_frequency.hpp b/include/modules/cpu_frequency.hpp index 49ca1b86a..831665d98 100644 --- a/include/modules/cpu_frequency.hpp +++ b/include/modules/cpu_frequency.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class CpuFrequency : public ALabel { public: - CpuFrequency(const std::string&, const Json::Value&); + CpuFrequency(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~CpuFrequency() = default; auto update() -> void override; diff --git a/include/modules/cpu_usage.hpp b/include/modules/cpu_usage.hpp index c93a1734f..c28b6aab3 100644 --- a/include/modules/cpu_usage.hpp +++ b/include/modules/cpu_usage.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class CpuUsage : public ALabel { public: - CpuUsage(const std::string&, const Json::Value&); + CpuUsage(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~CpuUsage() = default; auto update() -> void override; diff --git a/include/modules/custom.hpp b/include/modules/custom.hpp index 6c17c6e45..1ee93879a 100644 --- a/include/modules/custom.hpp +++ b/include/modules/custom.hpp @@ -14,7 +14,8 @@ namespace waybar::modules { class Custom : public ALabel { public: - Custom(const std::string&, const std::string&, const Json::Value&, const std::string&); + Custom(const std::string&, const std::string&, const Json::Value&, const std::string&, + std::mutex&, std::list&); virtual ~Custom(); auto update() -> void override; void refresh(int /*signal*/) override; diff --git a/include/modules/disk.hpp b/include/modules/disk.hpp index 1b4f31761..fe5ac738e 100644 --- a/include/modules/disk.hpp +++ b/include/modules/disk.hpp @@ -13,7 +13,7 @@ namespace waybar::modules { class Disk : public ALabel { public: - Disk(const std::string&, const Json::Value&); + Disk(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Disk() = default; auto update() -> void override; diff --git a/include/modules/dwl/tags.hpp b/include/modules/dwl/tags.hpp index 856a35dd1..73bfd3b3a 100644 --- a/include/modules/dwl/tags.hpp +++ b/include/modules/dwl/tags.hpp @@ -12,7 +12,7 @@ namespace waybar::modules::dwl { class Tags : public waybar::AModule { public: - Tags(const std::string&, const waybar::Bar&, const Json::Value&); + Tags(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, std::list&); virtual ~Tags(); // Handlers for wayland events diff --git a/include/modules/dwl/window.hpp b/include/modules/dwl/window.hpp index 5efd0abb0..58923e636 100644 --- a/include/modules/dwl/window.hpp +++ b/include/modules/dwl/window.hpp @@ -13,7 +13,8 @@ namespace waybar::modules::dwl { class Window : public AAppIconLabel, public sigc::trackable { public: - Window(const std::string&, const waybar::Bar&, const Json::Value&); + Window(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Window(); void handle_layout(const uint32_t layout); diff --git a/include/modules/ext/workspace_manager.hpp b/include/modules/ext/workspace_manager.hpp index f21ff26e7..2e57b390d 100644 --- a/include/modules/ext/workspace_manager.hpp +++ b/include/modules/ext/workspace_manager.hpp @@ -20,7 +20,8 @@ class Workspace; class WorkspaceManager final : public AModule { public: - WorkspaceManager(const std::string& id, const waybar::Bar& bar, const Json::Value& config); + WorkspaceManager(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex&, std::list&); ~WorkspaceManager() override; void register_manager(wl_registry* registry, uint32_t name, uint32_t version); void remove_workspace_group(uint32_t id); diff --git a/include/modules/gamemode.hpp b/include/modules/gamemode.hpp index f63861a38..d24a74e07 100644 --- a/include/modules/gamemode.hpp +++ b/include/modules/gamemode.hpp @@ -17,7 +17,7 @@ namespace waybar::modules { class Gamemode : public AModule { public: - Gamemode(const std::string&, const Json::Value&); + Gamemode(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Gamemode(); auto update() -> void override; diff --git a/include/modules/gps.hpp b/include/modules/gps.hpp index 80df12ba9..9c5519f1d 100644 --- a/include/modules/gps.hpp +++ b/include/modules/gps.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class Gps : public ALabel { public: - Gps(const std::string&, const Json::Value&); + Gps(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Gps(); auto update() -> void override; diff --git a/include/modules/hyprland/language.hpp b/include/modules/hyprland/language.hpp index ec59e5c3a..1acc01b23 100644 --- a/include/modules/hyprland/language.hpp +++ b/include/modules/hyprland/language.hpp @@ -13,7 +13,8 @@ namespace waybar::modules::hyprland { class Language : public waybar::ALabel, public EventHandler { public: - Language(const std::string&, const waybar::Bar&, const Json::Value&); + Language(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Language(); auto update() -> void override; diff --git a/include/modules/hyprland/submap.hpp b/include/modules/hyprland/submap.hpp index 0dcb5d5ae..601d02793 100644 --- a/include/modules/hyprland/submap.hpp +++ b/include/modules/hyprland/submap.hpp @@ -13,7 +13,8 @@ namespace waybar::modules::hyprland { class Submap : public waybar::ALabel, public EventHandler { public: - Submap(const std::string&, const waybar::Bar&, const Json::Value&); + Submap(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Submap() override; auto update() -> void override; diff --git a/include/modules/hyprland/window.hpp b/include/modules/hyprland/window.hpp index 2be645942..d43c4cc6e 100644 --- a/include/modules/hyprland/window.hpp +++ b/include/modules/hyprland/window.hpp @@ -13,7 +13,8 @@ namespace waybar::modules::hyprland { class Window : public waybar::AAppIconLabel, public EventHandler { public: - Window(const std::string&, const waybar::Bar&, const Json::Value&); + Window(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Window() override; auto update() -> void override; diff --git a/include/modules/hyprland/windowcount.hpp b/include/modules/hyprland/windowcount.hpp index 7c86fb3ec..aa63fab2d 100644 --- a/include/modules/hyprland/windowcount.hpp +++ b/include/modules/hyprland/windowcount.hpp @@ -12,7 +12,8 @@ namespace waybar::modules::hyprland { class WindowCount : public waybar::AAppIconLabel, public EventHandler { public: - WindowCount(const std::string&, const waybar::Bar&, const Json::Value&); + WindowCount(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~WindowCount() override; auto update() -> void override; diff --git a/include/modules/hyprland/workspaces.hpp b/include/modules/hyprland/workspaces.hpp index a5d94bbf7..16867ac60 100644 --- a/include/modules/hyprland/workspaces.hpp +++ b/include/modules/hyprland/workspaces.hpp @@ -30,7 +30,8 @@ class Workspaces; class Workspaces : public AModule, public EventHandler { public: - Workspaces(const std::string&, const waybar::Bar&, const Json::Value&); + Workspaces(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Workspaces() override; void update() override; void init(); diff --git a/include/modules/idle_inhibitor.hpp b/include/modules/idle_inhibitor.hpp index 22bd808fc..56cc2da09 100644 --- a/include/modules/idle_inhibitor.hpp +++ b/include/modules/idle_inhibitor.hpp @@ -12,7 +12,8 @@ class IdleInhibitor : public ALabel { sigc::connection timeout_; public: - IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&); + IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~IdleInhibitor(); auto update() -> void override; static std::list modules; diff --git a/include/modules/image.hpp b/include/modules/image.hpp index 510dad940..ee2570f14 100644 --- a/include/modules/image.hpp +++ b/include/modules/image.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class Image : public AModule { public: - Image(const std::string&, const Json::Value&); + Image(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Image() = default; auto update() -> void override; void refresh(int /*signal*/) override; diff --git a/include/modules/inhibitor.hpp b/include/modules/inhibitor.hpp index 43cb6cab1..109439b68 100644 --- a/include/modules/inhibitor.hpp +++ b/include/modules/inhibitor.hpp @@ -11,7 +11,8 @@ namespace waybar::modules { class Inhibitor : public ALabel { public: - Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&); + Inhibitor(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Inhibitor(); auto update() -> void override; auto activated() -> bool; diff --git a/include/modules/jack.hpp b/include/modules/jack.hpp index 5c30739ec..20459e011 100644 --- a/include/modules/jack.hpp +++ b/include/modules/jack.hpp @@ -13,7 +13,7 @@ namespace waybar::modules { class JACK : public ALabel { public: - JACK(const std::string&, const Json::Value&); + JACK(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~JACK() = default; auto update() -> void override; diff --git a/include/modules/keyboard_state.hpp b/include/modules/keyboard_state.hpp index be90eee4d..58f46a95d 100644 --- a/include/modules/keyboard_state.hpp +++ b/include/modules/keyboard_state.hpp @@ -19,7 +19,8 @@ namespace waybar::modules { class KeyboardState : public AModule { public: - KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&); + KeyboardState(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~KeyboardState(); auto update() -> void override; diff --git a/include/modules/load.hpp b/include/modules/load.hpp index c4c06d264..a8dcad4c2 100644 --- a/include/modules/load.hpp +++ b/include/modules/load.hpp @@ -16,7 +16,7 @@ namespace waybar::modules { class Load : public ALabel { public: - Load(const std::string&, const Json::Value&); + Load(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Load() = default; auto update() -> void override; diff --git a/include/modules/memory.hpp b/include/modules/memory.hpp index 3b6342b34..9fe195a08 100644 --- a/include/modules/memory.hpp +++ b/include/modules/memory.hpp @@ -12,7 +12,7 @@ namespace waybar::modules { class Memory : public ALabel { public: - Memory(const std::string&, const Json::Value&); + Memory(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Memory() = default; auto update() -> void override; diff --git a/include/modules/mpd/mpd.hpp b/include/modules/mpd/mpd.hpp index 32d526e93..b71741893 100644 --- a/include/modules/mpd/mpd.hpp +++ b/include/modules/mpd/mpd.hpp @@ -35,7 +35,7 @@ class MPD : public ALabel { detail::unique_song song_; public: - MPD(const std::string&, const Json::Value&); + MPD(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~MPD() noexcept = default; auto update() -> void override; diff --git a/include/modules/mpris/mpris.hpp b/include/modules/mpris/mpris.hpp index ad4dac1e1..123b6c87c 100644 --- a/include/modules/mpris/mpris.hpp +++ b/include/modules/mpris/mpris.hpp @@ -18,7 +18,7 @@ namespace waybar::modules::mpris { class Mpris : public ALabel { public: - Mpris(const std::string&, const Json::Value&); + Mpris(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Mpris(); auto update() -> void override; bool handleToggle(GdkEventButton* const&) override; diff --git a/include/modules/network.hpp b/include/modules/network.hpp index 4abe26bd1..1d7918eed 100644 --- a/include/modules/network.hpp +++ b/include/modules/network.hpp @@ -23,7 +23,7 @@ namespace waybar::modules { class Network : public ALabel { public: - Network(const std::string&, const Json::Value&); + Network(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Network(); auto update() -> void override; diff --git a/include/modules/niri/language.hpp b/include/modules/niri/language.hpp index cff2b3528..e9f2ec4e3 100644 --- a/include/modules/niri/language.hpp +++ b/include/modules/niri/language.hpp @@ -10,7 +10,7 @@ namespace waybar::modules::niri { class Language : public ALabel, public EventHandler { public: - Language(const std::string&, const Bar&, const Json::Value&); + Language(const std::string&, const Bar&, const Json::Value&, std::mutex&, std::list&); ~Language() override; void update() override; diff --git a/include/modules/niri/window.hpp b/include/modules/niri/window.hpp index 6be4686ec..a2326cf3f 100644 --- a/include/modules/niri/window.hpp +++ b/include/modules/niri/window.hpp @@ -11,7 +11,7 @@ namespace waybar::modules::niri { class Window : public AAppIconLabel, public EventHandler { public: - Window(const std::string&, const Bar&, const Json::Value&); + Window(const std::string&, const Bar&, const Json::Value&, std::mutex&, std::list&); ~Window() override; void update() override; diff --git a/include/modules/niri/workspaces.hpp b/include/modules/niri/workspaces.hpp index 089864122..1e139fbc2 100644 --- a/include/modules/niri/workspaces.hpp +++ b/include/modules/niri/workspaces.hpp @@ -11,7 +11,7 @@ namespace waybar::modules::niri { class Workspaces : public AModule, public EventHandler { public: - Workspaces(const std::string&, const Bar&, const Json::Value&); + Workspaces(const std::string&, const Bar&, const Json::Value&, std::mutex&, std::list&); ~Workspaces() override; void update() override; diff --git a/include/modules/power_profiles_daemon.hpp b/include/modules/power_profiles_daemon.hpp index b24361712..ff40053b7 100644 --- a/include/modules/power_profiles_daemon.hpp +++ b/include/modules/power_profiles_daemon.hpp @@ -16,7 +16,7 @@ struct Profile { class PowerProfilesDaemon : public ALabel { public: - PowerProfilesDaemon(const std::string&, const Json::Value&); + PowerProfilesDaemon(const std::string&, const Json::Value&, std::mutex&, std::list&); auto update() -> void override; void profileChangedCb(const Gio::DBus::Proxy::MapChangedProperties&, const std::vector&); diff --git a/include/modules/privacy/privacy.hpp b/include/modules/privacy/privacy.hpp index 68d2bf19e..de9eaf365 100644 --- a/include/modules/privacy/privacy.hpp +++ b/include/modules/privacy/privacy.hpp @@ -13,7 +13,8 @@ namespace waybar::modules::privacy { class Privacy : public AModule { public: - Privacy(const std::string&, const Json::Value&, Gtk::Orientation, const std::string& pos); + Privacy(const std::string&, const Json::Value&, Gtk::Orientation, const std::string& pos, + std::mutex&, std::list&); auto update() -> void override; void onPrivacyNodesChanged(); diff --git a/include/modules/pulseaudio.hpp b/include/modules/pulseaudio.hpp index eead664f1..c4c69e331 100644 --- a/include/modules/pulseaudio.hpp +++ b/include/modules/pulseaudio.hpp @@ -13,7 +13,7 @@ namespace waybar::modules { class Pulseaudio : public ALabel { public: - Pulseaudio(const std::string&, const Json::Value&); + Pulseaudio(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Pulseaudio() = default; auto update() -> void override; diff --git a/include/modules/pulseaudio_slider.hpp b/include/modules/pulseaudio_slider.hpp index 3ef446847..41fdc4d4c 100644 --- a/include/modules/pulseaudio_slider.hpp +++ b/include/modules/pulseaudio_slider.hpp @@ -13,7 +13,7 @@ enum class PulseaudioSliderTarget { class PulseaudioSlider : public ASlider { public: - PulseaudioSlider(const std::string&, const Json::Value&); + PulseaudioSlider(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~PulseaudioSlider() = default; void update() override; @@ -24,4 +24,4 @@ class PulseaudioSlider : public ASlider { PulseaudioSliderTarget target = PulseaudioSliderTarget::Sink; }; -} // namespace waybar::modules \ No newline at end of file +} // namespace waybar::modules diff --git a/include/modules/river/layout.hpp b/include/modules/river/layout.hpp index 3486472e7..c0f11d0d0 100644 --- a/include/modules/river/layout.hpp +++ b/include/modules/river/layout.hpp @@ -10,7 +10,8 @@ namespace waybar::modules::river { class Layout : public waybar::ALabel { public: - Layout(const std::string&, const waybar::Bar&, const Json::Value&); + Layout(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Layout(); // Handlers for wayland events diff --git a/include/modules/river/mode.hpp b/include/modules/river/mode.hpp index 91585309d..ed9ca752a 100644 --- a/include/modules/river/mode.hpp +++ b/include/modules/river/mode.hpp @@ -10,7 +10,7 @@ namespace waybar::modules::river { class Mode : public waybar::ALabel { public: - Mode(const std::string&, const waybar::Bar&, const Json::Value&); + Mode(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, std::list&); virtual ~Mode(); // Handlers for wayland events diff --git a/include/modules/river/tags.hpp b/include/modules/river/tags.hpp index 386ddecf3..6979742e2 100644 --- a/include/modules/river/tags.hpp +++ b/include/modules/river/tags.hpp @@ -13,7 +13,7 @@ namespace waybar::modules::river { class Tags : public waybar::AModule { public: - Tags(const std::string&, const waybar::Bar&, const Json::Value&); + Tags(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, std::list&); virtual ~Tags(); // Handlers for wayland events diff --git a/include/modules/river/window.hpp b/include/modules/river/window.hpp index 0d759bb25..7b7f8d782 100644 --- a/include/modules/river/window.hpp +++ b/include/modules/river/window.hpp @@ -12,7 +12,8 @@ namespace waybar::modules::river { class Window : public waybar::ALabel { public: - Window(const std::string&, const waybar::Bar&, const Json::Value&); + Window(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Window(); // Handlers for wayland events diff --git a/include/modules/sndio.hpp b/include/modules/sndio.hpp index 43c84f9e3..7f30e761e 100644 --- a/include/modules/sndio.hpp +++ b/include/modules/sndio.hpp @@ -11,7 +11,7 @@ namespace waybar::modules { class Sndio : public ALabel { public: - Sndio(const std::string&, const Json::Value&); + Sndio(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Sndio(); auto update() -> void override; auto set_desc(struct sioctl_desc*, unsigned int) -> void; diff --git a/include/modules/sni/tray.hpp b/include/modules/sni/tray.hpp index 5f12d7f21..64ef3e45d 100644 --- a/include/modules/sni/tray.hpp +++ b/include/modules/sni/tray.hpp @@ -12,7 +12,7 @@ namespace waybar::modules::SNI { class Tray : public AModule { public: - Tray(const std::string&, const Bar&, const Json::Value&); + Tray(const std::string&, const Bar&, const Json::Value&, std::mutex&, std::list&); virtual ~Tray() = default; auto update() -> void override; diff --git a/include/modules/sway/language.hpp b/include/modules/sway/language.hpp index 91aa181d9..a9ed8b083 100644 --- a/include/modules/sway/language.hpp +++ b/include/modules/sway/language.hpp @@ -16,7 +16,7 @@ namespace waybar::modules::sway { class Language : public ALabel, public sigc::trackable { public: - Language(const std::string& id, const Json::Value& config); + Language(const std::string& id, const Json::Value& config, std::mutex&, std::list&); virtual ~Language() = default; auto update() -> void override; diff --git a/include/modules/sway/mode.hpp b/include/modules/sway/mode.hpp index 44585355c..ed2fbd244 100644 --- a/include/modules/sway/mode.hpp +++ b/include/modules/sway/mode.hpp @@ -12,7 +12,7 @@ namespace waybar::modules::sway { class Mode : public ALabel, public sigc::trackable { public: - Mode(const std::string&, const Json::Value&); + Mode(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Mode() = default; auto update() -> void override; diff --git a/include/modules/sway/scratchpad.hpp b/include/modules/sway/scratchpad.hpp index 551cc8c8e..06169ba0b 100644 --- a/include/modules/sway/scratchpad.hpp +++ b/include/modules/sway/scratchpad.hpp @@ -14,7 +14,7 @@ namespace waybar::modules::sway { class Scratchpad : public ALabel { public: - Scratchpad(const std::string&, const Json::Value&); + Scratchpad(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Scratchpad() = default; auto update() -> void override; diff --git a/include/modules/sway/window.hpp b/include/modules/sway/window.hpp index 60cd26796..1887c58b7 100644 --- a/include/modules/sway/window.hpp +++ b/include/modules/sway/window.hpp @@ -14,7 +14,8 @@ namespace waybar::modules::sway { class Window : public AAppIconLabel, public sigc::trackable { public: - Window(const std::string&, const waybar::Bar&, const Json::Value&); + Window(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); virtual ~Window() = default; auto update() -> void override; diff --git a/include/modules/sway/workspaces.hpp b/include/modules/sway/workspaces.hpp index d8a9e18a8..a6d036b5a 100644 --- a/include/modules/sway/workspaces.hpp +++ b/include/modules/sway/workspaces.hpp @@ -18,7 +18,8 @@ namespace waybar::modules::sway { class Workspaces : public AModule, public sigc::trackable { public: - Workspaces(const std::string&, const waybar::Bar&, const Json::Value&); + Workspaces(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Workspaces() override = default; auto update() -> void override; diff --git a/include/modules/systemd_failed_units.hpp b/include/modules/systemd_failed_units.hpp index ffb250821..6b1037190 100644 --- a/include/modules/systemd_failed_units.hpp +++ b/include/modules/systemd_failed_units.hpp @@ -10,7 +10,7 @@ namespace waybar::modules { class SystemdFailedUnits : public ALabel { public: - SystemdFailedUnits(const std::string&, const Json::Value&); + SystemdFailedUnits(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~SystemdFailedUnits(); auto update() -> void override; diff --git a/include/modules/temperature.hpp b/include/modules/temperature.hpp index 918281be5..71f978663 100644 --- a/include/modules/temperature.hpp +++ b/include/modules/temperature.hpp @@ -11,7 +11,7 @@ namespace waybar::modules { class Temperature : public ALabel { public: - Temperature(const std::string&, const Json::Value&); + Temperature(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Temperature() = default; auto update() -> void override; diff --git a/include/modules/upower.hpp b/include/modules/upower.hpp index 0d4450475..7caa64fe3 100644 --- a/include/modules/upower.hpp +++ b/include/modules/upower.hpp @@ -12,7 +12,7 @@ namespace waybar::modules { class UPower final : public AIconLabel { public: - UPower(const std::string&, const Json::Value&); + UPower(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~UPower(); auto update() -> void override; diff --git a/include/modules/user.hpp b/include/modules/user.hpp index bcb03da47..11ff5c731 100644 --- a/include/modules/user.hpp +++ b/include/modules/user.hpp @@ -10,7 +10,7 @@ namespace waybar::modules { class User : public AIconLabel { public: - User(const std::string&, const Json::Value&); + User(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~User() = default; auto update() -> void override; diff --git a/include/modules/wayfire/window.hpp b/include/modules/wayfire/window.hpp index 3e8cb2918..7a15bdbf8 100644 --- a/include/modules/wayfire/window.hpp +++ b/include/modules/wayfire/window.hpp @@ -14,7 +14,8 @@ class Window : public AAppIconLabel { std::string old_app_id_; public: - Window(const std::string& id, const Bar& bar, const Json::Value& config); + Window(const std::string& id, const Bar& bar, const Json::Value& config, std::mutex&, + std::list&); ~Window() override; auto update() -> void override; diff --git a/include/modules/wayfire/workspaces.hpp b/include/modules/wayfire/workspaces.hpp index ab7cac441..c13a476b0 100644 --- a/include/modules/wayfire/workspaces.hpp +++ b/include/modules/wayfire/workspaces.hpp @@ -25,7 +25,8 @@ class Workspaces : public AModule { auto update_box() -> void; public: - Workspaces(const std::string& id, const Bar& bar, const Json::Value& config); + Workspaces(const std::string& id, const Bar& bar, const Json::Value& config, std::mutex&, + std::list&); ~Workspaces() override; }; diff --git a/include/modules/wireplumber.hpp b/include/modules/wireplumber.hpp index 0565704fb..2856542fc 100644 --- a/include/modules/wireplumber.hpp +++ b/include/modules/wireplumber.hpp @@ -12,7 +12,7 @@ namespace waybar::modules { class Wireplumber : public ALabel { public: - Wireplumber(const std::string&, const Json::Value&); + Wireplumber(const std::string&, const Json::Value&, std::mutex&, std::list&); virtual ~Wireplumber(); auto update() -> void override; diff --git a/include/modules/wlr/taskbar.hpp b/include/modules/wlr/taskbar.hpp index 413eae85f..74c101480 100644 --- a/include/modules/wlr/taskbar.hpp +++ b/include/modules/wlr/taskbar.hpp @@ -142,7 +142,8 @@ using TaskPtr = std::unique_ptr; class Taskbar : public waybar::AModule { public: - Taskbar(const std::string&, const waybar::Bar&, const Json::Value&); + Taskbar(const std::string&, const waybar::Bar&, const Json::Value&, std::mutex&, + std::list&); ~Taskbar(); void update(); diff --git a/include/util/command.hpp b/include/util/command.hpp index 58c59a965..41ac55e65 100644 --- a/include/util/command.hpp +++ b/include/util/command.hpp @@ -13,10 +13,11 @@ #include #endif -#include +#include -extern std::mutex reap_mtx; -extern std::list reap; +#include +#include +#include namespace waybar::util::command { @@ -138,7 +139,8 @@ inline struct res execNoRead(const std::string& cmd) { return {WEXITSTATUS(stat), ""}; } -inline int32_t forkExec(const std::string& cmd, const std::string& output_name) { +inline int32_t forkExec(const std::string& cmd, const std::string& output_name, + std::mutex& reap_mtx, std::list& reap) { if (cmd == "") return -1; pid_t pid = fork(); @@ -172,8 +174,8 @@ inline int32_t forkExec(const std::string& cmd, const std::string& output_name) return pid; } -inline int32_t forkExec(const std::string& cmd) { - return forkExec(cmd, ""); +inline int32_t forkExec(const std::string& cmd, std::mutex& reap_mtx, std::list& reap) { + return forkExec(cmd, "", reap_mtx, reap); } } // namespace waybar::util::command diff --git a/meson.build b/meson.build index c6b7f90a4..2d3c07f6e 100644 --- a/meson.build +++ b/meson.build @@ -188,6 +188,20 @@ src_files = files( 'src/util/css_reload_helper.cpp' ) +gps_src_files = files( + 'src/AModule.cpp', + 'src/ALabel.cpp', + 'src/config.cpp', + 'src/util/prepare_for_sleep.cpp', +) + +cava_src_files = files( + 'src/AModule.cpp', + 'src/ALabel.cpp', + 'src/config.cpp', + 'src/util/prepare_for_sleep.cpp', +) + man_files = files( 'man/waybar-custom.5.scd', 'man/waybar-disk.5.scd', @@ -482,6 +496,9 @@ if get_option('rfkill').enabled() and is_linux src_files += files( 'src/util/rfkill.cpp' ) + gps_src_files += files( + 'src/util/rfkill.cpp' + ) endif if have_chrono_timezones @@ -503,24 +520,59 @@ cava = dependency('libcava', fallback : ['libcava', 'cava_dep'], not_found_message: 'cava is not found. Building waybar without cava') -eproxy = dependency('epoxy', required: false) +epoxy = 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') + cava_src_files += files('src/modules/cava/cavaRaw.cpp', 'src/modules/cava/cava_backend.cpp', + 'src/modules/cava/cava_frontend.cpp') man_files += files('man/waybar-cava.5.scd') - if eproxy.found() + if epoxy.found() add_project_arguments('-DHAVE_LIBCAVAGLSL', language: 'cpp') - src_files += files('src/modules/cava/cavaGLSL.cpp') + cava_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') - man_files += files('man/waybar-gps.5.scd') + add_project_arguments('-DHAVE_LIBGPS', language: 'cpp') + gps_src_files += files('src/modules/gps.cpp') + man_files += files('man/waybar-gps.5.scd') +endif + +if cava.found() + shared_library( + 'waybar-module-cava', + [cava_src_files], + name_prefix: '', + dependencies: [ + fmt, + gtkmm, + jsoncpp, + spdlog, + cava, + epoxy + ], + include_directories: inc_dirs, + install: true, + ) +endif + +if libgps.found() + shared_library( + 'waybar-module-gps', + [gps_src_files], + name_prefix: '', + dependencies: [ + fmt, + gtkmm, + jsoncpp, + spdlog, + libgps + ], + include_directories: inc_dirs, + install: true, + ) endif subdir('protocol') @@ -560,10 +612,7 @@ executable( gtk_layer_shell, libsndio, tz_dep, - xkbregistry, - cava, - eproxy, - libgps + xkbregistry, ], include_directories: inc_dirs, install: true, diff --git a/src/AAppIconLabel.cpp b/src/AAppIconLabel.cpp index a309a6e0c..441a58403 100644 --- a/src/AAppIconLabel.cpp +++ b/src/AAppIconLabel.cpp @@ -14,9 +14,11 @@ namespace waybar { AAppIconLabel::AAppIconLabel(const Json::Value& config, const std::string& name, - const std::string& id, const std::string& format, uint16_t interval, - bool ellipsize, bool enable_click, bool enable_scroll) - : AIconLabel(config, name, id, format, interval, ellipsize, enable_click, enable_scroll) { + const std::string& id, const std::string& format, std::mutex& reap_mtx, + std::list& reap, uint16_t interval, bool ellipsize, + bool enable_click, bool enable_scroll) + : AIconLabel(config, name, id, format, reap_mtx, reap, interval, ellipsize, enable_click, + enable_scroll) { // Icon size if (config["icon-size"].isUInt()) { app_icon_size_ = config["icon-size"].asUInt(); diff --git a/src/AIconLabel.cpp b/src/AIconLabel.cpp index 5c7df0ed0..502387cca 100644 --- a/src/AIconLabel.cpp +++ b/src/AIconLabel.cpp @@ -6,9 +6,10 @@ namespace waybar { AIconLabel::AIconLabel(const Json::Value& config, const std::string& name, const std::string& id, - const std::string& format, uint16_t interval, bool ellipsize, - bool enable_click, bool enable_scroll) - : ALabel(config, name, id, format, interval, ellipsize, enable_click, enable_scroll) { + const std::string& format, std::mutex& reap_mtx, std::list& reap, + uint16_t interval, bool ellipsize, bool enable_click, bool enable_scroll) + : ALabel(config, name, id, format, reap_mtx, reap, interval, ellipsize, enable_click, + enable_scroll) { event_box_.remove(); label_.unset_name(); label_.get_style_context()->remove_class(MODULE_CLASS); diff --git a/src/ALabel.cpp b/src/ALabel.cpp index d251d896b..fd589d2b6 100644 --- a/src/ALabel.cpp +++ b/src/ALabel.cpp @@ -9,11 +9,16 @@ #include "config.hpp" namespace waybar { +struct GtkMenuEventData { + std::mutex& reap_mtx; + std::list reap; + const char* menuActionItem; +}; ALabel::ALabel(const Json::Value& config, const std::string& name, const std::string& id, - const std::string& format, uint16_t interval, bool ellipsize, bool enable_click, - bool enable_scroll) - : AModule(config, name, id, + const std::string& format, std::mutex& reap_mtx, std::list& reap, + uint16_t interval, bool ellipsize, bool enable_click, bool enable_scroll) + : AModule(config, name, id, reap_mtx, reap, config["format-alt"].isString() || config["menu"].isString() || enable_click, enable_scroll), format_(config_["format"].isString() ? config_["format"].asString() : format), @@ -107,8 +112,9 @@ ALabel::ALabel(const Json::Value& config, const std::string& name, const std::st std::string key = it.key().asString(); submenus_[key] = GTK_MENU_ITEM(gtk_builder_get_object(builder, key.c_str())); menuActionsMap_[key] = it->asString(); + GtkMenuEventData* data = new GtkMenuEventData{reap_mtx, reap, menuActionsMap_[key].c_str()}; g_signal_connect(submenus_[key], "activate", G_CALLBACK(handleGtkMenuEvent), - (gpointer)menuActionsMap_[key].c_str()); + (gpointer)data); } } catch (std::runtime_error& e) { spdlog::warn("Error while creating the menu : {}. Menu popup not activated.", e.what()); @@ -190,7 +196,9 @@ bool waybar::ALabel::handleToggle(GdkEventButton* const& e) { } void ALabel::handleGtkMenuEvent(GtkMenuItem* /*menuitem*/, gpointer data) { - waybar::util::command::forkExec((char*)data, "GtkMenu"); + GtkMenuEventData* unpacked = (GtkMenuEventData*)data; + waybar::util::command::forkExec(unpacked->menuActionItem, "GtkMenu", unpacked->reap_mtx, + unpacked->reap); } std::string ALabel::getState(uint8_t value, bool lesser) { diff --git a/src/AModule.cpp b/src/AModule.cpp index c6fdff3ea..bf3ed59f2 100644 --- a/src/AModule.cpp +++ b/src/AModule.cpp @@ -11,9 +11,12 @@ namespace waybar { AModule::AModule(const Json::Value& config, const std::string& name, const std::string& id, - bool enable_click, bool enable_scroll) + std::mutex& reap_mtx, std::list& reap, bool enable_click, + bool enable_scroll) : name_(name), config_(config), + reap_mtx(reap_mtx), + reap(reap), isTooltip{config_["tooltip"].isBool() ? config_["tooltip"].asBool() : true}, isExpand{config_["expand"].isBool() ? config_["expand"].asBool() : false}, distance_scrolled_y_(0.0), @@ -93,7 +96,8 @@ AModule::~AModule() { auto AModule::update() -> void { // Run user-provided update handler if configured if (config_["on-update"].isString()) { - pid_children_.push_back(util::command::forkExec(config_["on-update"].asString())); + pid_children_.push_back( + util::command::forkExec(config_["on-update"].asString(), this->reap_mtx, this->reap)); } } // Get mapping between event name and module action name @@ -186,7 +190,7 @@ bool AModule::handleUserEvent(GdkEventButton* const& e) { format.clear(); } if (!format.empty()) { - pid_children_.push_back(util::command::forkExec(format)); + pid_children_.push_back(util::command::forkExec(format, this->reap_mtx, this->reap)); } dp.emit(); return true; @@ -271,7 +275,8 @@ bool AModule::handleScroll(GdkEventScroll* e) { this->AModule::doAction(eventName); // Second call user scripts if (config_[eventName].isString()) - pid_children_.push_back(util::command::forkExec(config_[eventName].asString())); + pid_children_.push_back( + util::command::forkExec(config_[eventName].asString(), this->reap_mtx, this->reap)); dp.emit(); return true; diff --git a/src/ASlider.cpp b/src/ASlider.cpp index b434be301..aee51e22d 100644 --- a/src/ASlider.cpp +++ b/src/ASlider.cpp @@ -5,8 +5,9 @@ namespace waybar { -ASlider::ASlider(const Json::Value& config, const std::string& name, const std::string& id) - : AModule(config, name, id, false, false), +ASlider::ASlider(const Json::Value& config, const std::string& name, const std::string& id, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, name, id, reap_mtx, reap, false, false), vertical_(config_["orientation"].asString() == "vertical"), scale_(vertical_ ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL) { scale_.set_name(name); @@ -32,4 +33,4 @@ ASlider::ASlider(const Json::Value& config, const std::string& name, const std:: void ASlider::onValueChanged() {} -} // namespace waybar \ No newline at end of file +} // namespace waybar diff --git a/src/factory.cpp b/src/factory.cpp index 2fd3e3b81..70b504f39 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -111,16 +111,32 @@ #ifdef HAVE_SYSTEMD_MONITOR #include "modules/systemd_failed_units.hpp" #endif -#ifdef HAVE_LIBGPS -#include "modules/gps.hpp" -#endif -#include "modules/cava/cava_frontend.hpp" #include "modules/cffi.hpp" #include "modules/custom.hpp" #include "modules/image.hpp" #include "modules/temperature.hpp" #include "modules/user.hpp" +extern std::mutex reap_mtx; +extern std::list reap; + +void* get_symbol(const char* path, const char* symbol) { + void* handle = dlopen(path, RTLD_NOW); + if (!handle) { + auto err = fmt::format("Cannot load shared-object: {}", dlerror()); + throw std::runtime_error(err); + } + dlerror(); + void* resolved = dlsym(handle, symbol); + char* error = dlerror(); + if (error != NULL) { + auto err = fmt::format("Cannot load shared-object functions: {}", error); + dlclose(handle); + throw std::runtime_error(err); + } + return resolved; +} + waybar::Factory::Factory(const Bar& bar, const Json::Value& config) : bar_(bar), config_(config) {} waybar::AModule* waybar::Factory::makeModule(const std::string& name, @@ -131,235 +147,245 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name, auto id = hash_pos != std::string::npos ? name.substr(hash_pos + 1) : ""; #if defined(__FreeBSD__) || defined(__linux__) if (ref == "battery") { - return new waybar::modules::Battery(id, bar_, config_[name]); + return new waybar::modules::Battery(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_GAMEMODE if (ref == "gamemode") { - return new waybar::modules::Gamemode(id, config_[name]); + return new waybar::modules::Gamemode(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_UPOWER if (ref == "upower") { - return new waybar::modules::UPower(id, config_[name]); + return new waybar::modules::UPower(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_PIPEWIRE if (ref == "privacy") { - return new waybar::modules::privacy::Privacy(id, config_[name], bar_.orientation, pos); + return new waybar::modules::privacy::Privacy(id, config_[name], bar_.orientation, pos, + reap_mtx, reap); } #endif #ifdef HAVE_MPRIS if (ref == "mpris") { - return new waybar::modules::mpris::Mpris(id, config_[name]); + return new waybar::modules::mpris::Mpris(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_SWAY if (ref == "sway/mode") { - return new waybar::modules::sway::Mode(id, config_[name]); + return new waybar::modules::sway::Mode(id, config_[name], reap_mtx, reap); } if (ref == "sway/workspaces") { - return new waybar::modules::sway::Workspaces(id, bar_, config_[name]); + return new waybar::modules::sway::Workspaces(id, bar_, config_[name], reap_mtx, reap); } if (ref == "sway/window") { - return new waybar::modules::sway::Window(id, bar_, config_[name]); + return new waybar::modules::sway::Window(id, bar_, config_[name], reap_mtx, reap); } if (ref == "sway/language") { - return new waybar::modules::sway::Language(id, config_[name]); + return new waybar::modules::sway::Language(id, config_[name], reap_mtx, reap); } if (ref == "sway/scratchpad") { - return new waybar::modules::sway::Scratchpad(id, config_[name]); + return new waybar::modules::sway::Scratchpad(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_WLR_TASKBAR if (ref == "wlr/taskbar") { - return new waybar::modules::wlr::Taskbar(id, bar_, config_[name]); + return new waybar::modules::wlr::Taskbar(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_EXT_WORKSPACES if (ref == "ext/workspaces") { - return new waybar::modules::ext::WorkspaceManager(id, bar_, config_[name]); + return new waybar::modules::ext::WorkspaceManager(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_RIVER if (ref == "river/mode") { - return new waybar::modules::river::Mode(id, bar_, config_[name]); + return new waybar::modules::river::Mode(id, bar_, config_[name], reap_mtx, reap); } if (ref == "river/tags") { - return new waybar::modules::river::Tags(id, bar_, config_[name]); + return new waybar::modules::river::Tags(id, bar_, config_[name], reap_mtx, reap); } if (ref == "river/window") { - return new waybar::modules::river::Window(id, bar_, config_[name]); + return new waybar::modules::river::Window(id, bar_, config_[name], reap_mtx, reap); } if (ref == "river/layout") { - return new waybar::modules::river::Layout(id, bar_, config_[name]); + return new waybar::modules::river::Layout(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_DWL if (ref == "dwl/tags") { - return new waybar::modules::dwl::Tags(id, bar_, config_[name]); + return new waybar::modules::dwl::Tags(id, bar_, config_[name], reap_mtx, reap); } if (ref == "dwl/window") { - return new waybar::modules::dwl::Window(id, bar_, config_[name]); + return new waybar::modules::dwl::Window(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_HYPRLAND if (ref == "hyprland/window") { - return new waybar::modules::hyprland::Window(id, bar_, config_[name]); + return new waybar::modules::hyprland::Window(id, bar_, config_[name], reap_mtx, reap); } if (ref == "hyprland/windowcount") { - return new waybar::modules::hyprland::WindowCount(id, bar_, config_[name]); + return new waybar::modules::hyprland::WindowCount(id, bar_, config_[name], reap_mtx, reap); } if (ref == "hyprland/language") { - return new waybar::modules::hyprland::Language(id, bar_, config_[name]); + return new waybar::modules::hyprland::Language(id, bar_, config_[name], reap_mtx, reap); } if (ref == "hyprland/submap") { - return new waybar::modules::hyprland::Submap(id, bar_, config_[name]); + return new waybar::modules::hyprland::Submap(id, bar_, config_[name], reap_mtx, reap); } if (ref == "hyprland/workspaces") { - return new waybar::modules::hyprland::Workspaces(id, bar_, config_[name]); + return new waybar::modules::hyprland::Workspaces(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_NIRI if (ref == "niri/language") { - return new waybar::modules::niri::Language(id, bar_, config_[name]); + return new waybar::modules::niri::Language(id, bar_, config_[name], reap_mtx, reap); } if (ref == "niri/window") { - return new waybar::modules::niri::Window(id, bar_, config_[name]); + return new waybar::modules::niri::Window(id, bar_, config_[name], reap_mtx, reap); } if (ref == "niri/workspaces") { - return new waybar::modules::niri::Workspaces(id, bar_, config_[name]); + return new waybar::modules::niri::Workspaces(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_WAYFIRE if (ref == "wayfire/window") { - return new waybar::modules::wayfire::Window(id, bar_, config_[name]); + return new waybar::modules::wayfire::Window(id, bar_, config_[name], reap_mtx, reap); } if (ref == "wayfire/workspaces") { - return new waybar::modules::wayfire::Workspaces(id, bar_, config_[name]); + return new waybar::modules::wayfire::Workspaces(id, bar_, config_[name], reap_mtx, reap); } #endif if (ref == "idle_inhibitor") { - return new waybar::modules::IdleInhibitor(id, bar_, config_[name]); + return new waybar::modules::IdleInhibitor(id, bar_, config_[name], reap_mtx, reap); } #if defined(HAVE_MEMORY_LINUX) || defined(HAVE_MEMORY_BSD) if (ref == "memory") { - return new waybar::modules::Memory(id, config_[name]); + return new waybar::modules::Memory(id, config_[name], reap_mtx, reap); } #endif #if defined(HAVE_CPU_LINUX) || defined(HAVE_CPU_BSD) if (ref == "cpu") { - return new waybar::modules::Cpu(id, config_[name]); + return new waybar::modules::Cpu(id, config_[name], reap_mtx, reap); } #if defined(HAVE_CPU_LINUX) if (ref == "cpu_frequency") { - return new waybar::modules::CpuFrequency(id, config_[name]); + return new waybar::modules::CpuFrequency(id, config_[name], reap_mtx, reap); } #endif if (ref == "cpu_usage") { - return new waybar::modules::CpuUsage(id, config_[name]); + return new waybar::modules::CpuUsage(id, config_[name], reap_mtx, reap); } if (ref == "load") { - return new waybar::modules::Load(id, config_[name]); + return new waybar::modules::Load(id, config_[name], reap_mtx, reap); } #endif if (ref == "clock") { - return new waybar::modules::Clock(id, config_[name]); + return new waybar::modules::Clock(id, config_[name], reap_mtx, reap); } if (ref == "user") { - return new waybar::modules::User(id, config_[name]); + return new waybar::modules::User(id, config_[name], reap_mtx, reap); } if (ref == "disk") { - return new waybar::modules::Disk(id, config_[name]); + return new waybar::modules::Disk(id, config_[name], reap_mtx, reap); } if (ref == "image") { - return new waybar::modules::Image(id, config_[name]); + return new waybar::modules::Image(id, config_[name], reap_mtx, reap); } #ifdef HAVE_DBUSMENU if (ref == "tray") { - return new waybar::modules::SNI::Tray(id, bar_, config_[name]); + return new waybar::modules::SNI::Tray(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBNL if (ref == "network") { - return new waybar::modules::Network(id, config_[name]); + return new waybar::modules::Network(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBUDEV if (ref == "backlight") { - return new waybar::modules::Backlight(id, config_[name]); + return new waybar::modules::Backlight(id, config_[name], reap_mtx, reap); } if (ref == "backlight/slider") { - return new waybar::modules::BacklightSlider(id, config_[name]); + return new waybar::modules::BacklightSlider(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBEVDEV if (ref == "keyboard-state") { - return new waybar::modules::KeyboardState(id, bar_, config_[name]); + return new waybar::modules::KeyboardState(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBPULSE if (ref == "pulseaudio") { - return new waybar::modules::Pulseaudio(id, config_[name]); + return new waybar::modules::Pulseaudio(id, config_[name], reap_mtx, reap); } if (ref == "pulseaudio/slider") { - return new waybar::modules::PulseaudioSlider(id, config_[name]); + return new waybar::modules::PulseaudioSlider(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBMPDCLIENT if (ref == "mpd") { - return new waybar::modules::MPD(id, config_[name]); + return new waybar::modules::MPD(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBSNDIO if (ref == "sndio") { - return new waybar::modules::Sndio(id, config_[name]); + return new waybar::modules::Sndio(id, config_[name], reap_mtx, reap); } #endif #if defined(__linux__) if (ref == "bluetooth") { - return new waybar::modules::Bluetooth(id, config_[name]); + return new waybar::modules::Bluetooth(id, config_[name], reap_mtx, reap); } if (ref == "power-profiles-daemon") { - return new waybar::modules::PowerProfilesDaemon(id, config_[name]); + return new waybar::modules::PowerProfilesDaemon(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LOGIND_INHIBITOR if (ref == "inhibitor") { - return new waybar::modules::Inhibitor(id, bar_, config_[name]); + return new waybar::modules::Inhibitor(id, bar_, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBJACK if (ref == "jack") { - return new waybar::modules::JACK(id, config_[name]); + return new waybar::modules::JACK(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBWIREPLUMBER if (ref == "wireplumber") { - return new waybar::modules::Wireplumber(id, config_[name]); + return new waybar::modules::Wireplumber(id, config_[name], reap_mtx, reap); } #endif if (ref == "cava") { - return waybar::modules::cava::getModule(id, config_[name]); + AModule* (*constructor)(const std::string&, const Json::Value&, std::mutex&, + std::list&); + void* symbol = get_symbol("waybar-module-cava.so", "new_cava"); + constructor = reinterpret_cast(symbol); + return constructor(id, config_[name], reap_mtx, reap); } #ifdef HAVE_SYSTEMD_MONITOR if (ref == "systemd-failed-units") { - return new waybar::modules::SystemdFailedUnits(id, config_[name]); + return new waybar::modules::SystemdFailedUnits(id, config_[name], reap_mtx, reap); } #endif #ifdef HAVE_LIBGPS if (ref == "gps") { - return new waybar::modules::Gps(id, config_[name]); + AModule* (*constructor)(const std::string&, const Json::Value&, std::mutex&, + std::list&); + void* symbol = get_symbol("waybar-module-gps.so", "new_gps"); + constructor = reinterpret_cast(symbol); + return constructor(id, config_[name], reap_mtx, reap); } #endif if (ref == "temperature") { - return new waybar::modules::Temperature(id, config_[name]); + return new waybar::modules::Temperature(id, config_[name], reap_mtx, reap); } if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) { - return new waybar::modules::Custom(ref.substr(7), id, config_[name], bar_.output->name); + return new waybar::modules::Custom(ref.substr(7), id, config_[name], bar_.output->name, + reap_mtx, reap); } if (ref.compare(0, 5, "cffi/") == 0 && ref.size() > 5) { - return new waybar::modules::CFFI(ref.substr(5), id, config_[name]); + return new waybar::modules::CFFI(ref.substr(5), id, config_[name], reap_mtx, reap); } } catch (const std::exception& e) { auto err = fmt::format("Disabling module \"{}\", {}", name, e.what()); diff --git a/src/group.cpp b/src/group.cpp index 294743d73..06dfe6a5e 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -7,6 +7,9 @@ #include "gtkmm/enums.h" #include "gtkmm/widget.h" +extern std::mutex reap_mtx; +extern std::list reap; + namespace waybar { Gtk::RevealerTransitionType getPreferredTransitionType(bool is_vertical) { @@ -26,7 +29,7 @@ Gtk::RevealerTransitionType getPreferredTransitionType(bool is_vertical) { Group::Group(const std::string& name, const std::string& id, const Json::Value& config, bool vertical) - : AModule(config, name, id, true, false), + : AModule(config, name, id, reap_mtx, reap, true, false), box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0}, revealer_box{vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0} { box.set_name(name_); diff --git a/src/modules/backlight.cpp b/src/modules/backlight.cpp index aabfe3f15..9fe7e286b 100644 --- a/src/modules/backlight.cpp +++ b/src/modules/backlight.cpp @@ -13,8 +13,9 @@ #include "util/backend_common.hpp" #include "util/backlight_backend.hpp" -waybar::modules::Backlight::Backlight(const std::string& id, const Json::Value& config) - : ALabel(config, "backlight", id, "{percent}%", 2), +waybar::modules::Backlight::Backlight(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "backlight", id, "{percent}%", reap_mtx, reap, 2), preferred_device_(config["device"].isString() ? config["device"].asString() : ""), backend(interval_, [this] { dp.emit(); }) { dp.emit(); diff --git a/src/modules/backlight_slider.cpp b/src/modules/backlight_slider.cpp index 6269dddbf..2daa43605 100644 --- a/src/modules/backlight_slider.cpp +++ b/src/modules/backlight_slider.cpp @@ -4,8 +4,9 @@ namespace waybar::modules { -BacklightSlider::BacklightSlider(const std::string& id, const Json::Value& config) - : ASlider(config, "backlight-slider", id), +BacklightSlider::BacklightSlider(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ASlider(config, "backlight-slider", id, reap_mtx, reap), interval_(config_["interval"].isUInt() ? config_["interval"].asUInt() : 1000), preferred_device_(config["device"].isString() ? config["device"].asString() : ""), backend(interval_, [this] { this->dp.emit(); }) {} @@ -20,4 +21,4 @@ void BacklightSlider::onValueChanged() { backend.set_scaled_brightness(preferred_device_, brightness); } -} // namespace waybar::modules \ No newline at end of file +} // namespace waybar::modules diff --git a/src/modules/battery.cpp b/src/modules/battery.cpp index c706eb3cd..7e0cc2c90 100644 --- a/src/modules/battery.cpp +++ b/src/modules/battery.cpp @@ -12,8 +12,9 @@ #include #include -waybar::modules::Battery::Battery(const std::string& id, const Bar& bar, const Json::Value& config) - : ALabel(config, "battery", id, "{capacity}%", 60), last_event_(""), bar_(bar) { +waybar::modules::Battery::Battery(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "battery", id, "{capacity}%", reap_mtx, reap, 60), last_event_(""), bar_(bar) { #if defined(__linux__) battery_watch_fd_ = inotify_init1(IN_CLOEXEC); if (battery_watch_fd_ == -1) { diff --git a/src/modules/bluetooth.cpp b/src/modules/bluetooth.cpp index f491f19b3..8201457b2 100644 --- a/src/modules/bluetooth.cpp +++ b/src/modules/bluetooth.cpp @@ -85,8 +85,9 @@ auto getUcharProperty(GDBusProxy* proxy, const char* property_name) -> unsigned } // namespace -waybar::modules::Bluetooth::Bluetooth(const std::string& id, const Json::Value& config) - : ALabel(config, "bluetooth", id, " {status}", 10), +waybar::modules::Bluetooth::Bluetooth(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "bluetooth", id, " {status}", reap_mtx, reap, 10), #ifdef WANT_RFKILL rfkill_{RFKILL_TYPE_BLUETOOTH}, #endif diff --git a/src/modules/cava/cavaGLSL.cpp b/src/modules/cava/cavaGLSL.cpp index 4ab03bcd5..8d9d0a5b9 100644 --- a/src/modules/cava/cavaGLSL.cpp +++ b/src/modules/cava/cavaGLSL.cpp @@ -4,8 +4,9 @@ #include -waybar::modules::cava::CavaGLSL::CavaGLSL(const std::string& id, const Json::Value& config) - : AModule(config, "cavaGLSL", id, false, false), +waybar::modules::cava::CavaGLSL::CavaGLSL(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, "cavaGLSL", id, reap_mtx, reap, false, false), backend_{waybar::modules::cava::CavaBackend::inst(config)} { set_name(name_); if (config_["hide_on_silence"].isBool()) hide_on_silence_ = config_["hide_on_silence"].asBool(); diff --git a/src/modules/cava/cavaRaw.cpp b/src/modules/cava/cavaRaw.cpp index d6a9e0017..934d5c4e8 100644 --- a/src/modules/cava/cavaRaw.cpp +++ b/src/modules/cava/cavaRaw.cpp @@ -2,8 +2,9 @@ #include -waybar::modules::cava::Cava::Cava(const std::string& id, const Json::Value& config) - : ALabel(config, "cava", id, "{}", 60, false, false, false), +waybar::modules::cava::Cava::Cava(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "cava", id, "{}", reap_mtx, reap, 60, false, false, false), backend_{waybar::modules::cava::CavaBackend::inst(config)} { if (config_["hide_on_silence"].isBool()) hide_on_silence_ = config_["hide_on_silence"].asBool(); if (config_["format_silent"].isString()) format_silent_ = config_["format_silent"].asString(); diff --git a/src/modules/cava/cava_frontend.cpp b/src/modules/cava/cava_frontend.cpp new file mode 100644 index 000000000..3615554a1 --- /dev/null +++ b/src/modules/cava/cava_frontend.cpp @@ -0,0 +1,29 @@ +#include "modules/cava/cavaRaw.hpp" +#include "modules/cava/cava_backend.hpp" + +#ifdef HAVE_LIBCAVAGLSL +#include "modules/cava/cavaGLSL.hpp" +#endif + +namespace waybar::modules::cava { +AModule* getModule(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) { + const std::shared_ptr backend_{waybar::modules::cava::CavaBackend::inst(config)}; + switch (backend_->getPrm()->output) { +#ifdef HAVE_LIBCAVAGLSL + case ::cava::output_method::OUTPUT_SDL_GLSL: + return new waybar::modules::cava::CavaGLSL(id, config, reap_mtx, reap); +#endif + default: + return new waybar::modules::cava::Cava(id, config, reap_mtx, reap); + } + throw std::runtime_error("Unknown module"); +}; +} // namespace waybar::modules::cava + +extern "C" { +waybar::AModule* new_cava(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) { + return waybar::modules::cava::getModule(id, config, reap_mtx, reap); +} +} diff --git a/src/modules/cffi.cpp b/src/modules/cffi.cpp index 5c095f46a..40a27a861 100644 --- a/src/modules/cffi.cpp +++ b/src/modules/cffi.cpp @@ -9,8 +9,9 @@ namespace waybar::modules { -CFFI::CFFI(const std::string& name, const std::string& id, const Json::Value& config) - : AModule(config, name, id, true, true) { +CFFI::CFFI(const std::string& name, const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, name, id, reap_mtx, reap, true, true) { const auto dynlib_path = config_["module_path"].asString(); if (dynlib_path.empty()) { throw std::runtime_error{"Missing or empty 'module_path' in module config"}; diff --git a/src/modules/clock.cpp b/src/modules/clock.cpp index 5fe5407bb..14c76b44e 100644 --- a/src/modules/clock.cpp +++ b/src/modules/clock.cpp @@ -20,8 +20,9 @@ using namespace date; namespace fmt_lib = waybar::util::date::format; -waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config) - : ALabel(config, "clock", id, "{:%H:%M}", 60, false, false, true), +waybar::modules::Clock::Clock(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "clock", id, "{:%H:%M}", reap_mtx, reap, 60, false, false, true), m_locale_{std::locale(config_["locale"].isString() ? config_["locale"].asString() : "")}, m_tlpFmt_{(config_["tooltip-format"].isString()) ? config_["tooltip-format"].asString() : ""}, m_tooltip_{new Gtk::Label()}, diff --git a/src/modules/cpu.cpp b/src/modules/cpu.cpp index 0703eaf7c..175adb893 100644 --- a/src/modules/cpu.cpp +++ b/src/modules/cpu.cpp @@ -13,8 +13,9 @@ #include #endif -waybar::modules::Cpu::Cpu(const std::string& id, const Json::Value& config) - : ALabel(config, "cpu", id, "{usage}%", 10) { +waybar::modules::Cpu::Cpu(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "cpu", id, "{usage}%", reap_mtx, reap, 10) { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); diff --git a/src/modules/cpu_frequency/common.cpp b/src/modules/cpu_frequency/common.cpp index e47364ba7..cff5d78a1 100644 --- a/src/modules/cpu_frequency/common.cpp +++ b/src/modules/cpu_frequency/common.cpp @@ -9,8 +9,9 @@ #include #endif -waybar::modules::CpuFrequency::CpuFrequency(const std::string& id, const Json::Value& config) - : ALabel(config, "cpu_frequency", id, "{avg_frequency}", 10) { +waybar::modules::CpuFrequency::CpuFrequency(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "cpu_frequency", id, "{avg_frequency}", reap_mtx, reap, 10) { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); diff --git a/src/modules/cpu_usage/common.cpp b/src/modules/cpu_usage/common.cpp index e39479678..bf11749ee 100644 --- a/src/modules/cpu_usage/common.cpp +++ b/src/modules/cpu_usage/common.cpp @@ -9,8 +9,9 @@ #include #endif -waybar::modules::CpuUsage::CpuUsage(const std::string& id, const Json::Value& config) - : ALabel(config, "cpu_usage", id, "{usage}%", 10) { +waybar::modules::CpuUsage::CpuUsage(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "cpu_usage", id, "{usage}%", reap_mtx, reap, 10) { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); diff --git a/src/modules/custom.cpp b/src/modules/custom.cpp index 0a8d9cf6d..adc58a5cf 100644 --- a/src/modules/custom.cpp +++ b/src/modules/custom.cpp @@ -5,8 +5,9 @@ #include "util/scope_guard.hpp" waybar::modules::Custom::Custom(const std::string& name, const std::string& id, - const Json::Value& config, const std::string& output_name) - : ALabel(config, "custom-" + name, id, "{}"), + const Json::Value& config, const std::string& output_name, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "custom-" + name, id, "{}", reap_mtx, reap), name_(name), output_name_(output_name), id_(id), diff --git a/src/modules/disk.cpp b/src/modules/disk.cpp index ef257b721..085479534 100644 --- a/src/modules/disk.cpp +++ b/src/modules/disk.cpp @@ -2,8 +2,9 @@ using namespace waybar::util; -waybar::modules::Disk::Disk(const std::string& id, const Json::Value& config) - : ALabel(config, "disk", id, "{}%", 30), path_("/") { +waybar::modules::Disk::Disk(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "disk", id, "{}%", reap_mtx, reap, 30), path_("/") { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); @@ -112,4 +113,4 @@ float waybar::modules::Disk::calc_specific_divisor(std::string divisor) { } else { // default to Bytes if it is anything that we don't recongnise return 1.0; } -} \ No newline at end of file +} diff --git a/src/modules/dwl/tags.cpp b/src/modules/dwl/tags.cpp index fb0656504..c34acc0a7 100644 --- a/src/modules/dwl/tags.cpp +++ b/src/modules/dwl/tags.cpp @@ -88,8 +88,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Tags::Tags(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::AModule(config, "tags", id, false, false), +Tags::Tags(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::AModule(config, "tags", id, reap_mtx, reap, false, false), status_manager_{nullptr}, seat_{nullptr}, bar_(bar), diff --git a/src/modules/dwl/window.cpp b/src/modules/dwl/window.cpp index 2b679c9f9..cfe89ff21 100644 --- a/src/modules/dwl/window.cpp +++ b/src/modules/dwl/window.cpp @@ -73,8 +73,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Window::Window(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "window", id, "{}", 0, true), bar_(bar) { +Window::Window(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "window", id, "{}", reap_mtx, reap, 0, true), bar_(bar) { struct wl_display* display = Client::inst()->wl_display; struct wl_registry* registry = wl_display_get_registry(display); diff --git a/src/modules/ext/workspace_manager.cpp b/src/modules/ext/workspace_manager.cpp index 637177d39..74c2f66c9 100644 --- a/src/modules/ext/workspace_manager.cpp +++ b/src/modules/ext/workspace_manager.cpp @@ -21,8 +21,11 @@ uint32_t WorkspaceManager::workspace_global_id = 0; std::map Workspace::icon_map_; WorkspaceManager::WorkspaceManager(const std::string& id, const waybar::Bar& bar, - const Json::Value& config) - : waybar::AModule(config, "workspaces", id, false, false), bar_(bar), box_(bar.orientation, 0) { + const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : waybar::AModule(config, "workspaces", id, reap_mtx, reap, false, false), + bar_(bar), + box_(bar.orientation, 0) { add_registry_listener(this); // parse configuration diff --git a/src/modules/gamemode.cpp b/src/modules/gamemode.cpp index 72ef95033..e9ed97793 100644 --- a/src/modules/gamemode.cpp +++ b/src/modules/gamemode.cpp @@ -21,8 +21,12 @@ #include "util/gtk_icon.hpp" namespace waybar::modules { -Gamemode::Gamemode(const std::string& id, const Json::Value& config) - : AModule(config, "gamemode", id), box_(Gtk::ORIENTATION_HORIZONTAL, 0), icon_(), label_() { +Gamemode::Gamemode(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : AModule(config, "gamemode", id, reap_mtx, reap), + box_(Gtk::ORIENTATION_HORIZONTAL, 0), + icon_(), + label_() { box_.pack_start(icon_); box_.pack_start(label_); box_.set_name(name_); diff --git a/src/modules/gps.cpp b/src/modules/gps.cpp index a7bab659c..c3cb68ab6 100644 --- a/src/modules/gps.cpp +++ b/src/modules/gps.cpp @@ -15,13 +15,21 @@ #include #endif +extern "C" { +waybar::ALabel* new_gps(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) { + return new waybar::modules::Gps(id, config, reap_mtx, reap); +} +} + namespace { using namespace waybar::util; constexpr const char* DEFAULT_FORMAT = "{mode}"; } // namespace -waybar::modules::Gps::Gps(const std::string& id, const Json::Value& config) - : ALabel(config, "gps", id, "{}", 5) +waybar::modules::Gps::Gps(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "gps", id, "{}", reap_mtx, reap, 5) #ifdef WANT_RFKILL , rfkill_{RFKILL_TYPE_GPS} diff --git a/src/modules/hyprland/language.cpp b/src/modules/hyprland/language.cpp index 25f6789d7..6b93c215c 100644 --- a/src/modules/hyprland/language.cpp +++ b/src/modules/hyprland/language.cpp @@ -9,8 +9,9 @@ namespace waybar::modules::hyprland { -Language::Language(const std::string& id, const Bar& bar, const Json::Value& config) - : ALabel(config, "language", id, "{}", 0, true), bar_(bar), m_ipc(IPC::inst()) { +Language::Language(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "language", id, "{}", reap_mtx, reap, 0, true), bar_(bar), m_ipc(IPC::inst()) { // get the active layout when open initLanguage(); diff --git a/src/modules/hyprland/submap.cpp b/src/modules/hyprland/submap.cpp index 5d587d02f..b5de3654f 100644 --- a/src/modules/hyprland/submap.cpp +++ b/src/modules/hyprland/submap.cpp @@ -4,8 +4,9 @@ namespace waybar::modules::hyprland { -Submap::Submap(const std::string& id, const Bar& bar, const Json::Value& config) - : ALabel(config, "submap", id, "{}", 0, true), bar_(bar), m_ipc(IPC::inst()) { +Submap::Submap(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "submap", id, "{}", reap_mtx, reap, 0, true), bar_(bar), m_ipc(IPC::inst()) { parseConfig(config); label_.hide(); diff --git a/src/modules/hyprland/window.cpp b/src/modules/hyprland/window.cpp index e02a76917..8997d269a 100644 --- a/src/modules/hyprland/window.cpp +++ b/src/modules/hyprland/window.cpp @@ -17,8 +17,11 @@ namespace waybar::modules::hyprland { std::shared_mutex windowIpcSmtx; -Window::Window(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "window", id, "{title}", 0, true), bar_(bar), m_ipc(IPC::inst()) { +Window::Window(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "window", id, "{title}", reap_mtx, reap, 0, true), + bar_(bar), + m_ipc(IPC::inst()) { std::unique_lock windowIpcUniqueLock(windowIpcSmtx); separateOutputs_ = config["separate-outputs"].asBool(); diff --git a/src/modules/hyprland/windowcount.cpp b/src/modules/hyprland/windowcount.cpp index 487b00834..9ed4fd2ae 100644 --- a/src/modules/hyprland/windowcount.cpp +++ b/src/modules/hyprland/windowcount.cpp @@ -12,8 +12,11 @@ namespace waybar::modules::hyprland { -WindowCount::WindowCount(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "windowcount", id, "{count}", 0, true), bar_(bar), m_ipc(IPC::inst()) { +WindowCount::WindowCount(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "windowcount", id, "{count}", reap_mtx, reap, 0, true), + bar_(bar), + m_ipc(IPC::inst()) { separateOutputs_ = config.isMember("separate-outputs") ? config["separate-outputs"].asBool() : true; diff --git a/src/modules/hyprland/workspaces.cpp b/src/modules/hyprland/workspaces.cpp index 6fa382608..ae22a0bf8 100644 --- a/src/modules/hyprland/workspaces.cpp +++ b/src/modules/hyprland/workspaces.cpp @@ -14,8 +14,9 @@ namespace waybar::modules::hyprland { -Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config) - : AModule(config, "workspaces", id, false, false), +Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, "workspaces", id, reap_mtx, reap, false, false), m_bar(bar), m_box(bar.orientation, 0), m_ipc(IPC::inst()) { diff --git a/src/modules/idle_inhibitor.cpp b/src/modules/idle_inhibitor.cpp index a5fc9ac73..6988f397b 100644 --- a/src/modules/idle_inhibitor.cpp +++ b/src/modules/idle_inhibitor.cpp @@ -7,8 +7,9 @@ std::list waybar::modules::IdleInhibitor::modules; bool waybar::modules::IdleInhibitor::status = false; waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar, - const Json::Value& config) - : ALabel(config, "idle_inhibitor", id, "{status}", 0, false, true), + const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "idle_inhibitor", id, "{status}", reap_mtx, reap, 0, false, true), bar_(bar), idle_inhibitor_(nullptr), pid_(-1) { diff --git a/src/modules/image.cpp b/src/modules/image.cpp index 189deee6a..b51eebf8b 100644 --- a/src/modules/image.cpp +++ b/src/modules/image.cpp @@ -1,7 +1,8 @@ #include "modules/image.hpp" -waybar::modules::Image::Image(const std::string& id, const Json::Value& config) - : AModule(config, "image", id), box_(Gtk::ORIENTATION_HORIZONTAL, 0) { +waybar::modules::Image::Image(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, "image", id, reap_mtx, reap), box_(Gtk::ORIENTATION_HORIZONTAL, 0) { box_.pack_start(image_); box_.set_name("image"); if (!id.empty()) { diff --git a/src/modules/inhibitor.cpp b/src/modules/inhibitor.cpp index fe2a4be41..ba7de3f40 100644 --- a/src/modules/inhibitor.cpp +++ b/src/modules/inhibitor.cpp @@ -97,8 +97,9 @@ auto getInhibitors(const Json::Value& config) -> std::string { namespace waybar::modules { -Inhibitor::Inhibitor(const std::string& id, const Bar& bar, const Json::Value& config) - : ALabel(config, "inhibitor", id, "{status}", true), +Inhibitor::Inhibitor(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "inhibitor", id, "{status}", reap_mtx, reap, true), dbus_(::dbus()), inhibitors_(::getInhibitors(config)) { event_box_.add_events(Gdk::BUTTON_PRESS_MASK); diff --git a/src/modules/jack.cpp b/src/modules/jack.cpp index 678f986b7..d8e98e2fc 100644 --- a/src/modules/jack.cpp +++ b/src/modules/jack.cpp @@ -2,8 +2,9 @@ namespace waybar::modules { -JACK::JACK(const std::string& id, const Json::Value& config) - : ALabel(config, "jack", id, "{load}%", 1) { +JACK::JACK(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "jack", id, "{load}%", reap_mtx, reap, 1) { running_ = false; client_ = NULL; diff --git a/src/modules/keyboard_state.cpp b/src/modules/keyboard_state.cpp index 18ce0a7c4..1a9118f16 100644 --- a/src/modules/keyboard_state.cpp +++ b/src/modules/keyboard_state.cpp @@ -79,8 +79,10 @@ auto supportsLockStates(const libevdev* dev) -> bool { } waybar::modules::KeyboardState::KeyboardState(const std::string& id, const Bar& bar, - const Json::Value& config) - : AModule(config, "keyboard-state", id, false, !config["disable-scroll"].asBool()), + const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : AModule(config, "keyboard-state", id, reap_mtx, reap, false, + !config["disable-scroll"].asBool()), box_(bar.orientation, 0), numlock_label_(""), capslock_label_(""), diff --git a/src/modules/load.cpp b/src/modules/load.cpp index 69a37b4eb..f6855b55a 100644 --- a/src/modules/load.cpp +++ b/src/modules/load.cpp @@ -9,8 +9,9 @@ #include #endif -waybar::modules::Load::Load(const std::string& id, const Json::Value& config) - : ALabel(config, "load", id, "{load1}", 10) { +waybar::modules::Load::Load(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "load", id, "{load1}", reap_mtx, reap, 10) { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); diff --git a/src/modules/memory/common.cpp b/src/modules/memory/common.cpp index a83f6526f..6300b0239 100644 --- a/src/modules/memory/common.cpp +++ b/src/modules/memory/common.cpp @@ -1,7 +1,8 @@ #include "modules/memory.hpp" -waybar::modules::Memory::Memory(const std::string& id, const Json::Value& config) - : ALabel(config, "memory", id, "{}%", 30) { +waybar::modules::Memory::Memory(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "memory", id, "{}%", reap_mtx, reap, 30) { thread_ = [this] { dp.emit(); thread_.sleep_for(interval_); diff --git a/src/modules/mpd/mpd.cpp b/src/modules/mpd/mpd.cpp index 8e6bbb253..e60b5d38e 100644 --- a/src/modules/mpd/mpd.cpp +++ b/src/modules/mpd/mpd.cpp @@ -15,8 +15,9 @@ namespace waybar::modules { } // namespace waybar::modules #endif -waybar::modules::MPD::MPD(const std::string& id, const Json::Value& config) - : ALabel(config, "mpd", id, "{album} - {artist} - {title}", 5, false, true), +waybar::modules::MPD::MPD(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "mpd", id, "{album} - {artist} - {title}", reap_mtx, reap, 5, false, true), module_name_(id.empty() ? "mpd" : "mpd#" + id), server_(nullptr), port_(config_["port"].isUInt() ? config["port"].asUInt() : 0), diff --git a/src/modules/mpris/mpris.cpp b/src/modules/mpris/mpris.cpp index 2b345fc5a..d782fa0df 100644 --- a/src/modules/mpris/mpris.cpp +++ b/src/modules/mpris/mpris.cpp @@ -18,8 +18,9 @@ namespace waybar::modules::mpris { const std::string DEFAULT_FORMAT = "{player} ({status}): {dynamic}"; -Mpris::Mpris(const std::string& id, const Json::Value& config) - : ALabel(config, "mpris", id, DEFAULT_FORMAT, 0, false, true), +Mpris::Mpris(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "mpris", id, DEFAULT_FORMAT, reap_mtx, reap, 0, false, true), tooltip_(DEFAULT_FORMAT), artist_len_(-1), album_len_(-1), diff --git a/src/modules/network.cpp b/src/modules/network.cpp index c33e750da..0b33b2a30 100644 --- a/src/modules/network.cpp +++ b/src/modules/network.cpp @@ -82,8 +82,9 @@ waybar::modules::Network::readBandwidthUsage() { return {{receivedBytes, transmittedBytes}}; } -waybar::modules::Network::Network(const std::string& id, const Json::Value& config) - : ALabel(config, "network", id, DEFAULT_FORMAT, 60) { +waybar::modules::Network::Network(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "network", id, DEFAULT_FORMAT, reap_mtx, reap, 60) { // Start with some "text" in the module's label_. update() will then // update it. Since the text should be different, update() will be able // to show or hide the event_box_. This is to work around the case where diff --git a/src/modules/niri/language.cpp b/src/modules/niri/language.cpp index 3359ef4cf..493a8f3f9 100644 --- a/src/modules/niri/language.cpp +++ b/src/modules/niri/language.cpp @@ -8,8 +8,9 @@ namespace waybar::modules::niri { -Language::Language(const std::string& id, const Bar& bar, const Json::Value& config) - : ALabel(config, "language", id, "{}", 0, false), bar_(bar) { +Language::Language(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "language", id, "{}", reap_mtx, reap, 0, false), bar_(bar) { label_.hide(); if (!gIPC) gIPC = std::make_unique(); diff --git a/src/modules/niri/window.cpp b/src/modules/niri/window.cpp index c35377692..53aed8e43 100644 --- a/src/modules/niri/window.cpp +++ b/src/modules/niri/window.cpp @@ -9,8 +9,9 @@ namespace waybar::modules::niri { -Window::Window(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "window", id, "{title}", 0, true), bar_(bar) { +Window::Window(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "window", id, "{title}", reap_mtx, reap, 0, true), bar_(bar) { if (!gIPC) gIPC = std::make_unique(); gIPC->registerForIPC("WindowsChanged", this); diff --git a/src/modules/niri/workspaces.cpp b/src/modules/niri/workspaces.cpp index 8eb912bce..86cb18501 100644 --- a/src/modules/niri/workspaces.cpp +++ b/src/modules/niri/workspaces.cpp @@ -6,8 +6,11 @@ namespace waybar::modules::niri { -Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config) - : AModule(config, "workspaces", id, false, false), bar_(bar), box_(bar.orientation, 0) { +Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, "workspaces", id, reap_mtx, reap, false, false), + bar_(bar), + box_(bar.orientation, 0) { box_.set_name("workspaces"); if (!id.empty()) { box_.get_style_context()->add_class(id); diff --git a/src/modules/power_profiles_daemon.cpp b/src/modules/power_profiles_daemon.cpp index abad763dc..5a82b16d8 100644 --- a/src/modules/power_profiles_daemon.cpp +++ b/src/modules/power_profiles_daemon.cpp @@ -7,8 +7,10 @@ namespace waybar::modules { -PowerProfilesDaemon::PowerProfilesDaemon(const std::string& id, const Json::Value& config) - : ALabel(config, "power-profiles-daemon", id, "{icon}", 0, false, true), connected_(false) { +PowerProfilesDaemon::PowerProfilesDaemon(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "power-profiles-daemon", id, "{icon}", reap_mtx, reap, 0, false, true), + connected_(false) { if (config_["tooltip-format"].isString()) { tooltipFormat_ = config_["tooltip-format"].asString(); } else { diff --git a/src/modules/privacy/privacy.cpp b/src/modules/privacy/privacy.cpp index 904c8fd95..1896a414a 100644 --- a/src/modules/privacy/privacy.cpp +++ b/src/modules/privacy/privacy.cpp @@ -16,8 +16,8 @@ using util::PipewireBackend::PRIVACY_NODE_TYPE_NONE; using util::PipewireBackend::PRIVACY_NODE_TYPE_VIDEO_INPUT; Privacy::Privacy(const std::string& id, const Json::Value& config, Gtk::Orientation orientation, - const std::string& pos) - : AModule(config, "privacy", id), + const std::string& pos, std::mutex& reap_mtx, std::list& reap) + : AModule(config, "privacy", id, reap_mtx, reap), nodes_screenshare(), nodes_audio_in(), nodes_audio_out(), diff --git a/src/modules/pulseaudio.cpp b/src/modules/pulseaudio.cpp index f60c39ffe..0c6fbafb0 100644 --- a/src/modules/pulseaudio.cpp +++ b/src/modules/pulseaudio.cpp @@ -1,7 +1,8 @@ #include "modules/pulseaudio.hpp" -waybar::modules::Pulseaudio::Pulseaudio(const std::string& id, const Json::Value& config) - : ALabel(config, "pulseaudio", id, "{volume}%") { +waybar::modules::Pulseaudio::Pulseaudio(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "pulseaudio", id, "{volume}%", reap_mtx, reap) { event_box_.add_events(Gdk::SCROLL_MASK | Gdk::SMOOTH_SCROLL_MASK); event_box_.signal_scroll_event().connect(sigc::mem_fun(*this, &Pulseaudio::handleScroll)); diff --git a/src/modules/pulseaudio_slider.cpp b/src/modules/pulseaudio_slider.cpp index bf85584ed..9050a6af7 100644 --- a/src/modules/pulseaudio_slider.cpp +++ b/src/modules/pulseaudio_slider.cpp @@ -2,8 +2,9 @@ namespace waybar::modules { -PulseaudioSlider::PulseaudioSlider(const std::string& id, const Json::Value& config) - : ASlider(config, "pulseaudio-slider", id) { +PulseaudioSlider::PulseaudioSlider(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ASlider(config, "pulseaudio-slider", id, reap_mtx, reap) { backend = util::AudioBackend::getInstance([this] { this->dp.emit(); }); backend->setIgnoredSinks(config_["ignored-sinks"]); @@ -79,4 +80,4 @@ void PulseaudioSlider::onValueChanged() { backend->changeVolume(volume, min_, max_); } -} // namespace waybar::modules \ No newline at end of file +} // namespace waybar::modules diff --git a/src/modules/river/layout.cpp b/src/modules/river/layout.cpp index 31358f808..c5a7151e8 100644 --- a/src/modules/river/layout.cpp +++ b/src/modules/river/layout.cpp @@ -98,8 +98,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Layout::Layout(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::ALabel(config, "layout", id, "{}"), +Layout::Layout(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::ALabel(config, "layout", id, "{}", reap_mtx, reap), status_manager_{nullptr}, seat_{nullptr}, bar_(bar), diff --git a/src/modules/river/mode.cpp b/src/modules/river/mode.cpp index 10f5089ea..6c65b1e8b 100644 --- a/src/modules/river/mode.cpp +++ b/src/modules/river/mode.cpp @@ -58,8 +58,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Mode::Mode(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::ALabel(config, "mode", id, "{}"), +Mode::Mode(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::ALabel(config, "mode", id, "{}", reap_mtx, reap), status_manager_{nullptr}, seat_{nullptr}, bar_(bar), diff --git a/src/modules/river/tags.cpp b/src/modules/river/tags.cpp index fc4d98f94..7c831e798 100644 --- a/src/modules/river/tags.cpp +++ b/src/modules/river/tags.cpp @@ -81,8 +81,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Tags::Tags(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::AModule(config, "tags", id, false, false), +Tags::Tags(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::AModule(config, "tags", id, reap_mtx, reap, false, false), status_manager_{nullptr}, control_{nullptr}, seat_{nullptr}, diff --git a/src/modules/river/window.cpp b/src/modules/river/window.cpp index 1f41ab4c1..cb65a0c91 100644 --- a/src/modules/river/window.cpp +++ b/src/modules/river/window.cpp @@ -58,8 +58,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Window::Window(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::ALabel(config, "window", id, "{}", 30), +Window::Window(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::ALabel(config, "window", id, "{}", reap_mtx, reap, 30), status_manager_{nullptr}, seat_{nullptr}, bar_(bar), diff --git a/src/modules/sndio.cpp b/src/modules/sndio.cpp index 9779cd364..0abfe3a4b 100644 --- a/src/modules/sndio.cpp +++ b/src/modules/sndio.cpp @@ -40,8 +40,9 @@ auto Sndio::connect_to_sndio() -> void { pfds_.reserve(sioctl_nfds(hdl_)); } -Sndio::Sndio(const std::string& id, const Json::Value& config) - : ALabel(config, "sndio", id, "{volume}%", 1, false, true), +Sndio::Sndio(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "sndio", id, "{volume}%", reap_mtx, reap, 1, false, true), hdl_(nullptr), pfds_(0), addr_(0), diff --git a/src/modules/sni/tray.cpp b/src/modules/sni/tray.cpp index 34a3c05f6..c023aa1ec 100644 --- a/src/modules/sni/tray.cpp +++ b/src/modules/sni/tray.cpp @@ -8,8 +8,9 @@ namespace waybar::modules::SNI { -Tray::Tray(const std::string& id, const Bar& bar, const Json::Value& config) - : AModule(config, "tray", id), +Tray::Tray(const std::string& id, const Bar& bar, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : AModule(config, "tray", id, reap_mtx, reap), box_(bar.orientation, 0), watcher_(SNI::Watcher::getInstance()), host_(nb_hosts_, config, bar, std::bind(&Tray::onAdd, this, std::placeholders::_1), diff --git a/src/modules/sway/language.cpp b/src/modules/sway/language.cpp index f4cfa6c30..b9ae01fd1 100644 --- a/src/modules/sway/language.cpp +++ b/src/modules/sway/language.cpp @@ -17,8 +17,9 @@ namespace waybar::modules::sway { const std::string Language::XKB_LAYOUT_NAMES_KEY = "xkb_layout_names"; const std::string Language::XKB_ACTIVE_LAYOUT_NAME_KEY = "xkb_active_layout_name"; -Language::Language(const std::string& id, const Json::Value& config) - : ALabel(config, "language", id, "{}", 0, true) { +Language::Language(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "language", id, "{}", reap_mtx, reap, 0, true) { hide_single_ = config["hide-single-layout"].isBool() && config["hide-single-layout"].asBool(); is_variant_displayed = format_.find("{variant}") != std::string::npos; if (format_.find("{}") != std::string::npos || format_.find("{short}") != std::string::npos) { diff --git a/src/modules/sway/mode.cpp b/src/modules/sway/mode.cpp index b81735e54..131118eec 100644 --- a/src/modules/sway/mode.cpp +++ b/src/modules/sway/mode.cpp @@ -4,8 +4,9 @@ namespace waybar::modules::sway { -Mode::Mode(const std::string& id, const Json::Value& config) - : ALabel(config, "mode", id, "{}", 0, true) { +Mode::Mode(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : ALabel(config, "mode", id, "{}", reap_mtx, reap, 0, true) { ipc_.subscribe(R"(["mode"])"); ipc_.signal_event.connect(sigc::mem_fun(*this, &Mode::onEvent)); // Launch worker diff --git a/src/modules/sway/scratchpad.cpp b/src/modules/sway/scratchpad.cpp index 17dc27071..2706fde7c 100644 --- a/src/modules/sway/scratchpad.cpp +++ b/src/modules/sway/scratchpad.cpp @@ -5,9 +5,11 @@ #include namespace waybar::modules::sway { -Scratchpad::Scratchpad(const std::string& id, const Json::Value& config) +Scratchpad::Scratchpad(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) : ALabel(config, "scratchpad", id, - config["format"].isString() ? config["format"].asString() : "{icon} {count}"), + config["format"].isString() ? config["format"].asString() : "{icon} {count}", reap_mtx, + reap), tooltip_format_(config_["tooltip-format"].isString() ? config_["tooltip-format"].asString() : "{app}: {title}"), show_empty_(config_["show-empty"].isBool() ? config_["show-empty"].asBool() : false), @@ -80,4 +82,4 @@ auto Scratchpad::onCmd(const struct Ipc::ipc_response& res) -> void { } auto Scratchpad::onEvent(const struct Ipc::ipc_response& res) -> void { getTree(); } -} // namespace waybar::modules::sway \ No newline at end of file +} // namespace waybar::modules::sway diff --git a/src/modules/sway/window.cpp b/src/modules/sway/window.cpp index 68655a764..c3884afcd 100644 --- a/src/modules/sway/window.cpp +++ b/src/modules/sway/window.cpp @@ -16,8 +16,9 @@ namespace waybar::modules::sway { -Window::Window(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "window", id, "{}", 0, true), bar_(bar), windowId_(-1) { +Window::Window(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "window", id, "{}", reap_mtx, reap, 0, true), bar_(bar), windowId_(-1) { ipc_.subscribe(R"(["window","workspace"])"); ipc_.signal_event.connect(sigc::mem_fun(*this, &Window::onEvent)); ipc_.signal_cmd.connect(sigc::mem_fun(*this, &Window::onCmd)); diff --git a/src/modules/sway/workspaces.cpp b/src/modules/sway/workspaces.cpp index e0255893a..0894400d1 100644 --- a/src/modules/sway/workspaces.cpp +++ b/src/modules/sway/workspaces.cpp @@ -41,8 +41,9 @@ int Workspaces::windowRewritePriorityFunction(std::string const& window_rule) { return 0; } -Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config) - : AModule(config, "workspaces", id, false, !config["disable-scroll"].asBool()), +Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule(config, "workspaces", id, reap_mtx, reap, false, !config["disable-scroll"].asBool()), bar_(bar), box_(bar.orientation, 0) { if (config["format-icons"]["high-priority-named"].isArray()) { diff --git a/src/modules/systemd_failed_units.cpp b/src/modules/systemd_failed_units.cpp index 90f33be78..27cf7a416 100644 --- a/src/modules/systemd_failed_units.cpp +++ b/src/modules/systemd_failed_units.cpp @@ -10,8 +10,9 @@ static const unsigned UPDATE_DEBOUNCE_TIME_MS = 1000; namespace waybar::modules { -SystemdFailedUnits::SystemdFailedUnits(const std::string& id, const Json::Value& config) - : ALabel(config, "systemd-failed-units", id, "{nr_failed} failed", 1), +SystemdFailedUnits::SystemdFailedUnits(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "systemd-failed-units", id, "{nr_failed} failed", reap_mtx, reap, 1), hide_on_ok(true), update_pending(false), nr_failed_system(0), diff --git a/src/modules/temperature.cpp b/src/modules/temperature.cpp index fa23ef56f..a7769ebc5 100644 --- a/src/modules/temperature.cpp +++ b/src/modules/temperature.cpp @@ -7,8 +7,9 @@ #include #endif -waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config) - : ALabel(config, "temperature", id, "{temperatureC}°C", 10) { +waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "temperature", id, "{temperatureC}°C", reap_mtx, reap, 10) { #if defined(__FreeBSD__) // FreeBSD uses sysctlbyname instead of read from a file #else diff --git a/src/modules/upower.cpp b/src/modules/upower.cpp index 7530890cb..4ec4e4c5c 100644 --- a/src/modules/upower.cpp +++ b/src/modules/upower.cpp @@ -6,8 +6,10 @@ namespace waybar::modules { -UPower::UPower(const std::string& id, const Json::Value& config) - : AIconLabel(config, "upower", id, "{percentage}", 0, true, true, true), sleeping_{false} { +UPower::UPower(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : AIconLabel(config, "upower", id, "{percentage}", reap_mtx, reap, 0, true, true, true), + sleeping_{false} { box_.set_name(name_); box_.set_spacing(0); // Tooltip box diff --git a/src/modules/user.cpp b/src/modules/user.cpp index 3ca5e431c..1586f7b2b 100644 --- a/src/modules/user.cpp +++ b/src/modules/user.cpp @@ -25,8 +25,10 @@ const static int LEFT_MOUSE_BUTTON_CODE = 1; namespace waybar::modules { -User::User(const std::string& id, const Json::Value& config) - : AIconLabel(config, "user", id, "{user} {work_H}:{work_M}", 60, false, true, true) { +User::User(const std::string& id, const Json::Value& config, std::mutex& reap_mtx, + std::list& reap) + : AIconLabel(config, "user", id, "{user} {work_H}:{work_M}", reap_mtx, reap, 60, false, true, + true) { AIconLabel::box_.set_spacing(0); if (AIconLabel::iconEnabled()) { this->init_avatar(AIconLabel::config_); diff --git a/src/modules/wayfire/window.cpp b/src/modules/wayfire/window.cpp index fbcde6ec7..e4612bac3 100644 --- a/src/modules/wayfire/window.cpp +++ b/src/modules/wayfire/window.cpp @@ -9,8 +9,9 @@ namespace waybar::modules::wayfire { -Window::Window(const std::string& id, const Bar& bar, const Json::Value& config) - : AAppIconLabel(config, "window", id, "{title}", 0, true), +Window::Window(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AAppIconLabel(config, "window", id, "{title}", reap_mtx, reap, 0, true), ipc{IPC::get_instance()}, handler{[this](const auto&) { dp.emit(); }}, bar_{bar} { diff --git a/src/modules/wayfire/workspaces.cpp b/src/modules/wayfire/workspaces.cpp index 4c4cd6c1e..d86293972 100644 --- a/src/modules/wayfire/workspaces.cpp +++ b/src/modules/wayfire/workspaces.cpp @@ -11,8 +11,9 @@ namespace waybar::modules::wayfire { -Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config) - : AModule{config, "workspaces", id, false, !config["disable-scroll"].asBool()}, +Workspaces::Workspaces(const std::string& id, const Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : AModule{config, "workspaces", id, reap_mtx, reap, false, !config["disable-scroll"].asBool()}, ipc{IPC::get_instance()}, handler{[this](const auto&) { dp.emit(); }}, bar_{bar} { diff --git a/src/modules/wireplumber.cpp b/src/modules/wireplumber.cpp index bb3005bdd..b7b219113 100644 --- a/src/modules/wireplumber.cpp +++ b/src/modules/wireplumber.cpp @@ -6,8 +6,9 @@ bool isValidNodeId(uint32_t id) { return id > 0 && id < G_MAXUINT32; } std::list waybar::modules::Wireplumber::modules; -waybar::modules::Wireplumber::Wireplumber(const std::string& id, const Json::Value& config) - : ALabel(config, "wireplumber", id, "{volume}%"), +waybar::modules::Wireplumber::Wireplumber(const std::string& id, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : ALabel(config, "wireplumber", id, "{volume}%", reap_mtx, reap), wp_core_(nullptr), apis_(nullptr), om_(nullptr), diff --git a/src/modules/wlr/taskbar.cpp b/src/modules/wlr/taskbar.cpp index d58303da7..f986a43f0 100644 --- a/src/modules/wlr/taskbar.cpp +++ b/src/modules/wlr/taskbar.cpp @@ -561,8 +561,9 @@ static void handle_global_remove(void* data, struct wl_registry* registry, uint3 static const wl_registry_listener registry_listener_impl = {.global = handle_global, .global_remove = handle_global_remove}; -Taskbar::Taskbar(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : waybar::AModule(config, "taskbar", id, false, false), +Taskbar::Taskbar(const std::string& id, const waybar::Bar& bar, const Json::Value& config, + std::mutex& reap_mtx, std::list& reap) + : waybar::AModule(config, "taskbar", id, reap_mtx, reap, false, false), bar_(bar), box_{bar.orientation, 0}, manager_{nullptr},