X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_browser.c;h=49827647d6e8f0898032fbad629c3b69b6e3a6e9;hb=0796b270b1699336f29908d11bca92d64da0653c;hp=c946c9d0d7a3d2c9888a4168f985da46a8015088;hpb=f6d4abc72b4b62d5bab4936060c23612903a1fb3;p=ncmpc.git diff --git a/src/screen_browser.c b/src/screen_browser.c index c946c9d..4982764 100644 --- a/src/screen_browser.c +++ b/src/screen_browser.c @@ -1,7 +1,7 @@ /* ncmpc (Ncurses MPD Client) - * (c) 2004-2009 The Music Player Daemon Project + * (c) 2004-2010 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 @@ -18,11 +18,23 @@ */ #include "screen_browser.h" +#include "screen_file.h" +#include "screen_song.h" +#include "screen_lyrics.h" +#include "screen_message.h" +#include "screen_find.h" +#include "screen.h" #include "i18n.h" #include "options.h" #include "charset.h" #include "strfsong.h" -#include "screen_utils.h" +#include "mpdclient.h" +#include "filelist.h" +#include "colors.h" +#include "paint.h" +#include "song_paint.h" + +#include #include @@ -36,50 +48,23 @@ static const char playlist_format[] = "*%s*"; #ifndef NCMPC_MINI -/* clear the highlight flag for all items in the filelist */ -static void -clear_highlights(mpdclient_filelist_t *fl) -{ - guint i; - - for (i = 0; i < filelist_length(fl); ++i) { - struct filelist_entry *entry = filelist_get(fl, i); - - entry->flags &= ~HIGHLIGHT; - } -} - -/* change the highlight flag for a song */ -static void -set_highlight(mpdclient_filelist_t *fl, mpd_Song *song, int highlight) -{ - int i = filelist_find_song(fl, song); - struct filelist_entry *entry; - - if (i < 0) - return; - - entry = filelist_get(fl, i); - if (highlight) - entry->flags |= HIGHLIGHT; - else - entry->flags &= ~HIGHLIGHT; -} - /* sync highlight flags with playlist */ void -sync_highlights(mpdclient_t *c, mpdclient_filelist_t *fl) +screen_browser_sync_highlights(struct filelist *fl, + const struct mpdclient_playlist *playlist) { guint i; for (i = 0; i < filelist_length(fl); ++i) { struct filelist_entry *entry = filelist_get(fl, i); - mpd_InfoEntity *entity = entry->entity; + const struct mpd_entity *entity = entry->entity; - if ( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entity->info.song; + if (entity != NULL && mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) { + const struct mpd_song *song = + mpd_entity_get_song(entity); - if( playlist_get_index_from_file(c, song->file) >= 0 ) + if (playlist_get_index_from_same_song(playlist, + song) >= 0) entry->flags |= HIGHLIGHT; else entry->flags &= ~HIGHLIGHT; @@ -87,74 +72,44 @@ sync_highlights(mpdclient_t *c, mpdclient_filelist_t *fl) } } -/* the playlist has been updated -> fix highlights */ -void -browser_playlist_changed(struct screen_browser *browser, mpdclient_t *c, - int event, gpointer data) -{ - if (browser->filelist == NULL) - return; - - switch(event) { - case PLAYLIST_EVENT_CLEAR: - clear_highlights(browser->filelist); - break; - case PLAYLIST_EVENT_ADD: - set_highlight(browser->filelist, (mpd_Song *) data, 1); - break; - case PLAYLIST_EVENT_DELETE: - set_highlight(browser->filelist, (mpd_Song *) data, 0); - break; - case PLAYLIST_EVENT_MOVE: - break; - default: - sync_highlights(c, browser->filelist); - break; - } -} - #endif /* list_window callback */ -const char * -browser_lw_callback(unsigned idx, bool *highlight, void *data) +static const char * +browser_lw_callback(unsigned idx, void *data) { + const struct filelist *fl = (const struct filelist *) data; static char buf[BUFSIZE]; - mpdclient_filelist_t *fl = (mpdclient_filelist_t *) data; - filelist_entry_t *entry; - mpd_InfoEntity *entity; + const struct filelist_entry *entry; + const struct mpd_entity *entity; - if (idx >= filelist_length(fl)) - return NULL; + assert(fl != NULL); + assert(idx < filelist_length(fl)); entry = filelist_get(fl, idx); assert(entry != NULL); entity = entry->entity; -#ifndef NCMPC_MINI - *highlight = (entry->flags & HIGHLIGHT) != 0; -#else - *highlight = false; -#endif if( entity == NULL ) - return "[..]"; + return ".."; - if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { - mpd_Directory *dir = entity->info.directory; - char *directory = utf8_to_locale(g_basename(dir->path)); - - g_snprintf(buf, BUFSIZE, "[%s]", directory); + if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_DIRECTORY) { + const struct mpd_directory *dir = + mpd_entity_get_directory(entity); + char *directory = utf8_to_locale(g_basename(mpd_directory_get_path(dir))); + g_strlcpy(buf, directory, sizeof(buf)); g_free(directory); return buf; - } else if( entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { - mpd_Song *song = entity->info.song; + } else if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) { + const struct mpd_song *song = mpd_entity_get_song(entity); strfsong(buf, BUFSIZE, options.list_format, song); return buf; - } else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { - mpd_PlaylistFile *plf = entity->info.playlistFile; - char *filename = utf8_to_locale(g_basename(plf->path)); + } else if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_PLAYLIST) { + const struct mpd_playlist *playlist = + mpd_entity_get_playlist(entity); + char *filename = utf8_to_locale(g_basename(mpd_playlist_get_path(playlist))); g_snprintf(buf, BUFSIZE, playlist_format, filename); g_free(filename); @@ -164,119 +119,100 @@ browser_lw_callback(unsigned idx, bool *highlight, void *data) return "Error: Unknown entry!"; } -/* chdir */ -bool -browser_change_directory(struct screen_browser *browser, mpdclient_t *c, - filelist_entry_t *entry, const char *new_path) +static bool +load_playlist(struct mpdclient *c, const struct mpd_playlist *playlist) { - mpd_InfoEntity *entity = NULL; - gchar *path = NULL; - char *old_path; - int idx; - - if( entry!=NULL ) - entity = entry->entity; - else if( new_path==NULL ) - return false; + struct mpd_connection *connection = mpdclient_get_connection(c); - if( entity==NULL ) { - if( entry || 0==strcmp(new_path, "..") ) { - /* return to parent */ - char *parent = g_path_get_dirname(browser->filelist->path); - if( strcmp(parent, ".") == 0 ) - parent[0] = '\0'; - path = g_strdup(parent); - g_free(parent); - } else { - /* entry==NULL, then new_path ("" is root) */ - path = g_strdup(new_path); - } - } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY) { - /* enter sub */ - mpd_Directory *dir = entity->info.directory; - path = g_strdup(dir->path); - } else + if (connection == NULL) return false; - if (browser->filelist != NULL) { - old_path = g_strdup(browser->filelist->path); - filelist_free(browser->filelist); - } else - old_path = NULL; - - browser->filelist = mpdclient_filelist_get(c, path); -#ifndef NCMPC_MINI - sync_highlights(c, browser->filelist); -#endif - - idx = old_path != NULL - ? filelist_find_directory(browser->filelist, old_path) - : -1; - g_free(old_path); - - list_window_reset(browser->lw); - if (idx >= 0) { - list_window_set_selected(browser->lw, idx); - list_window_center(browser->lw, - filelist_length(browser->filelist), idx); - } - - g_free(path); - return true; -} - -static bool -load_playlist(mpdclient_t *c, filelist_entry_t *entry) -{ - mpd_InfoEntity *entity = entry->entity; - mpd_PlaylistFile *plf = entity->info.playlistFile; - char *filename = utf8_to_locale(plf->path); - - if (mpdclient_cmd_load_playlist(c, plf->path) == 0) + if (mpd_run_load(connection, mpd_playlist_get_path(playlist))) { + char *filename = utf8_to_locale(mpd_playlist_get_path(playlist)); screen_status_printf(_("Loading playlist %s..."), g_basename(filename)); - g_free(filename); + g_free(filename); + + c->events |= MPD_IDLE_QUEUE; + } else + mpdclient_handle_error(c); + return true; } static bool -enqueue_and_play(mpdclient_t *c, filelist_entry_t *entry) +enqueue_and_play(struct mpdclient *c, struct filelist_entry *entry) { - int idx; - mpd_InfoEntity *entity = entry->entity; - mpd_Song *song = entity->info.song; + struct mpd_connection *connection = mpdclient_get_connection(c); + const struct mpd_song *song = mpd_entity_get_song(entry->entity); + int id; #ifndef NCMPC_MINI - if (!(entry->flags & HIGHLIGHT)) { + if (!(entry->flags & HIGHLIGHT)) + id = -1; + else #endif - if (mpdclient_cmd_add(c, song) == 0) { - char buf[BUFSIZE]; + id = playlist_get_id_from_same_song(&c->playlist, song); -#ifndef NCMPC_MINI - entry->flags |= HIGHLIGHT; -#endif - strfsong(buf, BUFSIZE, options.list_format, song); - screen_status_printf(_("Adding \'%s\' to playlist"), buf); - mpdclient_update(c); /* get song id */ - } else + if (id < 0) { + char buf[BUFSIZE]; + + id = mpd_run_add_id(connection, mpd_song_get_uri(song)); + if (id < 0) { + mpdclient_handle_error(c); return false; + } + #ifndef NCMPC_MINI - } + entry->flags |= HIGHLIGHT; #endif + strfsong(buf, BUFSIZE, options.list_format, song); + screen_status_printf(_("Adding \'%s\' to playlist"), buf); + } + + if (!mpd_run_play_id(connection, id)) { + mpdclient_handle_error(c); + return false; + } - idx = playlist_get_index_from_file(c, song->file); - mpdclient_cmd_play(c, idx); return true; } -static struct filelist_entry * -browser_get_selected(const struct screen_browser *browser) +struct filelist_entry * +browser_get_selected_entry(const struct screen_browser *browser) { + struct list_window_range range; + + list_window_get_range(browser->lw, &range); + if (browser->filelist == NULL || - browser->lw->selected >= filelist_length(browser->filelist)) + range.end <= range.start || + range.end > range.start + 1 || + range.start >= filelist_length(browser->filelist)) return NULL; - return filelist_get(browser->filelist, browser->lw->selected); + return filelist_get(browser->filelist, range.start); +} + +static const struct mpd_entity * +browser_get_selected_entity(const struct screen_browser *browser) +{ + const struct filelist_entry *entry = browser_get_selected_entry(browser); + + return entry != NULL + ? entry->entity + : NULL; +} + +static const struct mpd_song * +browser_get_selected_song(const struct screen_browser *browser) +{ + const struct mpd_entity *entity = browser_get_selected_entity(browser); + + return entity != NULL && + mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG + ? mpd_entity_get_song(entity) + : NULL; } static struct filelist_entry * @@ -290,39 +226,41 @@ browser_get_index(const struct screen_browser *browser, unsigned i) } static bool -browser_handle_enter(struct screen_browser *browser, mpdclient_t *c) +browser_handle_enter(struct screen_browser *browser, struct mpdclient *c) { - struct filelist_entry *entry = browser_get_selected(browser); - mpd_InfoEntity *entity; + struct filelist_entry *entry = browser_get_selected_entry(browser); + struct mpd_entity *entity; - if( entry==NULL || browser->lw->selected_start < browser->lw->selected_end) + if (entry == NULL) return false; entity = entry->entity; - if (entity == NULL || entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) - return browser_change_directory(browser, c, entry, NULL); - else if (entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) - return load_playlist(c, entry); - else if (entity->type == MPD_INFO_ENTITY_TYPE_SONG) + if (entity == NULL) + return false; + + if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_PLAYLIST) + return load_playlist(c, mpd_entity_get_playlist(entity)); + else if (mpd_entity_get_type(entity) == MPD_ENTITY_TYPE_SONG) return enqueue_and_play(c, entry); return false; } static bool -browser_select_entry(mpdclient_t *c, filelist_entry_t *entry, +browser_select_entry(struct mpdclient *c, struct filelist_entry *entry, G_GNUC_UNUSED gboolean toggle) { assert(entry != NULL); assert(entry->entity != NULL); - if (entry->entity->type == MPD_INFO_ENTITY_TYPE_PLAYLISTFILE) - return load_playlist(c, entry); + if (mpd_entity_get_type(entry->entity) == MPD_ENTITY_TYPE_PLAYLIST) + return load_playlist(c, mpd_entity_get_playlist(entry->entity)); - if (entry->entity->type == MPD_INFO_ENTITY_TYPE_DIRECTORY) { - mpd_Directory *dir = entry->entity->info.directory; + if (mpd_entity_get_type(entry->entity) == MPD_ENTITY_TYPE_DIRECTORY) { + const struct mpd_directory *dir = + mpd_entity_get_directory(entry->entity); - if (mpdclient_cmd_add_path(c, dir->path) == 0) { - char *tmp = utf8_to_locale(dir->path); + if (mpdclient_cmd_add_path(c, mpd_directory_get_path(dir))) { + char *tmp = utf8_to_locale(mpd_directory_get_path(dir)); screen_status_printf(_("Adding \'%s\' to playlist"), tmp); g_free(tmp); @@ -331,22 +269,21 @@ browser_select_entry(mpdclient_t *c, filelist_entry_t *entry, return true; } - if (entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + if (mpd_entity_get_type(entry->entity) != MPD_ENTITY_TYPE_SONG) return false; - assert(entry->entity->info.song != NULL); - #ifndef NCMPC_MINI if (!toggle || (entry->flags & HIGHLIGHT) == 0) #endif { - mpd_Song *song = entry->entity->info.song; + const struct mpd_song *song = + mpd_entity_get_song(entry->entity); #ifndef NCMPC_MINI entry->flags |= HIGHLIGHT; #endif - if (mpdclient_cmd_add(c, song) == 0) { + if (mpdclient_cmd_add(c, song)) { char buf[BUFSIZE]; strfsong(buf, BUFSIZE, options.list_format, song); @@ -355,12 +292,14 @@ browser_select_entry(mpdclient_t *c, filelist_entry_t *entry, #ifndef NCMPC_MINI } else { /* remove song from playlist */ - mpd_Song *song = entry->entity->info.song; + const struct mpd_song *song = + mpd_entity_get_song(entry->entity); int idx; entry->flags &= ~HIGHLIGHT; - while ((idx = playlist_get_index_from_file(c, song->file)) >=0) + while ((idx = playlist_get_index_from_same_song(&c->playlist, + song)) >= 0) mpdclient_cmd_delete(c, idx); #endif } @@ -369,55 +308,44 @@ browser_select_entry(mpdclient_t *c, filelist_entry_t *entry, } static bool -browser_handle_select(struct screen_browser *browser, mpdclient_t *c) +browser_handle_select(struct screen_browser *browser, struct mpdclient *c) { + struct list_window_range range; struct filelist_entry *entry; + bool success = false; - if (browser->lw->visual_selection) { - for (unsigned i = browser->lw->selected_start; - i <= browser->lw->selected_end; i++) { - entry = browser_get_index(browser, i); + list_window_get_range(browser->lw, &range); + for (unsigned i = range.start; i < range.end; ++i) { + entry = browser_get_index(browser, i); - if (entry != NULL && entry->entity != NULL) - browser_select_entry(c, entry, TRUE); - } - return false; - } else { - entry = browser_get_selected(browser); - - if (entry == NULL || entry->entity == NULL) - return false; - - return browser_select_entry(c, entry, TRUE); + if (entry != NULL && entry->entity != NULL) + success = browser_select_entry(c, entry, TRUE); } + + return range.end == range.start + 1 && success; } static bool -browser_handle_add(struct screen_browser *browser, mpdclient_t *c) +browser_handle_add(struct screen_browser *browser, struct mpdclient *c) { + struct list_window_range range; struct filelist_entry *entry; + bool success = false; - if (browser->lw->visual_selection) { - for (unsigned i = browser->lw->selected_start; - i <= browser->lw->selected_end; i++) { - entry = browser_get_index(browser, i); - - if (entry != NULL && entry->entity != NULL) - browser_select_entry(c, entry, FALSE); - } - return false; - } else { - entry = browser_get_selected(browser); - - if (entry == NULL || entry->entity == NULL) - return false; + list_window_get_range(browser->lw, &range); + for (unsigned i = range.start; i < range.end; ++i) { + entry = browser_get_index(browser, i); - return browser_select_entry(c, entry, FALSE); + if (entry != NULL && entry->entity != NULL) + success = browser_select_entry(c, entry, FALSE) || + success; } + + return range.end == range.start + 1 && success; } static void -browser_handle_select_all(struct screen_browser *browser, mpdclient_t *c) +browser_handle_select_all(struct screen_browser *browser, struct mpdclient *c) { guint i; @@ -434,24 +362,17 @@ browser_handle_select_all(struct screen_browser *browser, mpdclient_t *c) #ifdef HAVE_GETMOUSE static int -browser_handle_mouse_event(struct screen_browser *browser, mpdclient_t *c) +browser_handle_mouse_event(struct screen_browser *browser, struct mpdclient *c) { int row; unsigned prev_selected = browser->lw->selected; unsigned long bstate; - int length; - - if (browser->filelist) - length = filelist_length(browser->filelist); - else - length = 0; if (screen_get_mouse_event(c, &bstate, &row) || - list_window_mouse(browser->lw, length, bstate, row)) + list_window_mouse(browser->lw, bstate, row)) return 1; - browser->lw->selected = browser->lw->start + row; - list_window_check_selected(browser->lw, length); + list_window_set_cursor(browser->lw, browser->lw->start + row); if( bstate & BUTTON1_CLICKED ) { if (prev_selected == browser->lw->selected) @@ -465,47 +386,33 @@ browser_handle_mouse_event(struct screen_browser *browser, mpdclient_t *c) } #endif +static void +screen_browser_paint_callback(WINDOW *w, unsigned i, unsigned y, + unsigned width, bool selected, void *data); + bool browser_cmd(struct screen_browser *browser, struct mpdclient *c, command_t cmd) { - struct filelist_entry *entry; - - switch (cmd) { - case CMD_PLAY: - browser_handle_enter(browser, c); - return true; - - case CMD_SELECT: - if (browser_handle_select(browser, c)) - /* continue and select next item... */ - cmd = CMD_LIST_NEXT; - - /* call list_window_cmd to go to the next item */ - break; - - case CMD_ADD: - if (browser_handle_add(browser, c)) - /* continue and select next item... */ - cmd = CMD_LIST_NEXT; + const struct mpd_song *song; - /* call list_window_cmd to go to the next item */ - break; + if (browser->filelist == NULL) + return false; - case CMD_SELECT_ALL: - browser_handle_select_all(browser, c); + if (list_window_cmd(browser->lw, cmd)) return true; + switch (cmd) { case CMD_LIST_FIND: case CMD_LIST_RFIND: case CMD_LIST_FIND_NEXT: case CMD_LIST_RFIND_NEXT: - screen_find(browser->lw, filelist_length(browser->filelist), - cmd, browser_lw_callback, + screen_find(browser->lw, cmd, browser_lw_callback, browser->filelist); return true; case CMD_LIST_JUMP: - screen_jump(browser->lw, browser_lw_callback, browser->filelist); + screen_jump(browser->lw, browser_lw_callback, + screen_browser_paint_callback, browser->filelist); return true; #ifdef HAVE_GETMOUSE @@ -516,53 +423,149 @@ browser_cmd(struct screen_browser *browser, #ifdef ENABLE_SONG_SCREEN case CMD_SCREEN_SONG: - entry = browser_get_selected(browser); - if (entry == NULL || entry->entity == NULL || - entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) + song = browser_get_selected_song(browser); + if (song == NULL) return false; - screen_song_switch(c, entry->entity->info.song); + screen_song_switch(c, song); return true; #endif - case CMD_LOCATE: - entry = browser_get_selected(browser); - if (entry == NULL || entry->entity == NULL || - entry->entity->type != MPD_INFO_ENTITY_TYPE_SONG) - return false; - - screen_file_goto_song(c, entry->entity->info.song); - return true; - #ifdef ENABLE_LYRICS_SCREEN case CMD_SCREEN_LYRICS: - entry = browser_get_selected(browser); - if (entry == NULL) + song = browser_get_selected_song(browser); + if (song == 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); + screen_lyrics_switch(c, song, false); return true; #endif case CMD_SCREEN_SWAP: - entry = browser_get_selected(browser); - if (entry->entity != NULL && - entry->entity->type == MPD_INFO_ENTITY_TYPE_SONG) - screen_swap(c, entry->entity->info.song); - else - screen_swap(c, NULL); + screen_swap(c, browser_get_selected_song(browser)); return true; default: break; } - if (list_window_cmd(browser->lw, filelist_length(browser->filelist), - cmd)) + if (!mpdclient_is_connected(c)) + return false; + + switch (cmd) { + case CMD_PLAY: + browser_handle_enter(browser, c); + return true; + + case CMD_SELECT: + if (browser_handle_select(browser, c)) + list_window_cmd(browser->lw, CMD_LIST_NEXT); + return true; + + case CMD_ADD: + if (browser_handle_add(browser, c)) + list_window_cmd(browser->lw, CMD_LIST_NEXT); + return true; + + case CMD_SELECT_ALL: + browser_handle_select_all(browser, c); return true; + case CMD_LOCATE: + song = browser_get_selected_song(browser); + if (song == NULL) + return false; + + screen_file_goto_song(c, song); + return true; + + default: + break; + } + return false; } + +void +screen_browser_paint_directory(WINDOW *w, unsigned width, + bool selected, const char *name) +{ + row_color(w, COLOR_DIRECTORY, selected); + + waddch(w, '['); + waddstr(w, name); + waddch(w, ']'); + + /* erase the unused space after the text */ + row_clear_to_eol(w, width, selected); +} + +static void +screen_browser_paint_playlist(WINDOW *w, unsigned width, + bool selected, const char *name) +{ + row_paint_text(w, width, COLOR_PLAYLIST, selected, name); +} + +static void +screen_browser_paint_callback(WINDOW *w, unsigned i, + unsigned y, unsigned width, + bool selected, void *data) +{ + const struct filelist *fl = (const struct filelist *) data; + const struct filelist_entry *entry; + const struct mpd_entity *entity; + bool highlight; + const struct mpd_directory *directory; + const struct mpd_playlist *playlist; + char *p; + + assert(fl != NULL); + assert(i < filelist_length(fl)); + + entry = filelist_get(fl, i); + assert(entry != NULL); + + entity = entry->entity; + if (entity == NULL) { + screen_browser_paint_directory(w, width, selected, ".."); + return; + } + +#ifndef NCMPC_MINI + highlight = (entry->flags & HIGHLIGHT) != 0; +#else + highlight = false; +#endif + + switch (mpd_entity_get_type(entity)) { + case MPD_ENTITY_TYPE_DIRECTORY: + directory = mpd_entity_get_directory(entity); + p = utf8_to_locale(g_basename(mpd_directory_get_path(directory))); + screen_browser_paint_directory(w, width, selected, p); + g_free(p); + break; + + case MPD_ENTITY_TYPE_SONG: + paint_song_row(w, y, width, selected, highlight, + mpd_entity_get_song(entity), NULL); + break; + + case MPD_ENTITY_TYPE_PLAYLIST: + playlist = mpd_entity_get_playlist(entity); + p = utf8_to_locale(g_basename(mpd_playlist_get_path(playlist))); + screen_browser_paint_playlist(w, width, selected, p); + g_free(p); + break; + + default: + row_paint_text(w, width, highlight ? COLOR_LIST_BOLD : COLOR_LIST, + selected, ""); + } +} + +void +screen_browser_paint(const struct screen_browser *browser) +{ + list_window_paint2(browser->lw, screen_browser_paint_callback, + browser->filelist); +}