diff options
-rw-r--r-- | src/command.c | 3 | ||||
-rw-r--r-- | src/command.h | 1 | ||||
-rw-r--r-- | src/screen.h | 2 | ||||
-rw-r--r-- | src/screen_browser.c | 9 | ||||
-rw-r--r-- | src/screen_file.c | 47 | ||||
-rw-r--r-- | src/screen_help.c | 1 | ||||
-rw-r--r-- | src/screen_lyrics.c | 9 | ||||
-rw-r--r-- | src/screen_play.c | 8 |
8 files changed, 80 insertions, 0 deletions
diff --git a/src/command.c b/src/command.c index 92ee27ea0..0168b057b 100644 --- a/src/command.c +++ b/src/command.c @@ -142,6 +142,9 @@ static command_definition_t cmds[] = { { { '"', 0, 0 }, 0, CMD_GO_PARENT_DIRECTORY, "go-parent-directory", N_("Go to parent directory") }, + { { 'l', 0, 0 }, 0, CMD_LOCATE, "locate", + N_("Locate song in browser") }, + /* lists */ { { 11, 0, 0 }, 0, CMD_LIST_MOVE_UP, "move-up", N_("Move item up") }, diff --git a/src/command.h b/src/command.h index 8cfe9d03b..6bfcb027e 100644 --- a/src/command.h +++ b/src/command.h @@ -62,6 +62,7 @@ typedef enum { CMD_INTERRUPT, CMD_GO_ROOT_DIRECTORY, CMD_GO_PARENT_DIRECTORY, + CMD_LOCATE, CMD_QUIT } command_t; diff --git a/src/screen.h b/src/screen.h index 404d0a8d5..5eb6cba20 100644 --- a/src/screen.h +++ b/src/screen.h @@ -95,6 +95,8 @@ screen_is_visible(const struct screen_functions *sf); int screen_get_mouse_event(mpdclient_t *c, unsigned long *bstate, int *row); +bool +screen_file_goto_song(struct mpdclient *c, const struct mpd_song *song); #ifdef ENABLE_LYRICS_SCREEN void diff --git a/src/screen_browser.c b/src/screen_browser.c index 6a5bbd233..63e8c1c71 100644 --- a/src/screen_browser.c +++ b/src/screen_browser.c @@ -531,6 +531,15 @@ browser_cmd(struct screen_browser *browser, return true; #endif + case CMD_LOCATE: + entry = browser_get_selected(browser); + if (entry == NULL || entry->entity == NULL || + entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + return false; + + screen_file_goto_song(c, entry->entity->info.song); + return true; + #ifdef ENABLE_LYRICS_SCREEN case CMD_SCREEN_LYRICS: entry = browser_get_selected(browser); diff --git a/src/screen_file.c b/src/screen_file.c index aabac7afa..a934ef276 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -219,6 +219,12 @@ browse_cmd(mpdclient_t *c, command_t cmd) file_repaint(); return 1; + case CMD_LOCATE: + /* don't let browser_cmd() evaluate the locate command + - it's a no-op, and by the way, leads to a + segmentation fault in the current implementation */ + return false; + case CMD_DELETE: handle_delete(c); file_repaint(); @@ -283,3 +289,44 @@ const struct screen_functions screen_browse = { .cmd = browse_cmd, .get_title = browse_title, }; + +bool +screen_file_goto_song(struct mpdclient *c, const struct mpd_song *song) +{ + const char *slash, *parent; + char *allocated = NULL; + bool ret; + int i; + + assert(song != NULL); + assert(song->file != NULL); + + if (strstr(song->file, "//") != NULL) + /* an URL? */ + return false; + + /* determine the song's parent directory and go there */ + + slash = strrchr(song->file, '/'); + if (slash != NULL) + parent = allocated = g_strndup(song->file, slash - song->file); + else + parent = ""; + + ret = browser_change_directory(&browser, c, NULL, parent); + g_free(allocated); + if (!ret) + return false; + + /* select the specified song */ + + i = filelist_find_song(browser.filelist, song); + if (i < 0) + i = 0; + + list_window_set_selected(browser.lw, i); + + /* finally, switch to the file screen */ + screen_switch(&screen_browse, c); + return true; +} diff --git a/src/screen_help.c b/src/screen_help.c index 1f0043c09..e462ddc90 100644 --- a/src/screen_help.c +++ b/src/screen_help.c @@ -81,6 +81,7 @@ static help_text_row_t help_text[] = { { 0, CMD_LIST_FIND_NEXT, NULL }, { 0, CMD_LIST_RFIND_NEXT, NULL }, { 0, CMD_TOGGLE_FIND_WRAP, NULL }, + { 0, CMD_LOCATE, NULL }, { 0, CMD_NONE, NULL }, { 0, CMD_QUIT, NULL }, diff --git a/src/screen_lyrics.c b/src/screen_lyrics.c index ab9dfdeda..30a89a163 100644 --- a/src/screen_lyrics.c +++ b/src/screen_lyrics.c @@ -329,6 +329,15 @@ lyrics_cmd(mpdclient_t *c, command_t cmd) lyrics_repaint(); } return 1; + + case CMD_LOCATE: + if (current.song != NULL) { + screen_file_goto_song(c, current.song); + return true; + } + + return false; + default: break; } diff --git a/src/screen_play.c b/src/screen_play.c index 4c21a1769..1e0dcaa28 100644 --- a/src/screen_play.c +++ b/src/screen_play.c @@ -554,6 +554,14 @@ play_cmd(mpdclient_t *c, command_t cmd) return handle_mouse_event(c); #endif + case CMD_LOCATE: + if (lw->selected < playlist_length(&c->playlist)) { + screen_file_goto_song(c, playlist_get(&c->playlist, lw->selected)); + return true; + } + + break; + #ifdef ENABLE_LYRICS_SCREEN case CMD_SCREEN_LYRICS: if (lw->selected < playlist_length(&c->playlist)) { |