power-profiles-daemon: preserve backward compatibility for driver
Keep the {driver} placeholder working and support older
power-profiles-daemon versions that only expose a single Driver DBus
property, while still reading the new CpuDriver/PlatformDriver fields.
- Read the legacy Driver property and fall back to it when CpuDriver or
PlatformDriver are missing (older daemon).
- Derive {driver} from CpuDriver when the daemon no longer exposes
Driver (recent daemon), so existing configs using {driver} keep
working.
- Align the default tooltip-format in the constructor with the
documented default.
This commit is contained in:
@@ -9,10 +9,18 @@ namespace waybar::modules {
|
|||||||
|
|
||||||
struct Profile {
|
struct Profile {
|
||||||
std::string name;
|
std::string name;
|
||||||
|
// Legacy driver field, kept for backward compatibility with the
|
||||||
|
// `{driver}` format placeholder and with older power-profiles-daemon
|
||||||
|
// versions that only expose a single `Driver` DBus property.
|
||||||
|
std::string driver;
|
||||||
std::string cpuDriver;
|
std::string cpuDriver;
|
||||||
std::string platformDriver;
|
std::string platformDriver;
|
||||||
|
|
||||||
Profile(std::string n, std::string cd, std::string pd) : name(std::move(n)), cpuDriver(std::move(cd)), platformDriver(std::move(pd)) {}
|
Profile(std::string n, std::string d, std::string cd, std::string pd)
|
||||||
|
: name(std::move(n)),
|
||||||
|
driver(std::move(d)),
|
||||||
|
cpuDriver(std::move(cd)),
|
||||||
|
platformDriver(std::move(pd)) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class PowerProfilesDaemon : public ALabel {
|
class PowerProfilesDaemon : public ALabel {
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ $XDG_CONFIG_HOME/waybar/config
|
|||||||
|[ *tooltip-format*
|
|[ *tooltip-format*
|
||||||
:[ string
|
:[ string
|
||||||
:[ "Power profile: {profile}\\nCPU driver: {cpu_driver}\\nPlatform driver: {platform_driver}"
|
:[ "Power profile: {profile}\\nCPU driver: {cpu_driver}\\nPlatform driver: {platform_driver}"
|
||||||
:[ Messaged displayed in the module tooltip. {icon} and {profile} are respectively substituted with the icon representing the active profile and its full name.
|
:[ Messaged displayed in the module tooltip. {icon} and {profile} are respectively substituted with the icon representing the active profile and its full name. {cpu_driver} and {platform_driver} are substituted with the CPU and platform drivers reported by recent power-profiles-daemon versions. {driver} is kept for backward compatibility: it resolves to the legacy single driver on older daemons and falls back to the CPU driver on recent ones.
|
||||||
|[ *tooltip*
|
|[ *tooltip*
|
||||||
:[ bool
|
:[ bool
|
||||||
:[ true
|
:[ true
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ PowerProfilesDaemon::PowerProfilesDaemon(const std::string& id, const Json::Valu
|
|||||||
if (config_["tooltip-format"].isString()) {
|
if (config_["tooltip-format"].isString()) {
|
||||||
tooltipFormat_ = config_["tooltip-format"].asString();
|
tooltipFormat_ = config_["tooltip-format"].asString();
|
||||||
} else {
|
} else {
|
||||||
tooltipFormat_ = "Power profile: {profile}\nCpuDriver: {cpu_driver}";
|
tooltipFormat_ =
|
||||||
|
"Power profile: {profile}\nCPU driver: {cpu_driver}\nPlatform driver: {platform_driver}";
|
||||||
}
|
}
|
||||||
// Fasten your seatbelt, we're up for quite a ride. The rest of the
|
// Fasten your seatbelt, we're up for quite a ride. The rest of the
|
||||||
// init is performed asynchronously. There's 2 callbacks involved.
|
// init is performed asynchronously. There's 2 callbacks involved.
|
||||||
@@ -95,11 +96,17 @@ void PowerProfilesDaemon::populateInitState() {
|
|||||||
powerProfilesProxy_->get_cached_property(profilesVariant, "Profiles");
|
powerProfilesProxy_->get_cached_property(profilesVariant, "Profiles");
|
||||||
for (auto& variantDict : profilesVariant.get()) {
|
for (auto& variantDict : profilesVariant.get()) {
|
||||||
Glib::ustring name;
|
Glib::ustring name;
|
||||||
|
// Legacy single `Driver` property, still exposed by older
|
||||||
|
// power-profiles-daemon versions.
|
||||||
|
Glib::ustring driver;
|
||||||
Glib::ustring cpuDriver;
|
Glib::ustring cpuDriver;
|
||||||
Glib::ustring platformDriver;
|
Glib::ustring platformDriver;
|
||||||
if (auto p = variantDict.find("Profile"); p != variantDict.end()) {
|
if (auto p = variantDict.find("Profile"); p != variantDict.end()) {
|
||||||
name = p->second.get();
|
name = p->second.get();
|
||||||
}
|
}
|
||||||
|
if (auto d = variantDict.find("Driver"); d != variantDict.end()) {
|
||||||
|
driver = d->second.get();
|
||||||
|
}
|
||||||
if (auto cd = variantDict.find("CpuDriver"); cd != variantDict.end()) {
|
if (auto cd = variantDict.find("CpuDriver"); cd != variantDict.end()) {
|
||||||
cpuDriver = cd->second.get();
|
cpuDriver = cd->second.get();
|
||||||
}
|
}
|
||||||
@@ -107,17 +114,33 @@ void PowerProfilesDaemon::populateInitState() {
|
|||||||
platformDriver = pd->second.get();
|
platformDriver = pd->second.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recent power-profiles-daemon versions split the single `Driver`
|
||||||
|
// property into `CpuDriver` and `PlatformDriver`. When talking to an
|
||||||
|
// older daemon that only exposes `Driver`, fall back to it so the new
|
||||||
|
// {cpu_driver}/{platform_driver} placeholders still resolve.
|
||||||
if (cpuDriver.empty()) {
|
if (cpuDriver.empty()) {
|
||||||
cpuDriver = "Unavailable";
|
cpuDriver = driver;
|
||||||
spdlog::warn("Cannot find power profiles daemon cpu driver.");
|
|
||||||
}
|
}
|
||||||
if (platformDriver.empty()) {
|
if (platformDriver.empty()) {
|
||||||
|
platformDriver = driver;
|
||||||
|
}
|
||||||
|
// Conversely, keep the legacy {driver} placeholder working against a
|
||||||
|
// recent daemon that no longer exposes `Driver` by deriving it from
|
||||||
|
// the CPU driver.
|
||||||
|
if (driver.empty()) {
|
||||||
|
driver = cpuDriver;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (driver.empty()) {
|
||||||
|
driver = "Unavailable";
|
||||||
|
cpuDriver = "Unavailable";
|
||||||
platformDriver = "Unavailable";
|
platformDriver = "Unavailable";
|
||||||
spdlog::warn("Cannot find power profiles daemon platform driver.");
|
spdlog::warn("Cannot find power profiles daemon driver.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name.empty()) {
|
if (!name.empty()) {
|
||||||
availableProfiles_.emplace_back(std::move(name), std::move(cpuDriver), std::move(platformDriver));
|
availableProfiles_.emplace_back(std::move(name), std::move(driver), std::move(cpuDriver),
|
||||||
|
std::move(platformDriver));
|
||||||
} else {
|
} else {
|
||||||
spdlog::error(
|
spdlog::error(
|
||||||
"Power profiles daemon: power-profiles-daemon sent us an empty power profile name. "
|
"Power profiles daemon: power-profiles-daemon sent us an empty power profile name. "
|
||||||
@@ -167,6 +190,8 @@ auto PowerProfilesDaemon::update() -> void {
|
|||||||
// Set label
|
// Set label
|
||||||
fmt::dynamic_format_arg_store<fmt::format_context> store;
|
fmt::dynamic_format_arg_store<fmt::format_context> store;
|
||||||
store.push_back(fmt::arg("profile", profile.name));
|
store.push_back(fmt::arg("profile", profile.name));
|
||||||
|
// Legacy placeholder, kept for backward compatibility with existing configs.
|
||||||
|
store.push_back(fmt::arg("driver", profile.driver));
|
||||||
store.push_back(fmt::arg("cpu_driver", profile.cpuDriver));
|
store.push_back(fmt::arg("cpu_driver", profile.cpuDriver));
|
||||||
store.push_back(fmt::arg("platform_driver", profile.platformDriver));
|
store.push_back(fmt::arg("platform_driver", profile.platformDriver));
|
||||||
store.push_back(fmt::arg("icon", getIcon(0, profile.name)));
|
store.push_back(fmt::arg("icon", getIcon(0, profile.name)));
|
||||||
|
|||||||
Reference in New Issue
Block a user