diff --git a/src/clock.cpp b/src/clock.cpp index 0c597b5e..cf620a43 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -106,9 +106,13 @@ void Clock::Update() if (Width > size_t(COLS) || Height > MainHeight) myPlaylist->SwitchTo(); - time_t rawtime; - time(&rawtime); - tm *time = localtime(&rawtime); + static time_t now = 0, past; + time(&past); + if (past <= now) + return; + time(&now); + + tm *time = localtime(&now); mask = 0; Set(time->tm_sec % 10, 0); @@ -160,6 +164,7 @@ void Clock::Update() } } } + w->Refresh(); } void Clock::Prepare() diff --git a/src/menu.h b/src/menu.h index 1331cb16..640ff068 100644 --- a/src/menu.h +++ b/src/menu.h @@ -466,6 +466,10 @@ namespace NCurses /// void HighlightColor(Color color) { itsHighlightColor = color; } + /// @return state of highlighting + /// + bool isHighlighted() { return highlightEnabled; } + /// Turns on/off highlighting /// @param state state of hihglighting /// diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index e2559dab..7e4945fe 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -166,7 +166,7 @@ int main(int argc, char *argv[]) Mpd.SetErrorHandler(NcmpcppErrorCallback, 0); // local variables - int input; + int input = 0; bool main_exit = 0; bool design_changed = 0; @@ -285,7 +285,8 @@ int main(int argc, char *argv[]) // header stuff end myScreen->Update(); - myScreen->RefreshWindow(); + if (input != ERR) + myScreen->RefreshWindow(); myScreen->ReadKey(input); if (input == ERR) diff --git a/src/playlist.cpp b/src/playlist.cpp index de61905a..860518fb 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -316,8 +316,6 @@ void Playlist::FixPositions(size_t beginning) void Playlist::EnableHighlighting() { Items->Highlighting(1); - if (w == Items) - Items->Refresh(); UpdateTimer(); } diff --git a/src/status.cpp b/src/status.cpp index 4b2c2060..3da7e30e 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -70,8 +70,10 @@ void StatusbarApplyFilterImmediately(const std::wstring &ws) { static std::wstring cmp; if (cmp != ws) + { myScreen->ApplyFilter(ToString((cmp = ws))); - myScreen->RefreshWindow(); + myScreen->RefreshWindow(); + } TraceMpdStatus(); } @@ -113,10 +115,7 @@ void TraceMpdStatus() static timeval past, now; gettimeofday(&now, 0); - if ((Mpd.Connected() - && (/*(now.tv_sec == past.tv_sec && now.tv_usec >= past.tv_usec+500000) || */now.tv_sec > past.tv_sec)) - || UpdateStatusImmediately - ) + if ((Mpd.Connected() && now.tv_sec > past.tv_sec) || UpdateStatusImmediately) { Mpd.UpdateStatus(); BlockItemListUpdate = 0; @@ -124,10 +123,15 @@ void TraceMpdStatus() UpdateStatusImmediately = 0; gettimeofday(&past, 0); } - wFooter->Refresh(); - if (myScreen == myPlaylist && now.tv_sec == myPlaylist->Timer()+Config.playlist_disable_highlight_delay) - myPlaylist->Items->Highlighting(!Config.playlist_disable_highlight_delay); + if (myScreen->ActiveWindow() == myPlaylist->Items + && now.tv_sec == myPlaylist->Timer()+Config.playlist_disable_highlight_delay + && myPlaylist->Items->isHighlighted() + && Config.playlist_disable_highlight_delay) + { + myPlaylist->Items->Highlighting(0); + myPlaylist->Items->Refresh(); + } if (lock_statusbar_delay > 0) { @@ -234,13 +238,6 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) myPlaylist->Items->at(pos).CopyPtr(0); (*it)->NullMe(); } - - if (myScreen == myPlaylist) - { - if (!playlist_length || myPlaylist->Items->Size() < myPlaylist->Items->GetHeight()) - myPlaylist->Items->Window::Clear(); - myPlaylist->Items->Refresh(); - } if (was_filtered) { myPlaylist->ApplyFilter(myPlaylist->Items->GetFilter()); @@ -253,9 +250,6 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) Playlist::ReloadTotalLength = 1; Playlist::ReloadRemaining = 1; - if (myScreen == myPlaylist) - RedrawHeader = 1; - if (myPlaylist->Items->Empty()) { myPlaylist->Items->Reset(); @@ -308,8 +302,7 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) } if (changed.PlayerState) { - PlayerState mpd_state = Mpd.GetState(); - switch (mpd_state) + switch (Mpd.GetState()) { case psUnknown: { @@ -351,8 +344,11 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) } if (Config.new_design) { - *wHeader << XY(0, 1) << fmtBold << player_state << fmtBoldEnd; - wHeader->Refresh(); + if (!myPlaylist->isPlaying()) + { + *wHeader << XY(0, 1) << fmtBold << player_state << fmtBoldEnd; + wHeader->Refresh(); + } } else if (!block_statusbar_update && Config.statusbar_visibility) { @@ -387,9 +383,6 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) playing_song_scroll_begin = 0; first_line_scroll_begin = 0; second_line_scroll_begin = 0; - - if (Mpd.GetState() == psPlay) - changed.ElapsedTime = 1; } static time_t now, past = 0; time(&now); @@ -624,11 +617,11 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *) *wHeader << clEnd; wHeader->Refresh(); } - if (myScreen->ActiveWindow() == myPlaylist->Items) - myPlaylist->Items->Refresh(); *wFooter << fmtBoldEnd; wFooter->GotoXY(sx, sy); wFooter->Refresh(); + if (changed.Playlist || changed.Database || changed.PlayerState || changed.SongID) + myScreen->RefreshWindow(); } Window &Statusbar()