Code

screen_lyrics: add screen_lyrics_switch()
authorMax Kellermann <max@duempel.org>
Thu, 2 Oct 2008 13:20:19 +0000 (15:20 +0200)
committerMax Kellermann <max@duempel.org>
Thu, 2 Oct 2008 13:20:19 +0000 (15:20 +0200)
screen_lyrics_switch() opens the lyrics screen and displays the lyrics
of the specified song.  This way, the user may view the lyrics of any
song in the database browser.

src/screen.h
src/screen_browser.c
src/screen_lyrics.c
src/screen_play.c

index e6f0ee7a1f1f2255fe5f75c9ef03537834490c04..6d264570201c37bab473967fb4af5dbbd465559b 100644 (file)
@@ -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
index d7dea635e320a3ad903e96a48c15de1e2d30f2fe..694987fae926d88914245862018aee327a25f654 100644 (file)
@@ -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;
        }
index dbfe4ea6feaedbb671758f583024f443a0603e43..83bffdf8d8a2d0f048386a306154e210c10aa724 100644 (file)
@@ -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);
+}
index 1bc2034b82d7d26557b8fb6a3fe29576f6deb0ae..67de5fa3e62d3d6ce73ec045b6613668a7351e3e 100644 (file)
@@ -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;
        }