diff --git a/include/factory.hpp b/include/factory.hpp index 50b21a6e..f896d052 100644 --- a/include/factory.hpp +++ b/include/factory.hpp @@ -23,6 +23,7 @@ #ifdef HAVE_LIBPULSE #include "modules/pulseaudio.hpp" #endif +#include "modules/temperature.hpp" #include "modules/custom.hpp" namespace waybar { diff --git a/include/modules/temperature.hpp b/include/modules/temperature.hpp new file mode 100644 index 00000000..e4a2cf59 --- /dev/null +++ b/include/modules/temperature.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include "util/sleeper_thread.hpp" +#include "ALabel.hpp" + +namespace waybar::modules { + +class Temperature : public ALabel { + public: + Temperature(const std::string&, const Json::Value&); + ~Temperature() = default; + auto update() -> void; + private: + std::tuple getTemperature(); + bool isCritical(uint16_t); + + std::string file_path_; + waybar::util::SleeperThread thread_; +}; + +} \ No newline at end of file diff --git a/meson.build b/meson.build index daa37754..8faa063a 100644 --- a/meson.build +++ b/meson.build @@ -66,6 +66,7 @@ src_files = files( 'src/modules/custom.cpp', 'src/modules/cpu.cpp', 'src/modules/idle_inhibitor.cpp', + 'src/modules/temperature.cpp', 'src/main.cpp', 'src/bar.cpp', 'src/client.cpp' diff --git a/resources/config b/resources/config index 5ee2a36e..41225498 100644 --- a/resources/config +++ b/resources/config @@ -6,7 +6,7 @@ // Choose the order of the modules "modules-left": ["sway/workspaces", "sway/mode", "custom/spotify"], "modules-center": ["sway/window"], - "modules-right": ["idle_inhibitor", "pulseaudio", "network", "cpu", "memory", "backlight", "battery", "battery#bat2", "clock", "tray"], + "modules-right": ["idle_inhibitor", "pulseaudio", "network", "cpu", "memory", "temperature", "backlight", "battery", "battery#bat2", "clock", "tray"], // Modules configuration // "sway/workspaces": { // "disable-scroll": true, @@ -47,6 +47,13 @@ "memory": { "format": "{}% " }, + "temperature": { + // "thermal-zone": 2, + // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", + // "critical-threshold": 80, + // "format-critical": "{temperatureC}°C ", + "format": "{temperatureC}°C " + }, "backlight": { // "device": "acpi_video1", "format": "{percent}% {icon}", diff --git a/resources/style.css b/resources/style.css index c10f8510..b6528bf3 100644 --- a/resources/style.css +++ b/resources/style.css @@ -30,7 +30,7 @@ window#waybar { border-bottom: 3px solid white; } -#clock, #battery, #cpu, #memory, #backlight, #network, #pulseaudio, #custom-spotify, #tray, #mode, #idle_inhibitor { +#clock, #battery, #cpu, #memory, #temperature, #backlight, #network, #pulseaudio, #custom-spotify, #tray, #mode, #idle_inhibitor { padding: 0 10px; margin: 0 5px; } diff --git a/src/factory.cpp b/src/factory.cpp index 6a9a9de7..18eef10d 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -56,6 +56,9 @@ waybar::IModule* waybar::Factory::makeModule(const std::string &name) const return new waybar::modules::Pulseaudio(id, config_[name]); } #endif + if (ref == "temperature") { + return new waybar::modules::Temperature(id, config_[name]); + } if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) { return new waybar::modules::Custom(ref.substr(7), config_[name]); } diff --git a/src/modules/temperature.cpp b/src/modules/temperature.cpp new file mode 100644 index 00000000..3fc66b99 --- /dev/null +++ b/src/modules/temperature.cpp @@ -0,0 +1,60 @@ +#include "modules/temperature.hpp" + +waybar::modules::Temperature::Temperature(const std::string& id, const Json::Value& config) + : ALabel(config, "{temperatureC}°C", 10) +{ + if (config_["hwmon-path"].isString()) { + file_path_ = config_["hwmon-path"].asString(); + } else { + auto zone = + config_["thermal-zone"].isInt() ? config_["thermal-zone"].asInt() : 1; + file_path_ = fmt::format("/sys/class/thermal/thermal_zone{}/temp", zone); + } + + label_.set_name("temperature"); + if (!id.empty()) { + label_.get_style_context()->add_class(id); + } + thread_ = [this] { + dp.emit(); + thread_.sleep_for(interval_); + }; +} + +auto waybar::modules::Temperature::update() -> void +{ + auto [temperature_c, temperature_f] = getTemperature(); + auto critical = isCritical(temperature_c); + auto format = format_; + if (critical) { + format = + config_["format-critical"].isString() ? config_["format-critical"].asString() : format; + label_.get_style_context()->add_class("critical"); + } else { + label_.get_style_context()->remove_class("critical"); + } + label_.set_markup(fmt::format(format, + fmt::arg("temperatureC", temperature_c), fmt::arg("temperatureF", temperature_f))); +} + +std::tuple waybar::modules::Temperature::getTemperature() +{ + std::ifstream temp(file_path_); + if (!temp.is_open()) { + throw std::runtime_error("Can't open " + file_path_); + } + std::string line; + if (temp.good()) { + getline(temp, line); + } + temp.close(); + auto temperature_c = std::strtol(line.c_str(), nullptr, 10) / 1000.0; + auto temperature_f = temperature_c * 1.8 + 32; + std::tuple temperatures(std::round(temperature_c), std::round(temperature_f)); + return temperatures; +} + +bool waybar::modules::Temperature::isCritical(uint16_t temperature_c) +{ + return config_["critical-threshold"].isInt() && temperature_c >= config_["critical-threshold"].asInt(); +} \ No newline at end of file