diff --git a/include/factory.hpp b/include/factory.hpp index 2b65067..51aff7c 100644 --- a/include/factory.hpp +++ b/include/factory.hpp @@ -3,6 +3,7 @@ #include #include "modules/clock.hpp" #ifdef HAVE_SWAY +#include "modules/sway/mode.hpp" #include "modules/sway/workspaces.hpp" #include "modules/sway/window.hpp" #endif diff --git a/include/modules/sway/mode.hpp b/include/modules/sway/mode.hpp new file mode 100644 index 0000000..beb837b --- /dev/null +++ b/include/modules/sway/mode.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include "bar.hpp" +#include "client.hpp" +#include "util/chrono.hpp" +#include "util/json.hpp" +#include "ALabel.hpp" +#include "modules/sway/ipc/client.hpp" + +namespace waybar::modules::sway { + +class Mode : public ALabel { + public: + Mode(waybar::Bar&, const Json::Value&); + auto update() -> void; + private: + void worker(); + + Bar& bar_; + waybar::util::SleeperThread thread_; + util::JsonParser parser_; + Ipc ipc_; + std::string mode_; +}; + +} \ No newline at end of file diff --git a/meson.build b/meson.build index a98c8b9..846580b 100644 --- a/meson.build +++ b/meson.build @@ -57,6 +57,7 @@ if find_program('sway', required : false).found() add_project_arguments('-DHAVE_SWAY', language: 'cpp') src_files += [ 'src/modules/sway/ipc/client.cpp', + 'src/modules/sway/mode.cpp', 'src/modules/sway/window.cpp', 'src/modules/sway/workspaces.cpp' ] diff --git a/src/factory.cpp b/src/factory.cpp index 479ab79..4fba870 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -12,6 +12,9 @@ waybar::IModule* waybar::Factory::makeModule(const std::string &name) const return new waybar::modules::Battery(config_[name]); } #ifdef HAVE_SWAY + if (ref == "sway/mode") { + return new waybar::modules::sway::Mode(bar_, config_[name]); + } if (ref == "sway/workspaces") { return new waybar::modules::sway::Workspaces(bar_, config_[name]); } diff --git a/src/modules/sway/mode.cpp b/src/modules/sway/mode.cpp new file mode 100644 index 0000000..a32f31b --- /dev/null +++ b/src/modules/sway/mode.cpp @@ -0,0 +1,43 @@ +#include "modules/sway/mode.hpp" + +waybar::modules::sway::Mode::Mode(Bar& bar, const Json::Value& config) + : ALabel(config, "{}"), bar_(bar) +{ + ipc_.connect(); + ipc_.subscribe("[ \"mode\" ]"); + // Launch worker + worker(); +} + +void waybar::modules::sway::Mode::worker() +{ + thread_ = [this] { + try { + auto res = ipc_.handleEvent(); + auto parsed = parser_.parse(res.payload); + if ((parsed["change"]) != "default" ) { + mode_ = parsed["change"].asString(); + dp.emit(); + } + else if ((parsed["change"]) == "default" ) { + mode_.clear(); + dp.emit(); + } + } catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + } + }; +} + +auto waybar::modules::sway::Mode::update() -> void +{ + if (mode_.empty()) { + label_.set_name(""); + label_.hide(); + } else { + label_.set_name("mode"); + label_.set_text(fmt::format(format_, mode_)); + label_.set_tooltip_text(mode_); + label_.show(); + } +} \ No newline at end of file