diff options
-rw-r--r-- | src/screen.h | 6 | ||||
-rw-r--r-- | src/screen_browser.c | 16 | ||||
-rw-r--r-- | src/screen_lyrics.c | 20 | ||||
-rw-r--r-- | src/screen_play.c | 11 |
4 files changed, 51 insertions, 2 deletions
diff --git a/src/screen.h b/src/screen.h index e6f0ee7a1..6d2645702 100644 --- a/src/screen.h +++ b/src/screen.h @@ -90,4 +90,10 @@ screen_is_visible(const struct screen_functions *sf); int screen_get_mouse_event(mpdclient_t *c, unsigned long *bstate, int *row); + +#ifdef ENABLE_LYRICS_SCREEN +void +screen_lyrics_switch(struct mpdclient *c, const struct mpd_song *song); +#endif + #endif diff --git a/src/screen_browser.c b/src/screen_browser.c index d7dea635e..694987fae 100644 --- a/src/screen_browser.c +++ b/src/screen_browser.c @@ -455,6 +455,8 @@ bool browser_cmd(struct screen_browser *browser, struct screen *screen, struct mpdclient *c, command_t cmd) { + struct filelist_entry *entry; + switch (cmd) { case CMD_PLAY: browser_handle_enter(browser, c); @@ -494,6 +496,20 @@ browser_cmd(struct screen_browser *browser, struct screen *screen, browser_handle_mouse_event(browser, c); return true; +#ifdef ENABLE_LYRICS_SCREEN + case CMD_SCREEN_LYRICS: + entry = browser_get_selected(browser); + if (entry == NULL) + return false; + + if (entry->entity == NULL || + entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + return true; + + screen_lyrics_switch(c, entry->entity->info.song); + return true; +#endif + default: break; } diff --git a/src/screen_lyrics.c b/src/screen_lyrics.c index dbfe4ea6f..83bffdf8d 100644 --- a/src/screen_lyrics.c +++ b/src/screen_lyrics.c @@ -38,6 +38,8 @@ static list_window_t *lw = NULL; +static const struct mpd_song *next_song; + static struct { const struct mpd_song *song; @@ -256,8 +258,13 @@ lyrics_exit(void) static void lyrics_open(mpd_unused screen_t *screen, mpdclient_t *c) { - if (c->song != NULL && c->song != current.song) - screen_lyrics_load(c->song); + if (next_song == NULL) + next_song = c->song; + + if (next_song != NULL && next_song != current.song) + screen_lyrics_load(next_song); + + next_song = NULL; } @@ -334,3 +341,12 @@ const struct screen_functions screen_lyrics = { .cmd = lyrics_cmd, .get_title = lyrics_title, }; + +void +screen_lyrics_switch(struct mpdclient *c, const struct mpd_song *song) +{ + assert(song != NULL); + + next_song = song; + screen_switch(&screen_lyrics, c); +} diff --git a/src/screen_play.c b/src/screen_play.c index 1bc2034b8..67de5fa3e 100644 --- a/src/screen_play.c +++ b/src/screen_play.c @@ -528,6 +528,17 @@ play_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) case CMD_MOUSE_EVENT: return handle_mouse_event(screen,c); + +#ifdef ENABLE_LYRICS_SCREEN + case CMD_SCREEN_LYRICS: + if (lw->selected < playlist_length(&c->playlist)) { + screen_lyrics_switch(c, playlist_get(&c->playlist, lw->selected)); + return 1; + } + + break; +#endif + default: break; } |