X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_lyrics.c;h=ce11b4473e469fdf033719e513ef7e06d1014be7;hb=5a7177e0337b40804f4aaf59630ef7df36b4b998;hp=cfc65893981ac9c119f2c93e88f09684ec17f5dc;hpb=31d7b47521f6663ccb30d36ae7b0ac8ed0c3127f;p=ncmpc.git diff --git a/src/screen_lyrics.c b/src/screen_lyrics.c index cfc6589..ce11b44 100644 --- a/src/screen_lyrics.c +++ b/src/screen_lyrics.c @@ -17,44 +17,39 @@ * */ -#include "config.h" -#ifndef DISABLE_LYRICS_SCREEN #include -#include "ncmpc.h" +#include "i18n.h" #include "options.h" #include "mpdclient.h" #include "command.h" #include "screen.h" -#include "screen_utils.h" #include "strfsong.h" #include "lyrics.h" -#include "gcc.h" +#include "screen_text.h" -#define _GNU_SOURCE #include #include #include -#include #include #include -static list_window_t *lw = NULL; +static struct screen_text text; + +static const struct mpd_song *next_song; static struct { - const struct mpd_song *song; + struct mpd_song *song; char *artist, *title; - struct lyrics_loader *loader; - - GPtrArray *lines; + struct plugin_cycle *loader; } current; static void screen_lyrics_abort(void) { if (current.loader != NULL) { - lyrics_free(current.loader); + plugin_stop(current.loader); current.loader = NULL; } @@ -68,99 +63,61 @@ screen_lyrics_abort(void) current.artist = NULL; } - current.song = NULL; + if (current.song != NULL) { + mpd_freeSong(current.song); + current.song = NULL; + } } +/** + * Repaint and update the screen, if it is currently active. + */ static void -screen_lyrics_clear(void) +lyrics_repaint_if_active(void) { - guint i; + if (screen_is_visible(&screen_lyrics)) { + screen_text_repaint(&text); - assert(current.loader == NULL || - lyrics_result(current.loader) == LYRICS_SUCCESS); - - 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); + /* XXX repaint the screen title */ + } } static void screen_lyrics_set(const GString *str) { - const char *p, *eol, *next; - - screen_lyrics_clear(); - - p = str->str; - while ((eol = strchr(p, '\n')) != NULL) { - char *line; - - next = eol + 1; - - /* strip whitespace at end */ - - while (eol > p && (unsigned char)eol[-1] <= 0x20) - --eol; - - /* create copy and append it to current.lines*/ - - line = g_malloc(eol - p + 1); - memcpy(line, p, eol - p); - line[eol - p] = 0; - - g_ptr_array_add(current.lines, line); - - /* reset control characters */ + screen_text_set(&text, str); - for (eol = line + (eol - p); line < eol; ++line) - if ((unsigned char)*line < 0x20) - *line = ' '; + /* paint new data */ - p = next; - } - - if (*p != 0) - g_ptr_array_add(current.lines, g_strdup(p)); + lyrics_repaint_if_active(); } -static int -screen_lyrics_poll(void) +static void +screen_lyrics_callback(const GString *result, G_GNUC_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 + /* translators: no lyrics were found for the song */ screen_status_message (_("No lyrics")); - return -1; - } - assert(0); - return -1; + plugin_stop(current.loader); + current.loader = NULL; } static void -screen_lyrics_load(struct mpd_song *song) +screen_lyrics_load(const struct mpd_song *song) { char buffer[MAX_SONGNAME_LENGTH]; assert(song != NULL); screen_lyrics_abort(); - screen_lyrics_clear(); + screen_text_clear(&text); - current.song = song; + current.song = mpd_songDup(song); strfsong(buffer, sizeof(buffer), "%artist%", song); current.artist = g_strdup(buffer); @@ -168,11 +125,10 @@ screen_lyrics_load(struct mpd_song *song) 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]; @@ -196,141 +152,124 @@ static int store_lyr_hd(void) if (lyr_file == NULL) return -1; - for (i = 0; i < current.lines->len; ++i) + for (i = 0; i < text.lines->len; ++i) fprintf(lyr_file, "%s\n", - (const char*)g_ptr_array_index(current.lines, i)); + (const char*)g_ptr_array_index(text.lines, i)); fclose(lyr_file); return 0; } -static const char * -list_callback(unsigned idx, mpd_unused int *highlight, mpd_unused void *data) -{ - if (idx >= current.lines->len) - return NULL; - - return g_ptr_array_index(current.lines, idx); -} - - static void lyrics_screen_init(WINDOW *w, int cols, int rows) { - current.lines = g_ptr_array_new(); - lw = list_window_init(w, cols, rows); - lw->flags = LW_HIDE_CURSOR; + screen_text_init(&text, w, cols, rows); } static void lyrics_resize(int cols, int rows) { - lw->cols = cols; - lw->rows = rows; + screen_text_resize(&text, cols, rows); } static void lyrics_exit(void) { - list_window_free(lw); - screen_lyrics_abort(); - screen_lyrics_clear(); - g_ptr_array_free(current.lines, TRUE); - current.lines = NULL; + screen_text_deinit(&text); } static void -lyrics_open(mpd_unused screen_t *screen, mpdclient_t *c) +lyrics_open(mpdclient_t *c) { - if (c->song != NULL && c->song != current.song) - screen_lyrics_load(c->song); - else if (current.loader != NULL) - screen_lyrics_poll(); + if (next_song == NULL) + next_song = c->song; + + if (next_song != NULL && + (current.song == NULL || + strcmp(next_song->file, current.song->file) != 0)) + screen_lyrics_load(next_song); + + next_song = NULL; } static const char * lyrics_title(char *str, size_t size) { - if (current.loader != NULL) - return "Lyrics (loading)"; - else if (current.artist != NULL && current.title != NULL && - current.lines->len > 0) { - snprintf(str, size, "Lyrics: %s - %s", + if (current.loader != NULL) { + snprintf(str, size, "%s (%s)", + _("Lyrics"), + /* translators: this message is displayed + while data is retrieved */ + _("loading...")); + return str; + } else if (current.artist != NULL && current.title != NULL && + !screen_text_is_empty(&text)) { + snprintf(str, size, "%s: %s - %s", + _("Lyrics"), current.artist, current.title); return str; } else - return "Lyrics"; + return _("Lyrics"); } static void -lyrics_paint(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) +lyrics_paint(void) { - lw->clear = 1; - list_window_paint(lw, list_callback, NULL); - wrefresh(lw->w); + screen_text_paint(&text); } - -static void -lyrics_update(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) +static bool +lyrics_cmd(mpdclient_t *c, command_t cmd) { - 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) -{ - if (list_window_scroll_cmd(lw, current.lines->len, cmd)) - return 1; + if (screen_text_cmd(&text, c, cmd)) + return true; switch(cmd) { - case CMD_SELECT: - /* XXX */ - if (current.loader != NULL) { - int ret = screen_lyrics_poll(); - if (ret != 0) - lyrics_paint(NULL, NULL); - } - return 1; case CMD_INTERRUPT: if (current.loader != NULL) { screen_lyrics_abort(); - screen_lyrics_clear(); + screen_text_clear(&text); } - return 1; + return true; case CMD_ADD: if (current.loader == NULL && current.artist != NULL && current.title != NULL && store_lyr_hd() == 0) - screen_status_message (_("Lyrics saved!")); - return 1; + /* lyrics for the song were saved on hard disk */ + screen_status_message (_("Lyrics saved")); + return true; case CMD_LYRICS_UPDATE: if (c->song != NULL) { screen_lyrics_load(c->song); - lyrics_paint(NULL, NULL); + screen_text_repaint(&text); } - return 1; - default: + return true; + +#ifdef ENABLE_SONG_SCREEN + case CMD_VIEW: + if (current.song != NULL) { + screen_song_switch(c, current.song); + return true; + } + break; - } +#endif + + case CMD_LOCATE: + if (current.song != NULL) { + screen_file_goto_song(c, current.song); + return true; + } + + return false; - lw->selected = lw->start+lw->rows; - if (screen_find(screen, - lw, current.lines->len, - cmd, list_callback, NULL)) { - /* center the row */ - list_window_center(lw, current.lines->len, lw->selected); - return 1; + default: + break; } - return 0; + return false; } const struct screen_functions screen_lyrics = { @@ -340,9 +279,15 @@ const struct screen_functions screen_lyrics = { .close = NULL, .resize = lyrics_resize, .paint = lyrics_paint, - .update = lyrics_update, .cmd = lyrics_cmd, .get_title = lyrics_title, }; -#endif /* ENABLE_LYRICS_SCREEN */ +void +screen_lyrics_switch(struct mpdclient *c, const struct mpd_song *song) +{ + assert(song != NULL); + + next_song = song; + screen_switch(&screen_lyrics, c); +}