#pragma once #include #include #include #include "gtkmm/box.h" #include "gtkmm/label.h" extern "C" { #include } #include "ALabel.hpp" #include "util/sleeper_thread.hpp" namespace waybar::modules::mpris { class Mpris : public AModule { public: Mpris(const std::string&, const Json::Value&); ~Mpris(); auto update() -> void; bool handleToggle(GdkEventButton* const&); private: static auto onPlayerNameAppeared(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void; static auto onPlayerNameVanished(PlayerctlPlayerManager*, PlayerctlPlayerName*, gpointer) -> void; static auto onPlayerPlay(PlayerctlPlayer*, gpointer) -> void; static auto onPlayerPause(PlayerctlPlayer*, gpointer) -> void; static auto onPlayerStop(PlayerctlPlayer*, gpointer) -> void; static auto onPlayerMetadata(PlayerctlPlayer*, GVariant*, gpointer) -> void; struct PlayerInfo { std::string name; PlayerctlPlaybackStatus status; std::string status_string; std::optional artist; std::optional album; std::optional title; std::optional length; // as HH:MM:SS }; auto getPlayerInfo() -> std::optional; auto getIcon(const Json::Value&, const std::string&) -> std::string; Gtk::Box box_; Gtk::Label label_; // config std::string format_; std::string format_playing_; std::string format_paused_; std::string format_stopped_; std::chrono::seconds interval_; std::string player_; std::vector ignored_players_; PlayerctlPlayerManager* manager; PlayerctlPlayer* player; std::string lastStatus; std::string lastPlayer; util::SleeperThread thread_; }; } // namespace waybar::modules::mpris