diff --git a/doc/config b/doc/config index 4f7d671b..be9fd00d 100644 --- a/doc/config +++ b/doc/config @@ -263,6 +263,14 @@ # #display_screens_numbers_on_start = "yes" # +## +## How shall key_screen_switcher work? +## +## - yes - always switch between browser and playlist +## - no - switch between current and last used screen +## +#screen_switcher_browser_only = "yes" +# #jump_to_now_playing_song_at_start = "yes" # #ask_before_clearing_main_playlist = "no" diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 1af17b50..0b75e95a 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -213,6 +213,9 @@ If set to "playlist", Search engine will perform searching in current MPD playli .B display_screens_numbers_on_start = yes/no If enabled, screens' names and their keybindings will be shown in header window until key is pressed, otherwise they won't be displayed at all. .TP +.B screen_switcher_browser_only = yes/no +If enabled, the "screen_switcher" key ( by default) will only switch between the playlist and browser screens. If disabled, the last active screen will be remembered, and the "screen_switcher" key will jump back. +.TP .B jump_to_now_playing_song_at_start = yes/no If enabled, ncmpcpp will jump at start to now playing song if mpd is playing or paused. .TP diff --git a/src/browser.cpp b/src/browser.cpp index 66223f53..b8b0e84f 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -87,6 +87,9 @@ void Browser::SwitchTo() Config.browser_sort_by_mtime = 0; w->Empty() ? myBrowser->GetDirectory(itsBrowsedDir) : myBrowser->UpdateItemList(); + + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; RedrawHeader = 1; } diff --git a/src/browser.h b/src/browser.h index ff98b058..b429b77c 100644 --- a/src/browser.h +++ b/src/browser.h @@ -37,6 +37,7 @@ class Browser : public Screen< Menu > virtual void EnterPressed(); virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/clock.cpp b/src/clock.cpp index 7268350e..a2ba5d93 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -87,6 +87,8 @@ void Clock::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; myPlaylist->Items->Hide(); RedrawHeader = 1; diff --git a/src/clock.h b/src/clock.h index d11d4031..3eda655a 100644 --- a/src/clock.h +++ b/src/clock.h @@ -44,6 +44,7 @@ class Clock : public Screen virtual void EnterPressed() { } virtual void SpacePressed() { } virtual void MouseButtonPressed(MEVENT) { } + virtual bool isTabbable() { return true; } virtual bool allowsSelection() { return false; } diff --git a/src/global.h b/src/global.h index b31415fa..f457013e 100644 --- a/src/global.h +++ b/src/global.h @@ -28,7 +28,9 @@ namespace Global { extern BasicScreen *myScreen; - extern BasicScreen *myOldScreen; + extern BasicScreen *myOldScreen; // for info, lyrics, popups + extern BasicScreen *myPrevScreen; // "real" screen switching + // (browser, search, etc.) extern Window *wHeader; extern Window *wFooter; diff --git a/src/help.cpp b/src/help.cpp index 1204f000..a0a4de73 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -55,6 +55,8 @@ void Help::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; RedrawHeader = 1; @@ -133,7 +135,10 @@ void Help::GetKeybindings() *w << DisplayKeys(Key.Home) << "Home\n"; *w << DisplayKeys(Key.End) << "End\n"; *w << "\n"; - *w << DisplayKeys(Key.ScreenSwitcher) << "Switch between playlist and browser\n"; + if (Config.screen_switcher_browser_only) + *w << DisplayKeys(Key.ScreenSwitcher) << "Switch between playlist and browser\n"; + else + *w << DisplayKeys(Key.ScreenSwitcher) << "Switch between current and last screen\n"; *w << DisplayKeys(Key.Help) << "Help screen\n"; *w << DisplayKeys(Key.Playlist) << "Playlist screen\n"; *w << DisplayKeys(Key.Browser) << "Browse screen\n"; diff --git a/src/help.h b/src/help.h index 6a11b619..d18cc7fd 100644 --- a/src/help.h +++ b/src/help.h @@ -34,6 +34,7 @@ class Help : public Screen virtual void EnterPressed() { } virtual void SpacePressed() { } + virtual bool isTabbable() { return true; } virtual bool allowsSelection() { return false; } diff --git a/src/media_library.cpp b/src/media_library.cpp index 8e5b31f6..a2e19769 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -145,6 +145,8 @@ void MediaLibrary::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; RedrawHeader = 1; Refresh(); diff --git a/src/media_library.h b/src/media_library.h index 29d0c8f9..4d0f7663 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -48,6 +48,7 @@ class MediaLibrary : public Screen virtual void EnterPressed() { AddToPlaylist(1); } virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 9f3afb8d..1a7325e8 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -73,6 +73,7 @@ using namespace MPD; BasicScreen *Global::myScreen; BasicScreen *Global::myOldScreen; +BasicScreen *Global::myPrevScreen; Window *Global::wHeader; Window *Global::wFooter; @@ -276,6 +277,12 @@ int main(int argc, char *argv[]) wFooter->AddFDCallback(Mpd.GetFD(), StatusbarMPDCallback); wFooter->CreateHistory(); + // initialize screens to browser as default previous screen + myScreen = myBrowser; + myPrevScreen = myBrowser; + myOldScreen = myBrowser; + + // go to playlist myPlaylist->SwitchTo(); myPlaylist->UpdateTimer(); @@ -1915,10 +1922,20 @@ int main(int argc, char *argv[]) } else if (Keypressed(input, Key.ScreenSwitcher)) { - if (myScreen == myPlaylist) - myBrowser->SwitchTo(); + if (Config.screen_switcher_browser_only) + { + if (myScreen == myPlaylist) + myBrowser->SwitchTo(); + else + myPlaylist->SwitchTo(); + } else - myPlaylist->SwitchTo(); + { + if (myScreen->isTabbable()) + myPrevScreen->SwitchTo(); + else + myOldScreen->SwitchTo(); + } } else if (Keypressed(input, Key.Playlist)) { diff --git a/src/outputs.cpp b/src/outputs.cpp index 18f6b5a8..5fa71a8f 100644 --- a/src/outputs.cpp +++ b/src/outputs.cpp @@ -51,6 +51,8 @@ void Outputs::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; w->Window::Clear(); diff --git a/src/outputs.h b/src/outputs.h index 03a13d6b..fe410610 100644 --- a/src/outputs.h +++ b/src/outputs.h @@ -42,6 +42,7 @@ class Outputs : public Screen< Menu > virtual void EnterPressed(); virtual void SpacePressed() { } virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual bool allowsSelection() { return false; } diff --git a/src/playlist.cpp b/src/playlist.cpp index ee16e1a7..d03e390b 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -97,6 +97,8 @@ void Playlist::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; Items->Window::Clear(); EnableHighlighting(); diff --git a/src/playlist.h b/src/playlist.h index eac49124..5b395346 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -41,6 +41,7 @@ class Playlist : public Screen virtual void EnterPressed(); virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 67a983cc..eab055ab 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -102,6 +102,8 @@ void PlaylistEditor::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; RedrawHeader = 1; Refresh(); diff --git a/src/playlist_editor.h b/src/playlist_editor.h index ae1901b8..83e68ff4 100644 --- a/src/playlist_editor.h +++ b/src/playlist_editor.h @@ -37,6 +37,7 @@ class PlaylistEditor : public Screen virtual void EnterPressed() { AddToPlaylist(1); } virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/screen.h b/src/screen.h index b0f00cd2..a483dd5d 100644 --- a/src/screen.h +++ b/src/screen.h @@ -118,6 +118,11 @@ class BasicScreen /// cast to List if available or null pointer otherwise /// virtual List *GetList() = 0; + + /// When this is overwritten with a function returning true, the + /// screen will be used in tab switching. + /// + virtual bool isTabbable() { return false; } /// Should be set to true each time screen needs resize /// diff --git a/src/search_engine.cpp b/src/search_engine.cpp index e1ab405d..3c850d06 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -89,6 +89,9 @@ void SearchEngine::SwitchTo() if (w->Empty()) Prepare(); + + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; RedrawHeader = 1; diff --git a/src/search_engine.h b/src/search_engine.h index 745cf708..7972765b 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -35,6 +35,7 @@ class SearchEngine : public Screen< Menu< std::pair > > virtual void EnterPressed(); virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/settings.cpp b/src/settings.cpp index 8767fa8b..80a7abee 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -294,6 +294,7 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.header_text_scrolling = true; conf.statusbar_visibility = true; conf.centered_cursor = false; + conf.screen_switcher_browser_only = true; conf.autocenter_mode = false; conf.wrapped_search = true; conf.space_selects = false; @@ -754,6 +755,10 @@ void ReadConfiguration(ncmpcpp_config &conf) { conf.statusbar_visibility = v == "yes"; } + else if (cl.find("screen_switcher_browser_only") != std::string::npos) + { + conf.screen_switcher_browser_only = v == "yes"; + } else if (cl.find("autocenter_mode") != std::string::npos) { conf.autocenter_mode = v == "yes"; diff --git a/src/settings.h b/src/settings.h index 5c51fd08..5b447b6a 100644 --- a/src/settings.h +++ b/src/settings.h @@ -187,6 +187,7 @@ struct ncmpcpp_config bool header_text_scrolling; bool statusbar_visibility; bool centered_cursor; + bool screen_switcher_browser_only; bool autocenter_mode; bool wrapped_search; bool space_selects; diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index 268bef47..2dca3092 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -42,6 +42,7 @@ using Global::MainHeight; using Global::MainStartY; using Global::myOldScreen; using Global::myScreen; +using Global::myPrevScreen; using Global::wFooter; TagEditor *myTagEditor = new TagEditor; @@ -197,6 +198,8 @@ void TagEditor::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; Global::RedrawHeader = 1; Refresh(); diff --git a/src/tag_editor.h b/src/tag_editor.h index 55b0a8d0..6d2ab75c 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -53,6 +53,7 @@ class TagEditor : public Screen virtual void EnterPressed(); virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT); + virtual bool isTabbable() { return true; } virtual MPD::Song *CurrentSong(); diff --git a/src/visualizer.cpp b/src/visualizer.cpp index 7d9e2d11..9bbb6b11 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -32,6 +32,7 @@ #include using Global::myScreen; +using Global::myPrevScreen; using Global::MainStartY; using Global::MainHeight; @@ -70,6 +71,8 @@ void Visualizer::SwitchTo() if (hasToBeResized) Resize(); + if (myScreen != this && myScreen->isTabbable()) + myPrevScreen = myScreen; myScreen = this; w->Clear(); diff --git a/src/visualizer.h b/src/visualizer.h index 64e51d19..e6fd205e 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -48,6 +48,7 @@ class Visualizer : public Screen virtual void EnterPressed() { } virtual void SpacePressed(); virtual void MouseButtonPressed(MEVENT) { } + virtual bool isTabbable() { return true; } virtual NCurses::List *GetList() { return 0; }