diff --git a/include/ALabel.hpp b/include/ALabel.hpp index 839c5175..4063171f 100644 --- a/include/ALabel.hpp +++ b/include/ALabel.hpp @@ -10,7 +10,7 @@ class ALabel : public IModule { ALabel(const Json::Value&, const std::string format); virtual ~ALabel() = default; virtual auto update() -> void; - virtual std::string getIcon(uint16_t percentage); + virtual std::string getIcon(uint16_t, const std::string& alt = ""); virtual operator Gtk::Widget &(); protected: Gtk::EventBox event_box_; diff --git a/include/modules/pulseaudio.hpp b/include/modules/pulseaudio.hpp index 7ade2216..77f388a4 100644 --- a/include/modules/pulseaudio.hpp +++ b/include/modules/pulseaudio.hpp @@ -19,12 +19,15 @@ class Pulseaudio : public ALabel { static void sinkInfoCb(pa_context*, const pa_sink_info*, int, void*); static void serverInfoCb(pa_context*, const pa_server_info*, void*); + const std::string getPortIcon() const; + pa_threaded_mainloop* mainloop_; pa_mainloop_api* mainloop_api_; pa_context* context_; uint32_t sink_idx_{0}; uint16_t volume_; bool muted_; + std::string port_name_; std::string desc_; }; diff --git a/resources/config b/resources/config index d5a7cf37..a1d2f53a 100644 --- a/resources/config +++ b/resources/config @@ -44,7 +44,11 @@ "pulseaudio": { "format": "{volume}% {icon}", "format-muted": "", - "format-icons": ["", ""] + "format-icons": { + "headphones": "", + "handsfree": "", + "default": ["", ""] + } }, "custom/spotify": { "format": " {}", diff --git a/src/ALabel.cpp b/src/ALabel.cpp index d64b5724..0e6bbee5 100644 --- a/src/ALabel.cpp +++ b/src/ALabel.cpp @@ -36,14 +36,25 @@ bool waybar::ALabel::handleToggle(GdkEventButton* const& ev) return true; } -std::string waybar::ALabel::getIcon(uint16_t percentage) +std::string waybar::ALabel::getIcon(uint16_t percentage, const std::string& alt) { - if (!config_["format-icons"] || !config_["format-icons"].isArray()) { - return ""; + auto format_icons = config_["format-icons"]; + if (format_icons.isObject()) { + if (!alt.empty() && format_icons[alt]) { + format_icons = format_icons[alt]; + } else { + format_icons = format_icons["default"]; + } } - auto size = config_["format-icons"].size(); - auto idx = std::clamp(percentage / (100 / size), 0U, size - 1); - return config_["format-icons"][idx].asString(); + if (format_icons.isArray()) { + auto size = format_icons.size(); + auto idx = std::clamp(percentage / (100 / size), 0U, size - 1); + format_icons = format_icons[idx]; + } + if (format_icons.isString()) { + return format_icons.asString(); + } + return ""; } waybar::ALabel::operator Gtk::Widget &() { diff --git a/src/modules/pulseaudio.cpp b/src/modules/pulseaudio.cpp index 5d360be7..4d41fd56 100644 --- a/src/modules/pulseaudio.cpp +++ b/src/modules/pulseaudio.cpp @@ -89,6 +89,7 @@ void waybar::modules::Pulseaudio::sinkInfoCb(pa_context* /*context*/, pa->volume_ = volume * 100.0f; pa->muted_ = i->mute != 0; pa->desc_ = i->description; + pa->port_name_ = i->active_port->name; pa->dp.emit(); } } @@ -104,6 +105,27 @@ void waybar::modules::Pulseaudio::serverInfoCb(pa_context *context, sinkInfoCb, data); } +const std::string waybar::modules::Pulseaudio::getPortIcon() const +{ + std::vector ports = { + "headphones", + "speaker", + "hdmi", + "headset", + "handsfree", + "portable", + "car", + "hifi", + "phone", + }; + for (auto port : ports) { + if (port_name_.find(port) != std::string::npos) { + return port; + } + } + return ""; +} + auto waybar::modules::Pulseaudio::update() -> void { auto format = format_; @@ -111,11 +133,16 @@ auto waybar::modules::Pulseaudio::update() -> void format = config_["format-muted"] ? config_["format-muted"].asString() : format; label_.get_style_context()->add_class("muted"); + } else if (port_name_.find("a2dp_sink") != std::string::npos) { + format = config_["format-bluetooth"] + ? config_["format-bluetooth"].asString() : format; + label_.get_style_context()->add_class("bluetooth"); } else { label_.get_style_context()->remove_class("muted"); + label_.get_style_context()->add_class("bluetooth"); } label_.set_label(fmt::format(format, fmt::arg("volume", volume_), - fmt::arg("icon", getIcon(volume_)))); + fmt::arg("icon", getIcon(volume_, getPortIcon())))); label_.set_tooltip_text(desc_); }