#pragma once #include #include #include #include #include "AIconLabel.hpp" namespace waybar::modules { class UPower final : public AIconLabel { public: UPower(const std::string&, const Json::Value&); virtual ~UPower(); auto update() -> void override; private: const std::string NO_BATTERY{"battery-missing-symbolic"}; // Config bool showIcon_{true}; bool hideIfEmpty_{true}; int iconSize_{20}; int tooltip_spacing_{4}; int tooltip_padding_{4}; Gtk::Box contentBox_; // tooltip box std::string tooltipFormat_; // UPower device info struct upDevice_output { UpDevice* upDevice{NULL}; double percentage{0.0}; double temperature{0.0}; guint64 time_full{0u}; guint64 time_empty{0u}; gchar* icon_name{(char*)'\0'}; bool upDeviceValid{false}; UpDeviceState state; UpDeviceKind kind; char* nativePath{(char*)'\0'}; char* model{(char*)'\0'}; }; // Technical variables std::string nativePath_; std::string model_; std::string lastStatus_; Glib::ustring label_markup_; std::mutex mutex_; Glib::RefPtr gtkTheme_; bool sleeping_; // Technical functions void addDevice(UpDevice*); void removeDevice(const gchar*); void removeDevices(); void resetDevices(); void setDisplayDevice(); const Glib::ustring getText(const upDevice_output& upDevice_, const std::string& format); bool queryTooltipCb(int, int, bool, const Glib::RefPtr&); // DBUS variables guint watcherID_; Glib::RefPtr conn_; guint subscrID_{0u}; // UPower variables UpClient* upClient_; upDevice_output upDevice_; // Device to display typedef std::unordered_map Devices; Devices devices_; bool upRunning_{true}; // DBus callbacks void getConn_cb(Glib::RefPtr& result); void onAppear(const Glib::RefPtr&, const Glib::ustring&, const Glib::ustring&); void onVanished(const Glib::RefPtr&, const Glib::ustring&); void prepareForSleep_cb(const Glib::RefPtr& connection, const Glib::ustring& sender_name, const Glib::ustring& object_path, const Glib::ustring& interface_name, const Glib::ustring& signal_name, const Glib::VariantContainerBase& parameters); // UPower callbacks static void deviceAdded_cb(UpClient* client, UpDevice* device, gpointer data); static void deviceRemoved_cb(UpClient* client, const gchar* objectPath, gpointer data); static void deviceNotify_cb(UpDevice* device, GParamSpec* pspec, gpointer user_data); // UPower secondary functions void getUpDeviceInfo(upDevice_output& upDevice_); }; } // namespace waybar::modules