From d2ff116c928c0e6927a88035decef3117a56d938 Mon Sep 17 00:00:00 2001 From: asas1asas200 Date: Wed, 31 Aug 2022 01:54:19 +0800 Subject: [PATCH] feat(sway/scratchpad): add some configs Add some configs for displaying. Remove draft codes. --- include/modules/sway/scratchpad.hpp | 13 ++++----- resources/config | 9 ++++++- resources/style.css | 9 +++++++ src/factory.cpp | 2 +- src/modules/sway/scratchpad.cpp | 42 ++++++++++++++++++++++++----- 5 files changed, 61 insertions(+), 14 deletions(-) diff --git a/include/modules/sway/scratchpad.hpp b/include/modules/sway/scratchpad.hpp index 9464a6e..e68e772 100644 --- a/include/modules/sway/scratchpad.hpp +++ b/include/modules/sway/scratchpad.hpp @@ -12,10 +12,9 @@ #include "util/json.hpp" namespace waybar::modules::sway { -// class Scratchpad : public AModule, public sigc::trackable { class Scratchpad : public ALabel { public: - Scratchpad(const std::string&, const waybar::Bar&, const Json::Value&); + Scratchpad(const std::string&, const Json::Value&); ~Scratchpad() = default; auto update() -> void; @@ -23,11 +22,13 @@ class Scratchpad : public ALabel { auto getTree() -> void; auto onCmd(const struct Ipc::ipc_response&) -> void; auto onEvent(const struct Ipc::ipc_response&) -> void; - // bool handleScroll(GdkEventScroll*); - Gtk::Box box_; - const Bar& bar_; - std::mutex mutex_; + + std::string tooltip_format_; + bool show_empty_; + bool tooltip_enabled_; + std::string tooltip_text_; int count_; + std::mutex mutex_; Ipc ipc_; util::JsonParser parser_; }; diff --git a/resources/config b/resources/config index 6a753ac..ad76e93 100644 --- a/resources/config +++ b/resources/config @@ -5,7 +5,7 @@ // "width": 1280, // Waybar width "spacing": 4, // Gaps between modules (4px) // Choose the order of the modules - "modules-left": ["sway/workspaces", "sway/mode", "custom/media"], + "modules-left": ["sway/workspaces", "sway/mode", "sway/scratchpad", "custom/media"], "modules-center": ["sway/window"], "modules-right": ["mpd", "idle_inhibitor", "pulseaudio", "network", "cpu", "memory", "temperature", "backlight", "keyboard-state", "sway/language", "battery", "battery#bat2", "clock", "tray"], // Modules configuration @@ -36,6 +36,13 @@ "sway/mode": { "format": "{}" }, + "sway/scratchpad": { + "format": "{icon} {count}", + "show-empty": false, + "format-icons": ["", ""], + "tooltip": true, + "tooltip-format": "{app}: {title}" + }, "mpd": { "format": "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ", "format-disconnected": "Disconnected ", diff --git a/resources/style.css b/resources/style.css index 563ee0d..d22cd25 100644 --- a/resources/style.css +++ b/resources/style.css @@ -78,6 +78,7 @@ window#waybar.chromium { #tray, #mode, #idle_inhibitor, +#scratchpad, #mpd { padding: 0 10px; color: #ffffff; @@ -252,3 +253,11 @@ label:focus { #keyboard-state > label.locked { background: rgba(0, 0, 0, 0.2); } + +#scratchpad { + background: rgba(0, 0, 0, 0.2); +} + +#scratchpad.empty { + background-color: transparent; +} diff --git a/src/factory.cpp b/src/factory.cpp index 4a72d40..f29b0f5 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -36,7 +36,7 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const { return new waybar::modules::sway::Language(id, config_[name]); } if (ref == "sway/scratchpad") { - return new waybar::modules::sway::Scratchpad(id, bar_, config_[name]); + return new waybar::modules::sway::Scratchpad(id, config_[name]); } #endif #ifdef HAVE_WLR diff --git a/src/modules/sway/scratchpad.cpp b/src/modules/sway/scratchpad.cpp index a7fd7ba..59e3053 100644 --- a/src/modules/sway/scratchpad.cpp +++ b/src/modules/sway/scratchpad.cpp @@ -5,10 +5,14 @@ #include namespace waybar::modules::sway { -Scratchpad::Scratchpad(const std::string& id, const waybar::Bar& bar, const Json::Value& config) - : ALabel(config, "scratchpad", id, "{count}"), - box_(bar.vertical ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL, 0), - bar_(bar), +Scratchpad::Scratchpad(const std::string& id, const Json::Value& config) + : ALabel(config, "scratchpad", id, + config["format"].isString() ? config["format"].asString() : "{icon} {count}"), + tooltip_format_(config_["tooltip-format"].isString() ? config_["tooltip-format"].asString() + : "{app}: {title}"), + show_empty_(config_["show-empty"].isBool() ? config_["show-empty"].asBool() : false), + tooltip_enabled_(config_["tooltip"].isBool() ? config_["tooltip"].asBool() : true), + tooltip_text_(""), count_(0) { ipc_.subscribe(R"(["window"])"); ipc_.signal_event.connect(sigc::mem_fun(*this, &Scratchpad::onEvent)); @@ -25,8 +29,23 @@ Scratchpad::Scratchpad(const std::string& id, const waybar::Bar& bar, const Json }); } auto Scratchpad::update() -> void { - label_.set_markup(fmt::format(format_, fmt::arg("count", count_))); - AModule::update(); + if (count_ || show_empty_) { + event_box_.show(); + label_.set_markup( + fmt::format(format_, fmt::arg("icon", getIcon(count_, "", config_["format-icons"].size())), + fmt::arg("count", count_))); + if (tooltip_enabled_) { + label_.set_tooltip_markup(tooltip_text_); + } + } else { + event_box_.hide(); + } + if (count_) { + label_.get_style_context()->remove_class("empty"); + } else { + label_.get_style_context()->add_class("empty"); + } + ALabel::update(); } auto Scratchpad::getTree() -> void { @@ -42,6 +61,17 @@ auto Scratchpad::onCmd(const struct Ipc::ipc_response& res) -> void { std::lock_guard lock(mutex_); auto tree = parser_.parse(res.payload); count_ = tree["nodes"][0]["nodes"][0]["floating_nodes"].size(); + if (tooltip_enabled_) { + tooltip_text_.clear(); + for (const auto& window : tree["nodes"][0]["nodes"][0]["floating_nodes"]) { + tooltip_text_.append(fmt::format(tooltip_format_ + '\n', + fmt::arg("app", window["app_id"].asString()), + fmt::arg("title", window["name"].asString()))); + } + if (!tooltip_text_.empty()) { + tooltip_text_.pop_back(); + } + } dp.emit(); } catch (const std::exception& e) { spdlog::error("Scratchpad: {}", e.what());