From e1919599764b57dd1b1bbc3c16ef15604079ed8b Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 6 Jan 2017 02:10:41 +0100 Subject: [PATCH] Do mpd status update after every call to noidle if appropriate --- NEWS | 1 + src/mpdpp.cpp | 9 ++++++++- src/mpdpp.h | 4 ++++ src/ncmpcpp.cpp | 2 ++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 2e63906a..78e97be6 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ ncmpcpp-0.8 (????-??-??) * Format information can now be attached to selected color variables in the configuration file. Because of that variable 'progressbar_boldness' is now deprecated in favor of extended 'progressbar_color' and 'progressbar_elapsed_color' (for more information see example configuration file). * Lyrics and last_fm can now be startup screens and are lockable. * Action 'update_environment' now also synchronizes status with MPD. +* Fixed an issue that could cause some MPD events to be missed. ncmpcpp-0.7.7 (2016-10-31) * Fixed compilation on 32bit platforms. diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index bd806daa..177340ba 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -189,6 +189,11 @@ int Connection::noidle() return flags; } +void Connection::setNoidleCallback(NoidleCallback callback) +{ + m_noidle_callback = std::move(callback); +} + Statistics Connection::getStatistics() { prechecks(); @@ -846,7 +851,9 @@ void Connection::checkConnection() const void Connection::prechecks() { checkConnection(); - noidle(); + int flags = noidle(); + if (flags && m_noidle_callback) + m_noidle_callback(flags); } void Connection::prechecksNoCommandsList() diff --git a/src/mpdpp.h b/src/mpdpp.h index 0f85750e..bf1fcb9c 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -480,6 +480,8 @@ typedef Iterator StringIterator; struct Connection { + typedef std::function NoidleCallback; + Connection(); void Connect(); @@ -582,6 +584,7 @@ struct Connection void idle(); int noidle(); + void setNoidleCallback(NoidleCallback callback); private: struct ConnectionDeleter { @@ -595,6 +598,7 @@ private: void prechecksNoCommandsList(); void checkErrors() const; + NoidleCallback m_noidle_callback; std::unique_ptr m_connection; bool m_command_list_active; diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 552f15fa..6b609d7c 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -106,6 +106,8 @@ int main(int argc, char **argv) sigignore(SIGPIPE); signal(SIGWINCH, sighandler); + Mpd.setNoidleCallback(Status::update); + NC::initScreen(Config.colors_enabled, Config.mouse_support); Actions::OriginalStatusbarVisibility = Config.statusbar_visibility;