Code

screen_lyrics: removed the "update" method
[ncmpc.git] / src / screen_lyrics.c
index 2f63fb0ae62be5d5cd72cbffa117c8b5d07b9ffd..d83bf5b36b993d9acfdca8cd8d2356aa8f3873d5 100644 (file)
@@ -39,7 +39,6 @@
 #include <stdio.h>
 
 static list_window_t *lw = NULL;
-static int lyrics_text_rows = -1;
 
 static struct {
        const struct mpd_song *song;
@@ -77,17 +76,38 @@ screen_lyrics_clear(void)
 {
        guint i;
 
-       assert(current.loader == NULL ||
-              lyrics_result(current.loader) == LYRICS_SUCCESS);
-
-       current.song = NULL;
-
        for (i = 0; i < current.lines->len; ++i)
                g_free(g_ptr_array_index(current.lines, i));
 
        g_ptr_array_set_size(current.lines, 0);
 }
 
+static void
+lyrics_paint(mpdclient_t *c);
+
+/**
+ * Repaint and update the screen.
+ */
+static void
+lyrics_repaint(void)
+{
+       lyrics_paint(NULL);
+       wrefresh(lw->w);
+}
+
+/**
+ * Repaint and update the screen, if it is currently active.
+ */
+static void
+lyrics_repaint_if_active(void)
+{
+       if (get_cur_mode_id() == 104) { /* XXX don't use the literal number */
+               lyrics_repaint();
+
+               /* XXX repaint the screen title */
+       }
+}
+
 static void
 screen_lyrics_set(const GString *str)
 {
@@ -125,32 +145,24 @@ screen_lyrics_set(const GString *str)
 
        if (*p != 0)
                g_ptr_array_add(current.lines, g_strdup(p));
+
+       /* paint new data */
+
+       lyrics_repaint_if_active();
 }
 
-static int
-screen_lyrics_poll(void)
+static void
+screen_lyrics_callback(const GString *result, mpd_unused void *data)
 {
        assert(current.loader != NULL);
 
-       switch (lyrics_result(current.loader)) {
-       case LYRICS_BUSY:
-               return 0;
-
-       case LYRICS_SUCCESS:
-               screen_lyrics_set(lyrics_get(current.loader));
-               lyrics_free(current.loader);
-               current.loader = NULL;
-               return 1;
-
-       case LYRICS_FAILED:
-               lyrics_free(current.loader);
-               current.loader = NULL;
+       if (result != NULL)
+               screen_lyrics_set(result);
+       else
                screen_status_message (_("No lyrics"));
-               return -1;
-       }
 
-       assert(0);
-       return -1;
+       lyrics_free(current.loader);
+       current.loader = NULL;
 }
 
 static void
@@ -163,17 +175,18 @@ screen_lyrics_load(struct mpd_song *song)
        screen_lyrics_abort();
        screen_lyrics_clear();
 
+       current.song = song;
+
        strfsong(buffer, sizeof(buffer), "%artist%", song);
        current.artist = g_strdup(buffer);
 
        strfsong(buffer, sizeof(buffer), "%title%", song);
        current.title = g_strdup(buffer);
 
-       current.loader = lyrics_load(current.artist, current.title);
+       current.loader = lyrics_load(current.artist, current.title,
+                                    screen_lyrics_callback, NULL);
 }
 
-static void lyrics_paint(screen_t *screen, mpdclient_t *c);
-
 static FILE *create_lyr_file(const char *artist, const char *title)
 {
        char path[1024];
@@ -208,8 +221,8 @@ static int store_lyr_hd(void)
 static const char *
 list_callback(unsigned idx, mpd_unused int *highlight, mpd_unused void *data)
 {
-       if (current.lines == NULL || idx >= current.lines->len)
-               return "";
+       if (idx >= current.lines->len)
+               return NULL;
 
        return g_ptr_array_index(current.lines, idx);
 }
@@ -247,8 +260,6 @@ lyrics_open(mpd_unused screen_t *screen, mpdclient_t *c)
 {
        if (c->song != NULL && c->song != current.song)
                screen_lyrics_load(c->song);
-       else if (current.loader != NULL)
-               screen_lyrics_poll();
 }
 
 
@@ -267,70 +278,20 @@ lyrics_title(char *str, size_t size)
 }
 
 static void
-lyrics_paint(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c)
+lyrics_paint(mpd_unused mpdclient_t *c)
 {
-       lw->clear = 1;
        list_window_paint(lw, list_callback, NULL);
-       wrefresh(lw->w);
 }
 
-
-static void
-lyrics_update(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c)
-{
-       if( lw->repaint ) {
-               list_window_paint(lw, list_callback, NULL);
-               wrefresh(lw->w);
-               lw->repaint = 0;
-       }
-}
-
-
 static int
 lyrics_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
 {
-       lw->repaint=1;
-       switch(cmd) {
-       case CMD_LIST_NEXT:
-               if (current.lines != NULL && lw->start+lw->rows < current.lines->len+1)
-                       lw->start++;
-               return 1;
-       case CMD_LIST_PREVIOUS:
-               if( lw->start >0 )
-                       lw->start--;
-               return 1;
-       case CMD_LIST_FIRST:
-               lw->start = 0;
-               return 1;
-       case CMD_LIST_LAST:
-               if ((unsigned)lyrics_text_rows > lw->rows)
-                       lw->start = lyrics_text_rows - lw->rows;
-               else
-                       lw->start = 0;
-               return 1;
-       case CMD_LIST_NEXT_PAGE:
-               lw->start = lw->start + lw->rows - 1;
-               if (lw->start + lw->rows >= (unsigned)lyrics_text_rows + 1) {
-                       if ((unsigned)lyrics_text_rows + 1 > lw->rows)
-                               lw->start = lyrics_text_rows + 1 - lw->rows;
-                       else
-                               lw->start = 0;
-               }
-               return 1;
-       case CMD_LIST_PREVIOUS_PAGE:
-               if (lw->start > lw->rows)
-                       lw->start -= lw->rows;
-               else
-                       lw->start = 0;
-               return 1;
-       case CMD_SELECT:
-               /* XXX */
-               if (current.loader != NULL) {
-                       int ret = screen_lyrics_poll();
-                       if (ret != 0)
-                               lyrics_paint(NULL, NULL);
-               }
+       if (list_window_scroll_cmd(lw, current.lines->len, cmd)) {
+               lyrics_repaint();
                return 1;
+       }
+
+       switch(cmd) {
        case CMD_INTERRUPT:
                if (current.loader != NULL) {
                        screen_lyrics_abort();
@@ -345,7 +306,7 @@ lyrics_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
        case CMD_LYRICS_UPDATE:
                if (c->song != NULL) {
                        screen_lyrics_load(c->song);
-                       lyrics_paint(NULL, NULL);
+                       lyrics_repaint();
                }
                return 1;
        default:
@@ -354,45 +315,26 @@ lyrics_cmd(screen_t *screen, mpdclient_t *c, command_t cmd)
 
        lw->selected = lw->start+lw->rows;
        if (screen_find(screen,
-                       lw,  lyrics_text_rows,
+                       lw, current.lines->len,
                        cmd, list_callback, NULL)) {
                /* center the row */
-               lw->start = lw->selected - (lw->rows / 2);
-               if (lw->start + lw->rows > (unsigned)lyrics_text_rows) {
-                       if (lw->rows < (unsigned)lyrics_text_rows)
-                               lw->start = lyrics_text_rows - lw->rows;
-                       else
-                               lw->start = 0;
-               }
+               list_window_center(lw, current.lines->len, lw->selected);
+               lyrics_repaint();
                return 1;
        }
 
        return 0;
 }
 
-static list_window_t *
-lyrics_lw(void)
-{
-  return lw;
-}
+const struct screen_functions screen_lyrics = {
+       .init = lyrics_screen_init,
+       .exit = lyrics_exit,
+       .open = lyrics_open,
+       .close = NULL,
+       .resize = lyrics_resize,
+       .paint = lyrics_paint,
+       .cmd = lyrics_cmd,
+       .get_title = lyrics_title,
+};
 
-screen_functions_t *
-get_screen_lyrics(void)
-{
-  static screen_functions_t functions;
-
-  memset(&functions, 0, sizeof(screen_functions_t));
-  functions.init   = lyrics_screen_init;
-  functions.exit   = lyrics_exit;
-  functions.open = lyrics_open;
-  functions.close  = NULL;
-  functions.resize = lyrics_resize;
-  functions.paint  = lyrics_paint;
-  functions.update = lyrics_update;
-  functions.cmd    = lyrics_cmd;
-  functions.get_lw = lyrics_lw;
-  functions.get_title = lyrics_title;
-
-  return &functions;
-}
 #endif /* ENABLE_LYRICS_SCREEN */