[wireplumber] Add support for device.form-factor
This commit is contained in:
@@ -33,6 +33,7 @@ class Wireplumber : public ALabel {
|
|||||||
static void onDefaultNodesApiChanged(waybar::modules::Wireplumber* self);
|
static void onDefaultNodesApiChanged(waybar::modules::Wireplumber* self);
|
||||||
|
|
||||||
bool handleScroll(GdkEventScroll* e) override;
|
bool handleScroll(GdkEventScroll* e) override;
|
||||||
|
std::vector<std::string> getWPIcon();
|
||||||
|
|
||||||
static std::list<waybar::modules::Wireplumber*> modules;
|
static std::list<waybar::modules::Wireplumber*> modules;
|
||||||
|
|
||||||
@@ -54,6 +55,7 @@ class Wireplumber : public ALabel {
|
|||||||
bool source_muted_;
|
bool source_muted_;
|
||||||
double source_volume_;
|
double source_volume_;
|
||||||
gchar* default_source_name_;
|
gchar* default_source_name_;
|
||||||
|
std::string form_factor_;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace waybar::modules
|
} // namespace waybar::modules
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ waybar::modules::Wireplumber::Wireplumber(const std::string& id, const Json::Val
|
|||||||
source_node_id_(0),
|
source_node_id_(0),
|
||||||
source_muted_(false),
|
source_muted_(false),
|
||||||
source_volume_(0.0),
|
source_volume_(0.0),
|
||||||
default_source_name_(nullptr) {
|
default_source_name_(nullptr),
|
||||||
|
form_factor_("") {
|
||||||
waybar::modules::Wireplumber::modules.push_back(this);
|
waybar::modules::Wireplumber::modules.push_back(this);
|
||||||
|
|
||||||
wp_init(WP_INIT_PIPEWIRE);
|
wp_init(WP_INIT_PIPEWIRE);
|
||||||
@@ -97,6 +98,36 @@ void waybar::modules::Wireplumber::updateNodeName(waybar::modules::Wireplumber*
|
|||||||
: description != nullptr ? description
|
: description != nullptr ? description
|
||||||
: "Unknown node name";
|
: "Unknown node name";
|
||||||
spdlog::debug("[{}]: Updating '{}' node name to: {}", self->name_, self->type_, self->node_name_);
|
spdlog::debug("[{}]: Updating '{}' node name to: {}", self->name_, self->type_, self->node_name_);
|
||||||
|
|
||||||
|
// find form-factor only if sink
|
||||||
|
if (g_strcmp0(self->type_, "Audio/Sink") == 0) {
|
||||||
|
const auto* devid = wp_properties_get(properties, "device.id");
|
||||||
|
spdlog::debug("[{}]: '{}' device.id is {}", self->name_, self->type_, devid);
|
||||||
|
|
||||||
|
auto* devproxy = static_cast<WpProxy*>(
|
||||||
|
wp_object_manager_lookup(self->om_, WP_TYPE_GLOBAL_PROXY, WP_CONSTRAINT_TYPE_G_PROPERTY,
|
||||||
|
"bound-id", "=s", devid, nullptr));
|
||||||
|
|
||||||
|
if (devproxy == nullptr) {
|
||||||
|
auto err = fmt::format("Object '{}' not found\n", devid);
|
||||||
|
spdlog::error("[{}]: {}", self->name_, err);
|
||||||
|
throw std::runtime_error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_autoptr(WpProperties) devprop =
|
||||||
|
WP_IS_PIPEWIRE_OBJECT(devproxy) != 0
|
||||||
|
? wp_pipewire_object_get_properties(WP_PIPEWIRE_OBJECT(devproxy))
|
||||||
|
: wp_properties_new_empty();
|
||||||
|
devprop = wp_properties_ensure_unique_owner(devprop);
|
||||||
|
|
||||||
|
if (const auto* ff =
|
||||||
|
wp_pipewire_object_get_property(WP_PIPEWIRE_OBJECT(devproxy), "device.form-factor")) {
|
||||||
|
self->form_factor_ = ff;
|
||||||
|
spdlog::debug("[{}]: Updating node form factor to: {}", self->name_, self->form_factor_);
|
||||||
|
} else {
|
||||||
|
self->form_factor_ = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::modules::Wireplumber::updateSourceName(waybar::modules::Wireplumber* self,
|
void waybar::modules::Wireplumber::updateSourceName(waybar::modules::Wireplumber* self,
|
||||||
@@ -358,6 +389,8 @@ void waybar::modules::Wireplumber::prepare(waybar::modules::Wireplumber* self) {
|
|||||||
"=s", self->type_, nullptr);
|
"=s", self->type_, nullptr);
|
||||||
wp_object_manager_add_interest(om_, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY, "media.class",
|
wp_object_manager_add_interest(om_, WP_TYPE_NODE, WP_CONSTRAINT_TYPE_PW_PROPERTY, "media.class",
|
||||||
"=s", "Audio/Source", nullptr);
|
"=s", "Audio/Source", nullptr);
|
||||||
|
wp_object_manager_add_interest(om_, WP_TYPE_DEVICE, WP_CONSTRAINT_TYPE_PW_PROPERTY, "media.class",
|
||||||
|
"=s", "Audio/Device", nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void waybar::modules::Wireplumber::onDefaultNodesApiLoaded(WpObject* p, GAsyncResult* res,
|
void waybar::modules::Wireplumber::onDefaultNodesApiLoaded(WpObject* p, GAsyncResult* res,
|
||||||
@@ -415,6 +448,33 @@ void waybar::modules::Wireplumber::asyncLoadRequiredApiModules() {
|
|||||||
this);
|
this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const std::array<std::string, 7> ports = {
|
||||||
|
"headphone", "speaker", "headset", "hands-free", "portable", "car", "hifi",
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<std::string> waybar::modules::Wireplumber::getWPIcon() {
|
||||||
|
std::vector<std::string> res;
|
||||||
|
if (muted_) {
|
||||||
|
res.emplace_back(node_name_ + "-muted");
|
||||||
|
}
|
||||||
|
res.push_back(node_name_);
|
||||||
|
res.push_back(source_name_);
|
||||||
|
std::transform(form_factor_.begin(), form_factor_.end(), form_factor_.begin(), ::tolower);
|
||||||
|
for (auto const& port : ports) {
|
||||||
|
if (form_factor_.find(port) != std::string::npos) {
|
||||||
|
if (muted_) {
|
||||||
|
res.emplace_back(port + "-muted");
|
||||||
|
}
|
||||||
|
res.push_back(port);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (muted_) {
|
||||||
|
res.emplace_back("default-muted");
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
auto waybar::modules::Wireplumber::update() -> void {
|
auto waybar::modules::Wireplumber::update() -> void {
|
||||||
auto format = format_;
|
auto format = format_;
|
||||||
std::string tooltipFormat;
|
std::string tooltipFormat;
|
||||||
@@ -485,10 +545,10 @@ auto waybar::modules::Wireplumber::update() -> void {
|
|||||||
std::string formatted_source =
|
std::string formatted_source =
|
||||||
fmt::format(fmt::runtime(format_source), fmt::arg("volume", source_vol));
|
fmt::format(fmt::runtime(format_source), fmt::arg("volume", source_vol));
|
||||||
|
|
||||||
std::string markup =
|
std::string markup = fmt::format(
|
||||||
fmt::format(fmt::runtime(format), fmt::arg("node_name", node_name_), fmt::arg("volume", vol),
|
fmt::runtime(format), fmt::arg("node_name", node_name_), fmt::arg("volume", vol),
|
||||||
fmt::arg("icon", getIcon(vol)), fmt::arg("format_source", formatted_source),
|
fmt::arg("icon", getIcon(vol, getWPIcon())), fmt::arg("format_source", formatted_source),
|
||||||
fmt::arg("source_volume", source_vol), fmt::arg("source_desc", source_name_));
|
fmt::arg("source_volume", source_vol), fmt::arg("source_desc", source_name_));
|
||||||
label_.set_markup(markup);
|
label_.set_markup(markup);
|
||||||
|
|
||||||
if (tooltipEnabled()) {
|
if (tooltipEnabled()) {
|
||||||
@@ -499,7 +559,7 @@ auto waybar::modules::Wireplumber::update() -> void {
|
|||||||
if (!tooltipFormat.empty()) {
|
if (!tooltipFormat.empty()) {
|
||||||
label_.set_tooltip_text(fmt::format(
|
label_.set_tooltip_text(fmt::format(
|
||||||
fmt::runtime(tooltipFormat), fmt::arg("node_name", node_name_), fmt::arg("volume", vol),
|
fmt::runtime(tooltipFormat), fmt::arg("node_name", node_name_), fmt::arg("volume", vol),
|
||||||
fmt::arg("icon", getIcon(vol)), fmt::arg("format_source", formatted_source),
|
fmt::arg("icon", getIcon(vol, getWPIcon())), fmt::arg("format_source", formatted_source),
|
||||||
fmt::arg("source_volume", source_vol), fmt::arg("source_desc", source_name_)));
|
fmt::arg("source_volume", source_vol), fmt::arg("source_desc", source_name_)));
|
||||||
} else {
|
} else {
|
||||||
label_.set_tooltip_text(node_name_);
|
label_.set_tooltip_text(node_name_);
|
||||||
|
|||||||
Reference in New Issue
Block a user