feat(mpd): Add support for options (random, repeat, etc.)
parent
cbfcec4867
commit
07dab2baec
|
@ -15,6 +15,7 @@ class MPD : public ALabel {
|
|||
std::thread worker();
|
||||
void setLabel();
|
||||
std::string getStateIcon();
|
||||
std::string getOptionIcon(std::string optionName, bool activated);
|
||||
|
||||
void tryConnect();
|
||||
void checkErrors();
|
||||
|
@ -26,7 +27,7 @@ class MPD : public ALabel {
|
|||
|
||||
using unique_connection = std::unique_ptr<mpd_connection, decltype(&mpd_connection_free)>;
|
||||
using unique_status = std::unique_ptr<mpd_status, decltype(&mpd_status_free)>;
|
||||
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
|
||||
using unique_song = std::unique_ptr<mpd_song, decltype(&mpd_song_free)>;
|
||||
|
||||
// Not using unique_ptr since we don't manage the pointer
|
||||
// (It's either nullptr, or from the config)
|
||||
|
|
|
@ -94,6 +94,15 @@ void waybar::modules::MPD::setLabel() {
|
|||
date = mpd_song_get_tag(song_.get(), MPD_TAG_DATE, 0);
|
||||
}
|
||||
|
||||
bool consumeActivated = mpd_status_get_consume(status_.get());
|
||||
std::string consumeIcon = getOptionIcon("consume", consumeActivated);
|
||||
bool randomActivated = mpd_status_get_random(status_.get());
|
||||
std::string randomIcon = getOptionIcon("random", randomActivated);
|
||||
bool repeatActivated = mpd_status_get_repeat(status_.get());
|
||||
std::string repeatIcon = getOptionIcon("repeat", repeatActivated);
|
||||
bool singleActivated = mpd_status_get_single(status_.get());
|
||||
std::string singleIcon = getOptionIcon("single", singleActivated);
|
||||
|
||||
// TODO: format can fail
|
||||
label_.set_markup(fmt::format(format,
|
||||
fmt::arg("artist", artist),
|
||||
|
@ -101,7 +110,11 @@ void waybar::modules::MPD::setLabel() {
|
|||
fmt::arg("album", album),
|
||||
fmt::arg("title", title),
|
||||
fmt::arg("date", date),
|
||||
fmt::arg("stateIcon", stateIcon)));
|
||||
fmt::arg("stateIcon", stateIcon),
|
||||
fmt::arg("consumeIcon", consumeIcon),
|
||||
fmt::arg("randomIcon", randomIcon),
|
||||
fmt::arg("repeatIcon", repeatIcon),
|
||||
fmt::arg("singleIcon", singleIcon)));
|
||||
|
||||
if (tooltipEnabled()) {
|
||||
std::string tooltip_format;
|
||||
|
@ -113,14 +126,17 @@ void waybar::modules::MPD::setLabel() {
|
|||
fmt::arg("album", album),
|
||||
fmt::arg("title", title),
|
||||
fmt::arg("date", date),
|
||||
fmt::arg("stateIcon", stateIcon));
|
||||
fmt::arg("stateIcon", stateIcon),
|
||||
fmt::arg("consumeIcon", consumeIcon),
|
||||
fmt::arg("randomIcon", randomIcon),
|
||||
fmt::arg("repeatIcon", repeatIcon),
|
||||
fmt::arg("singleIcon", singleIcon));
|
||||
label_.set_tooltip_text(tooltip_text);
|
||||
}
|
||||
}
|
||||
|
||||
std::string waybar::modules::MPD::getStateIcon() {
|
||||
if (!config_["state-icons"].isObject()) {
|
||||
std::cerr << "No state icons defined" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
|
@ -142,6 +158,23 @@ std::string waybar::modules::MPD::getStateIcon() {
|
|||
}
|
||||
}
|
||||
|
||||
std::string waybar::modules::MPD::getOptionIcon(std::string optionName, bool activated) {
|
||||
if (!config_[optionName + "-icons"].isObject()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (connection_ == nullptr) {
|
||||
std::cerr << "MPD: Trying to fetch option icon while disconnected" << std::endl;
|
||||
return "";
|
||||
}
|
||||
|
||||
if (activated) {
|
||||
return config_[optionName + "-icons"]["on"].asString();
|
||||
} else {
|
||||
return config_[optionName + "-icons"]["off"].asString();
|
||||
}
|
||||
}
|
||||
|
||||
void waybar::modules::MPD::tryConnect() {
|
||||
if (connection_ != nullptr) {
|
||||
return;
|
||||
|
@ -190,14 +223,13 @@ void waybar::modules::MPD::fetchState() {
|
|||
checkErrors();
|
||||
stopped_ = state_ == MPD_STATE_UNKNOWN || state_ == MPD_STATE_STOP;
|
||||
|
||||
mpd_send_current_song(connection_.get());
|
||||
song_ = unique_song(mpd_recv_song(connection_.get()), &mpd_song_free);
|
||||
mpd_response_finish(connection_.get());
|
||||
song_ = unique_song(mpd_run_current_song(connection_.get()), &mpd_song_free);
|
||||
checkErrors();
|
||||
}
|
||||
|
||||
void waybar::modules::MPD::waitForEvent() {
|
||||
auto conn = connection_.get();
|
||||
mpd_run_idle_mask(conn, MPD_IDLE_PLAYER /* | MPD_IDLE_OPTIONS */);
|
||||
// Wait for a player (play/pause), option (random, shuffle, etc.), or playlist change
|
||||
mpd_run_idle_mask(conn, static_cast<mpd_idle>(MPD_IDLE_PLAYER | MPD_IDLE_OPTIONS | MPD_IDLE_PLAYLIST));
|
||||
checkErrors();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue