diff --git a/doc/config b/doc/config index d079c221..c1a03ad7 100644 --- a/doc/config +++ b/doc/config @@ -124,8 +124,6 @@ # #autocenter_mode = "no" # -#repeat_one_mode = "no" -# #default_place_to_search_in = "database" (database/playlist) # #media_library_left_column = "a" (possible values: a,y,g,c,p, legend above) diff --git a/doc/keys b/doc/keys index 3a61452d..b403272d 100644 --- a/doc/keys +++ b/doc/keys @@ -70,10 +70,10 @@ # #key_toggle_repeat = 'r' # -#key_toggle_repeat_one = 'R' -# #key_toggle_random = 'z' # +#key_toggle_single = 'y' +# #key_shuffle = 'Z' # #key_toggle_crossfade = 'x' @@ -136,8 +136,6 @@ # #key_go_to_containing_directory = 'G' # -#key_start_searching = 'y' -# #key_go_to_parent_dir = 263 127 # #key_switch_tag_type_list = '`' diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 62ce5da8..4a825975 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -144,9 +144,6 @@ If enabled, statusbar will be displayed, otherwise hidden. .B autocenter_mode = yes/no Default state for autocenter mode at start. .TP -.B repeat_one_mode = yes/no -Default state for "repeat one" mode at start. -.TP .B default_find_mode = wrapped/normal If set to "wrapped", going from last found position to next will take you to the first one (same goes for the first position and going to previous one), otherwise no actions will be performed. .TP diff --git a/src/help.cpp b/src/help.cpp index 2dd43c2d..2bdea736 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -161,8 +161,8 @@ void Help::GetKeybindings() *w << DisplayKeys(Key.AddSelected) << "Add selected items to playlist/m3u file\n\n"; *w << DisplayKeys(Key.ToggleRepeat) << "Toggle repeat mode\n"; - *w << DisplayKeys(Key.ToggleRepeatOne) << "Toggle \"repeat one\" mode\n"; *w << DisplayKeys(Key.ToggleRandom) << "Toggle random mode\n"; + *w << DisplayKeys(Key.ToggleSingle) << "Toggle single mode\n"; *w << DisplayKeys(Key.Shuffle) << "Shuffle playlist\n"; *w << DisplayKeys(Key.ToggleCrossfade) << "Toggle crossfade mode\n"; *w << DisplayKeys(Key.SetCrossfade) << "Set crossfade\n"; @@ -202,7 +202,6 @@ void Help::GetKeybindings() *w << DisplayKeys(Key.SavePlaylist) << "Save playlist\n"; *w << DisplayKeys(Key.SortPlaylist) << "Sort/reverse playlist\n"; *w << DisplayKeys(Key.GoToNowPlaying) << "Go to currently playing position\n"; - *w << DisplayKeys(Key.StartSearching) << "Toggle \"stop playing after current song\" option\n"; *w << DisplayKeys(Key.ToggleAutoCenter) << "Toggle auto center mode\n\n\n"; *w << " " << fmtBold << "Keys - Browse screen\n -----------------------------------------\n" << fmtBoldEnd; @@ -218,7 +217,7 @@ void Help::GetKeybindings() *w << " " << fmtBold << "Keys - Search engine\n -----------------------------------------\n" << fmtBoldEnd; *w << DisplayKeys(Key.Enter) << "Add item to playlist and play/change option\n"; *w << DisplayKeys(Key.Space) << "Add item to playlist\n"; - *w << DisplayKeys(Key.StartSearching) << "Start searching immediately\n\n\n"; + *w << DisplayKeys(Key.ToggleSingle) << "Start searching immediately\n\n\n"; *w << " " << fmtBold << "Keys - Media library\n -----------------------------------------\n" << fmtBoldEnd; diff --git a/src/libmpdclient.c b/src/libmpdclient.c index f78b70c7..a0593599 100644 --- a/src/libmpdclient.c +++ b/src/libmpdclient.c @@ -739,6 +739,7 @@ mpd_Status * mpd_getStatus(mpd_Connection * connection) { status->volume = -1; status->repeat = 0; status->random = 0; + status->single = 0; status->playlist = -1; status->playlistLength = -1; status->state = -1; @@ -769,6 +770,9 @@ mpd_Status * mpd_getStatus(mpd_Connection * connection) { else if(strcmp(re->name,"random")==0) { status->random = atoi(re->value); } + else if(strcmp(re->name,"single")==0) { + status->single = atoi(re->value); + } else if(strcmp(re->name,"playlist")==0) { status->playlist = strtol(re->value,NULL,10); } @@ -1692,6 +1696,14 @@ void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode) { free(string); } +void mpd_sendSingleCommand(mpd_Connection * connection, int singleMode) { + int len = strlen("single")+2+INTLEN+3; + char *string = malloc(len); + snprintf(string, len, "single \"%i\"\n", singleMode); + mpd_executeCommand(connection,string); + free(string); +} + void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange) { int len = strlen("setvol")+2+INTLEN+3; char *string = malloc(len); diff --git a/src/libmpdclient.h b/src/libmpdclient.h index c9bbafec..d1266d14 100644 --- a/src/libmpdclient.h +++ b/src/libmpdclient.h @@ -173,6 +173,8 @@ typedef struct mpd_Status { int repeat; /* 1 if random is on, 0 otherwise */ int random; + /* 1 if single mode is on, 0 otherwise */ + int single; /* playlist length */ int playlistLength; /* playlist, use this to determine when the playlist has changed */ @@ -520,6 +522,8 @@ void mpd_sendRepeatCommand(mpd_Connection * connection, int repeatMode); void mpd_sendRandomCommand(mpd_Connection * connection, int randomMode); +void mpd_sendSingleCommand(mpd_Connection * connection, int singleMode); + void mpd_sendSetvolCommand(mpd_Connection * connection, int volumeChange); /* WARNING: don't use volume command, its depreacted */ diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index 8081b606..5069e277 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -164,6 +164,7 @@ void Connection::UpdateStatus() itsChanges.Crossfade = 1; itsChanges.Random = 1; itsChanges.Repeat = 1; + itsChanges.Single = 1; itsChanges.PlayerState = 1; itsChanges.StatusFlags = 1; } @@ -178,8 +179,9 @@ void Connection::UpdateStatus() itsChanges.Crossfade = itsOldStatus->crossfade != itsCurrentStatus->crossfade; itsChanges.Random = itsOldStatus->random != itsCurrentStatus->random; itsChanges.Repeat = itsOldStatus->repeat != itsCurrentStatus->repeat; + itsChanges.Single = itsOldStatus->single != itsCurrentStatus->single; itsChanges.PlayerState = itsOldStatus->state != itsCurrentStatus->state; - itsChanges.StatusFlags = itsChanges.Repeat || itsChanges.Random || itsChanges.Crossfade || itsChanges.DBUpdating; + itsChanges.StatusFlags = itsChanges.Repeat || itsChanges.Random || itsChanges.Single || itsChanges.Crossfade || itsChanges.DBUpdating; } itsUpdater(this, itsChanges, itsErrorHandlerUserdata); } @@ -482,6 +484,16 @@ void Connection::SetRandom(bool mode) const } } +void Connection::SetSingle(bool mode) const +{ + if (isConnected) + { + mpd_sendSingleCommand(itsConnection, mode); + if (!isCommandsListEnabled) + mpd_finishCommand(itsConnection); + } +} + void Connection::SetVolume(int vol) { if (isConnected) diff --git a/src/mpdpp.h b/src/mpdpp.h index e76c48f1..8710de71 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -48,7 +48,7 @@ namespace MPD struct StatusChanges { - StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), PlayerState(0), StatusFlags(0) { } + StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), Single(0), PlayerState(0), StatusFlags(0) { } bool Playlist:1; bool SongID:1; bool Database:1; @@ -58,6 +58,7 @@ namespace MPD bool Crossfade:1; bool Random:1; bool Repeat:1; + bool Single:1; bool PlayerState:1; bool StatusFlags:1; }; @@ -116,6 +117,7 @@ namespace MPD PlayerState GetState() const { return isConnected && itsCurrentStatus ? (PlayerState)itsCurrentStatus->state : psUnknown; } bool GetRepeat() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->repeat : 0; } bool GetRandom() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->random : 0; } + bool GetSingle() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->single : 0; } bool GetDBIsUpdating() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->updatingDb : 0; } int GetVolume() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->volume : -1; } int GetCrossfade() const { return isConnected && itsCurrentStatus ? itsCurrentStatus->crossfade : -1; } @@ -137,6 +139,7 @@ namespace MPD void SetRepeat(bool) const; void SetRandom(bool) const; + void SetSingle(bool) const; void SetCrossfade(int) const; void SetVolume(int); diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 433c668c..3f2da1ac 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -1080,11 +1080,6 @@ int main(int argc, char *argv[]) Mpd->SetRepeat(!Mpd->GetRepeat()); Mpd->UpdateStatus(); } - else if (Keypressed(input, Key.ToggleRepeatOne)) - { - Config.repeat_one_mode = !Config.repeat_one_mode; - ShowMessage("'Repeat one' mode: %s", Config.repeat_one_mode ? "On" : "Off"); - } else if (Keypressed(input, Key.Shuffle)) { Mpd->Shuffle(); @@ -1095,6 +1090,22 @@ int main(int argc, char *argv[]) Mpd->SetRandom(!Mpd->GetRandom()); Mpd->UpdateStatus(); } + else if (Keypressed(input, Key.ToggleSingle)) + { + if (myScreen == mySearcher && !mySearcher->Main()->isStatic(0)) + { + mySearcher->Main()->Highlight(SearchEngine::SearchButton); + mySearcher->Main()->Highlighting(0); + mySearcher->Main()->Refresh(); + mySearcher->Main()->Highlighting(1); + mySearcher->EnterPressed(); + } + else + { + Mpd->SetSingle(!Mpd->GetSingle()); + Mpd->UpdateStatus(); + } + } else if (Keypressed(input, Key.ToggleCrossfade)) { Mpd->SetCrossfade(Mpd->GetCrossfade() ? 0 : Config.crossfade_time); @@ -1276,22 +1287,6 @@ int main(int argc, char *argv[]) if (s) myBrowser->LocateSong(*s); } - else if (Keypressed(input, Key.StartSearching)) - { - if (myScreen == myPlaylist && myPlaylist->isPlaying()) - { - Config.stop_after_current_song = !Config.stop_after_current_song; - ShowMessage("Stop playing after current song: %s", Config.stop_after_current_song ? "on" : "off"); - } - else if (myScreen == mySearcher && !mySearcher->Main()->isStatic(0)) - { - mySearcher->Main()->Highlight(SearchEngine::SearchButton); - mySearcher->Main()->Highlighting(0); - mySearcher->Main()->Refresh(); - mySearcher->Main()->Highlighting(1); - mySearcher->EnterPressed(); - } - } else if (Keypressed(input, Key.GoToPosition)) { const Song *s = myPlaylist->NowPlayingSong(); diff --git a/src/settings.cpp b/src/settings.cpp index dcbe97c0..006554fc 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -117,8 +117,8 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.SeekForward[0] = 'f'; keys.SeekBackward[0] = 'b'; keys.ToggleRepeat[0] = 'r'; - keys.ToggleRepeatOne[0] = 'R'; keys.ToggleRandom[0] = 'z'; + keys.ToggleSingle[0] = 'y'; keys.ToggleSpaceMode[0] = 't'; keys.ToggleAddMode[0] = 'T'; keys.Shuffle[0] = 'Z'; @@ -149,7 +149,6 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.SavePlaylist[0] = 'S'; keys.GoToNowPlaying[0] = 'o'; keys.GoToContainingDir[0] = 'G'; - keys.StartSearching[0] = 'y'; keys.ToggleAutoCenter[0] = 'U'; keys.ToggleDisplayMode[0] = 'p'; keys.ToggleLyricsDB[0] = 'L'; @@ -184,8 +183,8 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.SeekForward[1] = null_key; keys.SeekBackward[1] = null_key; keys.ToggleRepeat[1] = null_key; - keys.ToggleRepeatOne[1] = null_key; keys.ToggleRandom[1] = null_key; + keys.ToggleSingle[1] = null_key; keys.ToggleSpaceMode[1] = null_key; keys.ToggleAddMode[1] = null_key; keys.Shuffle[1] = null_key; @@ -216,7 +215,6 @@ void DefaultKeys(ncmpcpp_keys &keys) keys.SavePlaylist[1] = null_key; keys.GoToNowPlaying[1] = null_key; keys.GoToContainingDir[1] = null_key; - keys.StartSearching[1] = null_key; keys.ToggleAutoCenter[1] = null_key; keys.ToggleDisplayMode[1] = null_key; keys.ToggleLyricsDB[1] = null_key; @@ -263,7 +261,6 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.header_visibility = true; conf.statusbar_visibility = true; conf.autocenter_mode = false; - conf.repeat_one_mode = false; conf.wrapped_search = true; conf.space_selects = false; conf.ncmpc_like_songs_adding = false; @@ -275,7 +272,6 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.display_screens_numbers_on_start = true; conf.clock_display_seconds = false; conf.ignore_leading_the = false; - conf.stop_after_current_song = false; conf.block_search_constraints_change = true; conf.use_console_editor = false; conf.set_window_title = true; @@ -356,10 +352,10 @@ void ReadKeys(ncmpcpp_keys &keys) GetKeys(key, keys.SeekBackward); else if (key.find("key_toggle_repeat ") != string::npos) GetKeys(key, keys.ToggleRepeat); - else if (key.find("key_toggle_repeat_one ") != string::npos) - GetKeys(key, keys.ToggleRepeatOne); else if (key.find("key_toggle_random ") != string::npos) GetKeys(key, keys.ToggleRandom); + else if (key.find("key_toggle_single ") != string::npos) + GetKeys(key, keys.ToggleSingle); else if (key.find("key_toggle_space_mode ") != string::npos) GetKeys(key, keys.ToggleSpaceMode); else if (key.find("key_toggle_add_mode ") != string::npos) @@ -426,8 +422,6 @@ void ReadKeys(ncmpcpp_keys &keys) GetKeys(key, keys.ToggleLyricsDB); else if (key.find("key_go_to_containing_directory ") != string::npos) GetKeys(key, keys.GoToContainingDir); - else if (key.find("key_start_searching ") != string::npos) - GetKeys(key, keys.StartSearching); else if (key.find("key_go_to_parent_dir ") != string::npos) GetKeys(key, keys.GoToParentDir); else if (key.find("key_switch_tag_type_list ") != string::npos) @@ -608,10 +602,6 @@ void ReadConfiguration(ncmpcpp_config &conf) { conf.autocenter_mode = v == "yes"; } - else if (cl.find("repeat_one_mode") != string::npos) - { - conf.repeat_one_mode = v == "yes"; - } else if (cl.find("default_find_mode") != string::npos) { conf.wrapped_search = v == "wrapped"; diff --git a/src/settings.h b/src/settings.h index c456be43..f28315b0 100644 --- a/src/settings.h +++ b/src/settings.h @@ -64,8 +64,8 @@ struct ncmpcpp_keys int SeekForward[2]; int SeekBackward[2]; int ToggleRepeat[2]; - int ToggleRepeatOne[2]; int ToggleRandom[2]; + int ToggleSingle[2]; int ToggleSpaceMode[2]; int ToggleAddMode[2]; int Shuffle[2]; @@ -96,7 +96,6 @@ struct ncmpcpp_keys int SavePlaylist[2]; int GoToNowPlaying[2]; int GoToContainingDir[2]; - int StartSearching[2]; int ToggleAutoCenter[2]; int ToggleDisplayMode[2]; int ToggleLyricsDB[2]; @@ -153,7 +152,6 @@ struct ncmpcpp_config bool header_visibility; bool statusbar_visibility; bool autocenter_mode; - bool repeat_one_mode; bool wrapped_search; bool space_selects; bool ncmpc_like_songs_adding; @@ -165,7 +163,6 @@ struct ncmpcpp_config bool display_screens_numbers_on_start; bool clock_display_seconds; bool ignore_leading_the; - bool stop_after_current_song; bool block_search_constraints_change; bool use_console_editor; diff --git a/src/status.cpp b/src/status.cpp index 58c41710..02d8dbb2 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -175,7 +175,6 @@ void NcmpcppErrorCallback(Connection *Mpd, int errorid, const char *msg, void *) void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) { static size_t playing_song_scroll_begin = 0; - static bool repeat_one_allowed = 0; static string player_state; static MPD::Song np; @@ -324,7 +323,6 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) wFooter->SetColor(Config.statusbar_color); Playlist::ReloadRemaining = 1; myPlaylist->NowPlaying = -1; - Config.stop_after_current_song = 0; player_state.clear(); break; } @@ -342,30 +340,21 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) { if (myPlaylist->isPlaying()) { - if (Config.repeat_one_mode && repeat_one_allowed) - Mpd->Play(myPlaylist->OldPlaying); np = Mpd->GetCurrentSong(); WindowTitle(utf_to_locale_cpy(np.toString(Config.song_window_title_format))); if (Config.autocenter_mode && !myPlaylist->Main()->isFiltered()) myPlaylist->Main()->Highlight(myPlaylist->NowPlaying); - repeat_one_allowed = 0; if (!Mpd->GetElapsedTime()) mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth()); - if (Config.now_playing_lyrics && !Config.repeat_one_mode && myScreen == myLyrics && myOldScreen == myPlaylist) + if (Config.now_playing_lyrics && !Mpd->GetSingle() && myScreen == myLyrics && myOldScreen == myPlaylist) Lyrics::Reload = 1; } Playlist::ReloadRemaining = 1; playing_song_scroll_begin = 0; - if (Config.stop_after_current_song) - { - Mpd->Stop(); - Config.stop_after_current_song = 0; - } - if (Mpd->GetState() == psPlay) { changed.ElapsedTime = 1; @@ -377,10 +366,6 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) { int elapsed = Mpd->GetElapsedTime(); - // 'repeat one' mode check - be sure that we deal with item with known length - if (np.GetTotalLength() && elapsed == np.GetTotalLength()-1) - repeat_one_allowed = 1; - if (!block_statusbar_update && Config.statusbar_visibility) { string tracklength; @@ -427,6 +412,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) static char mpd_repeat; static char mpd_random; + static char mpd_single; static char mpd_crossfade; static char mpd_db_updating; @@ -440,6 +426,11 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) mpd_random = Mpd->GetRandom() ? 'z' : 0; ShowMessage("Random is %s", !mpd_random ? "off" : "on"); } + if (changed.Single) + { + mpd_single = Mpd->GetSingle() ? 's' : 0; + ShowMessage("Single is %s", !mpd_single ? "off" : "on"); + } if (changed.Crossfade) { int crossfade = Mpd->GetCrossfade(); @@ -460,6 +451,8 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) switch_state += mpd_repeat; if (mpd_random) switch_state += mpd_random; + if (mpd_single) + switch_state += mpd_single; if (mpd_crossfade) switch_state += mpd_crossfade; if (mpd_db_updating)