X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_lyrics.c;h=221b7cdb4ce87f69425158f2ffd3ef51d5e7f0cb;hb=f6d4abc72b4b62d5bab4936060c23612903a1fb3;hp=8c2eedc7dd69e64de949a96a50f9d1f0d17cdcab;hpb=262bf9b7c23d18a3002f072eeaa1ed91722d0094;p=ncmpc.git diff --git a/src/screen_lyrics.c b/src/screen_lyrics.c index 8c2eedc..221b7cd 100644 --- a/src/screen_lyrics.c +++ b/src/screen_lyrics.c @@ -1,21 +1,21 @@ -/* - * (c) 2006 by Kalle Wallin - * Copyright (C) 2008 Max Kellermann - * +/* ncmpc (Ncurses MPD Client) + * (c) 2004-2009 The Music Player Daemon Project + * Project homepage: http://musicpd.org + * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. - * + * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ + + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ #include #include "i18n.h" @@ -23,19 +23,17 @@ #include "mpdclient.h" #include "command.h" #include "screen.h" -#include "screen_utils.h" #include "strfsong.h" #include "lyrics.h" -#include "charset.h" +#include "screen_text.h" -#define _GNU_SOURCE #include #include #include #include #include -static list_window_t *lw = NULL; +static struct screen_text text; static const struct mpd_song *next_song; @@ -44,16 +42,14 @@ static struct { 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; } @@ -73,30 +69,6 @@ screen_lyrics_abort(void) } } -static void -screen_lyrics_clear(void) -{ - guint i; - - 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(void); - -/** - * Repaint and update the screen. - */ -static void -lyrics_repaint(void) -{ - lyrics_paint(); - wrefresh(lw->w); -} - /** * Repaint and update the screen, if it is currently active. */ @@ -104,7 +76,7 @@ static void lyrics_repaint_if_active(void) { if (screen_is_visible(&screen_lyrics)) { - lyrics_repaint(); + screen_text_repaint(&text); /* XXX repaint the screen title */ } @@ -113,40 +85,7 @@ lyrics_repaint_if_active(void) 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 */ - - for (eol = line + (eol - p); line < eol; ++line) - if ((unsigned char)*line < 0x20) - *line = ' '; - - p = next; - } - - if (*p != 0) - g_ptr_array_add(current.lines, g_strdup(p)); + screen_text_set(&text, str); /* paint new data */ @@ -161,9 +100,10 @@ screen_lyrics_callback(const GString *result, G_GNUC_UNUSED void *data) if (result != NULL) screen_lyrics_set(result); else + /* translators: no lyrics were found for the song */ screen_status_message (_("No lyrics")); - lyrics_free(current.loader); + plugin_stop(current.loader); current.loader = NULL; } @@ -175,7 +115,7 @@ screen_lyrics_load(const struct mpd_song *song) assert(song != NULL); screen_lyrics_abort(); - screen_lyrics_clear(); + screen_text_clear(&text); current.song = mpd_songDup(song); @@ -212,57 +152,32 @@ 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, G_GNUC_UNUSED int *highlight, - G_GNUC_UNUSED void *data) -{ - static char buffer[256]; - char *value; - - if (idx >= current.lines->len) - return NULL; - - value = utf8_to_locale(g_ptr_array_index(current.lines, idx)); - g_strlcpy(buffer, value, sizeof(buffer)); - free(value); - - return buffer; -} - - 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 @@ -285,10 +200,13 @@ lyrics_title(char *str, size_t size) { if (current.loader != NULL) { snprintf(str, size, "%s (%s)", - _("Lyrics"), _("loading...")); + _("Lyrics"), + /* translators: this message is displayed + while data is retrieved */ + _("loading...")); return str; } else if (current.artist != NULL && current.title != NULL && - current.lines->len > 0) { + !screen_text_is_empty(&text)) { snprintf(str, size, "%s: %s - %s", _("Lyrics"), current.artist, current.title); @@ -300,38 +218,37 @@ lyrics_title(char *str, size_t size) static void lyrics_paint(void) { - list_window_paint(lw, list_callback, NULL); + screen_text_paint(&text); } static bool lyrics_cmd(mpdclient_t *c, command_t cmd) { - if (list_window_scroll_cmd(lw, current.lines->len, cmd)) { - lyrics_repaint(); + if (screen_text_cmd(&text, c, cmd)) return true; - } switch(cmd) { case CMD_INTERRUPT: if (current.loader != NULL) { screen_lyrics_abort(); - screen_lyrics_clear(); + screen_text_clear(&text); } return true; - case CMD_ADD: + case CMD_SAVE_PLAYLIST: if (current.loader == NULL && current.artist != NULL && current.title != NULL && store_lyr_hd() == 0) - screen_status_message (_("Lyrics saved!")); + /* 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_repaint(); + screen_text_repaint(&text); } return true; #ifdef ENABLE_SONG_SCREEN - case CMD_VIEW: + case CMD_SCREEN_SONG: if (current.song != NULL) { screen_song_switch(c, current.song); return true; @@ -339,6 +256,9 @@ lyrics_cmd(mpdclient_t *c, command_t cmd) break; #endif + case CMD_SCREEN_SWAP: + screen_swap(c, current.song); + return true; case CMD_LOCATE: if (current.song != NULL) { @@ -352,15 +272,6 @@ lyrics_cmd(mpdclient_t *c, command_t cmd) break; } - lw->selected = lw->start+lw->rows; - if (screen_find(lw, current.lines->len, - cmd, list_callback, NULL)) { - /* center the row */ - list_window_center(lw, current.lines->len, lw->selected); - lyrics_repaint(); - return true; - } - return false; }