diff options
author | Kalle Wallin <kaw@linux.se> | 2004-06-14 18:32:31 +0000 |
---|---|---|
committer | Kalle Wallin <kaw@linux.se> | 2004-06-14 18:32:31 +0000 |
commit | 39758c8503fb5390afaceeff3dd5b0bca75feb97 (patch) | |
tree | 94f42a18c5cb0da8778e8525ded49fb98012bbfc /src/screen_file.c | |
parent | 7844008980d4d1b9cb7cbd4dda4ae912e12dd7a9 (diff) | |
download | mpd-39758c8503fb5390afaceeff3dd5b0bca75feb97.tar.gz mpd-39758c8503fb5390afaceeff3dd5b0bca75feb97.tar.xz mpd-39758c8503fb5390afaceeff3dd5b0bca75feb97.zip |
Major cleanup of the mpd client code (mpc->mpdclient)
git-svn-id: https://svn.musicpd.org/ncmpc/trunk@1481 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to '')
-rw-r--r-- | src/screen_file.c | 396 |
1 files changed, 251 insertions, 145 deletions
diff --git a/src/screen_file.c b/src/screen_file.c index 8b7577fdf..f4a8c3dc0 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -27,55 +27,180 @@ #include "config.h" #include "ncmpc.h" #include "support.h" -#include "libmpdclient.h" -#include "mpc.h" +#include "mpdclient.h" +#include "strfsong.h" #include "command.h" #include "screen.h" #include "screen_utils.h" -#include "screen_play.h" -#include "screen_file.h" -#define BUFSIZE 1024 -#define TITLESIZE 256 #define USE_OLD_LAYOUT -static list_window_t *lw; -static mpd_client_t *mpc = NULL; +#define BUFSIZE 1024 + +#define HIGHLIGHT (0x01) + + +static list_window_t *lw = NULL; +static GList *lw_state_list = NULL; +static mpdclient_filelist_t *filelist = NULL; + + + +/* clear the highlight flag for all items in the filelist */ +static void +clear_highlights(mpdclient_filelist_t *filelist) +{ + GList *list = g_list_first(filelist->list); + + while( list ) + { + filelist_entry_t *entry = list->data; + + entry->flags &= ~HIGHLIGHT; + list = list->next; + } +} + +/* change the highlight flag for a song */ +static void +set_highlight(mpdclient_filelist_t *filelist, mpd_Song *song, int highlight) +{ + GList *list = g_list_first(filelist->list); + + if( !song ) + return; + + while( list ) + { + filelist_entry_t *entry = list->data; + mpd_InfoEntity *entity = entry->entity; + + if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) + { + mpd_Song *song2 = entity->info.song; + + if( strcmp(song->file, song2->file) == 0 ) + { + if(highlight) + entry->flags |= HIGHLIGHT; + else + entry->flags &= ~HIGHLIGHT; + } + } + list = list->next; + } +} + +/* sync highlight flags with playlist */ +static void +sync_highlights(mpdclient_t *c, mpdclient_filelist_t *filelist) +{ + GList *list = g_list_first(filelist->list); + + while(list) + { + filelist_entry_t *entry = list->data; + mpd_InfoEntity *entity = entry->entity; + + if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) + { + mpd_Song *song = entity->info.song; + + if( playlist_get_index_from_file(c, song->file) >= 0 ) + entry->flags |= HIGHLIGHT; + else + entry->flags &= ~HIGHLIGHT; + } + list=list->next; + } +} + +/* the db have changed -> update the filelist */ +static void +file_changed_callback(mpdclient_t *c, int event, gpointer data) +{ + D("screen_file.c> filelist_callback() [%d]\n", event); + filelist = mpdclient_filelist_update(c, filelist); + sync_highlights(c, filelist); + list_window_check_selected(lw, filelist->length); +} + +/* the playlist have been updated -> fix highlights */ +static void +playlist_changed_callback(mpdclient_t *c, int event, gpointer data) +{ + D("screen_file.c> playlist_callback() [%d]\n", event); + switch(event) + { + case PLAYLIST_EVENT_CLEAR: + clear_highlights(filelist); + break; + case PLAYLIST_EVENT_ADD: + set_highlight(filelist, (mpd_Song *) data, 1); + break; + case PLAYLIST_EVENT_DELETE: + set_highlight(filelist, (mpd_Song *) data, 0); + break; + case PLAYLIST_EVENT_MOVE: + break; + default: + sync_highlights(c, filelist); + break; + } +} + +/* store current state when entering a subdirectory */ +static void +push_lw_state(void) +{ + list_window_t *tmp = g_malloc(sizeof(list_window_t)); + + memcpy(tmp, lw, sizeof(list_window_t)); + lw_state_list = g_list_prepend(lw_state_list, (gpointer) tmp); +} + +/* get previous state when leaving a directory */ +static void +pop_lw_state(void) +{ + if( lw_state_list ) + { + list_window_t *tmp = lw_state_list->data; + + memcpy(lw, tmp, sizeof(list_window_t)); + g_free(tmp); + lw_state_list->data = NULL; + lw_state_list = g_list_delete_link(lw_state_list, lw_state_list); + } +} +/* list_window callback */ static char * list_callback(int index, int *highlight, void *data) { static char buf[BUFSIZE]; - mpd_client_t *c = (mpd_client_t *) data; + //mpdclient_t *c = (mpdclient_t *) data; filelist_entry_t *entry; mpd_InfoEntity *entity; *highlight = 0; - if( (entry=(filelist_entry_t *) g_list_nth_data(c->filelist, index))==NULL ) + if( (entry=(filelist_entry_t *)g_list_nth_data(filelist->list,index))==NULL ) return NULL; entity = entry->entity; - *highlight = entry->selected; + *highlight = (entry->flags & HIGHLIGHT); if( entity == NULL ) { -#ifdef USE_OLD_LAYOUT return "[..]"; -#else - return "d .."; -#endif } if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { mpd_Directory *dir = entity->info.directory; char *dirname = utf8_to_locale(basename(dir->path)); -#ifdef USE_OLD_LAYOUT snprintf(buf, BUFSIZE, "[%s]", dirname); -#else - snprintf(buf, BUFSIZE, "d %s", dirname); -#endif g_free(dirname); return buf; } @@ -83,13 +208,8 @@ list_callback(int index, int *highlight, void *data) { mpd_Song *song = entity->info.song; -#ifdef USE_OLD_LAYOUT - return mpc_get_song_name(song); -#else - snprintf(buf, BUFSIZE, "m %s", mpc_get_song_name(song)); + strfsong(buf, BUFSIZE, LIST_FORMAT, song); return buf; -#endif - } else if( entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { @@ -98,8 +218,8 @@ list_callback(int index, int *highlight, void *data) #ifdef USE_OLD_LAYOUT snprintf(buf, BUFSIZE, "*%s*", filename); -#else - snprintf(buf, BUFSIZE, "p %s", filename); +#else + snprintf(buf, BUFSIZE, "<Playlist> %s", filename); #endif g_free(filename); return buf; @@ -107,56 +227,62 @@ list_callback(int index, int *highlight, void *data) return "Error: Unknow entry!"; } +/* chdir */ static int -change_directory(screen_t *screen, mpd_client_t *c, filelist_entry_t *entry) +change_directory(screen_t *screen, mpdclient_t *c, filelist_entry_t *entry) { mpd_InfoEntity *entity = entry->entity; + gchar *path = NULL; if( entity==NULL ) { - char *parent = g_path_get_dirname(c->cwd); - - if( strcmp(parent,".") == 0 ) + /* return to parent */ + char *parent = g_path_get_dirname(filelist->path); + if( strcmp(parent, ".") == 0 ) { parent[0] = '\0'; } - if( c->cwd ) - g_free(c->cwd); - c->cwd = parent; + path = g_strdup(parent); + list_window_reset(lw); + /* restore previous list window state */ + pop_lw_state(); } else if( entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY) { + /* enter sub */ mpd_Directory *dir = entity->info.directory; - if( c->cwd ) - g_free(c->cwd); - c->cwd = g_strdup(dir->path); + path = utf8_to_locale(dir->path); + /* save current list window state */ + push_lw_state(); + list_window_reset(lw); } else return -1; - - mpc_update_filelist(c); - list_window_reset(lw); + + filelist = mpdclient_filelist_free(filelist); + filelist = mpdclient_filelist_get(c, path); + sync_highlights(c, filelist); + list_window_check_selected(lw, filelist->length); + g_free(path); return 0; } static int -load_playlist(screen_t *screen, mpd_client_t *c, filelist_entry_t *entry) +load_playlist(screen_t *screen, mpdclient_t *c, filelist_entry_t *entry) { mpd_InfoEntity *entity = entry->entity; mpd_PlaylistFile *plf = entity->info.playlistFile; - char *filename = utf8_to_locale(basename(plf->path)); - - mpd_sendLoadCommand(c->connection, plf->path); - mpd_finishCommand(c->connection); + char *filename = utf8_to_locale(plf->path); - screen_status_printf(_("Loading playlist %s..."), filename); + if( mpdclient_cmd_load_playlist(c, plf->path) == 0 ) + screen_status_printf(_("Loading playlist %s..."), basename(filename)); g_free(filename); return 0; } static int -handle_delete(screen_t *screen, mpd_client_t *c) +handle_delete(screen_t *screen, mpdclient_t *c) { filelist_entry_t *entry; mpd_InfoEntity *entity; @@ -164,7 +290,7 @@ handle_delete(screen_t *screen, mpd_client_t *c) char *str, buf[BUFSIZE]; int key; - entry = ( filelist_entry_t *) g_list_nth_data(c->filelist, lw->selected); + entry=( filelist_entry_t *) g_list_nth_data(filelist->list,lw->selected); if( entry==NULL || entry->entity==NULL ) return -1; @@ -190,30 +316,23 @@ handle_delete(screen_t *screen, mpd_client_t *c) return 0; } - mpd_sendRmCommand(c->connection, plf->path); - mpd_finishCommand(c->connection); - if( mpc_error(c)) + if( mpdclient_cmd_delete_playlist(c, plf->path) ) { - str = utf8_to_locale(mpc_error_str(c)); - screen_status_printf("Error: %s", str); - g_free(str); beep(); return -1; } screen_status_printf(_("Playlist deleted!")); - mpc_update_filelist(c); - list_window_check_selected(lw, c->filelist_length); return 0; } static int -handle_play_cmd(screen_t *screen, mpd_client_t *c) +handle_enter(screen_t *screen, mpdclient_t *c) { filelist_entry_t *entry; mpd_InfoEntity *entity; - entry = ( filelist_entry_t *) g_list_nth_data(c->filelist, lw->selected); + entry = ( filelist_entry_t *) g_list_nth_data(filelist->list, lw->selected); if( entry==NULL ) return -1; @@ -225,8 +344,12 @@ handle_play_cmd(screen_t *screen, mpd_client_t *c) return -1; } + +/* NOTE - The add_directory functions should move to mpdclient.c */ +extern gint mpdclient_finish_command(mpdclient_t *c); + static int -add_directory(mpd_client_t *c, char *dir) +add_directory(mpdclient_t *c, char *dir) { mpd_InfoEntity *entity; GList *subdir_list = NULL; @@ -257,7 +380,8 @@ add_directory(mpd_client_t *c, char *dir) mpd_freeInfoEntity(entity); } mpd_sendCommandListEnd(c->connection); - mpd_finishCommand(c->connection); + mpdclient_finish_command(c); + c->need_update = TRUE; list = g_list_first(subdir_list); while( list!=NULL ) @@ -276,14 +400,17 @@ add_directory(mpd_client_t *c, char *dir) } static int -handle_select(screen_t *screen, mpd_client_t *c) +handle_select(screen_t *screen, mpdclient_t *c) { filelist_entry_t *entry; - entry = ( filelist_entry_t *) g_list_nth_data(c->filelist, lw->selected); + entry=( filelist_entry_t *) g_list_nth_data(filelist->list, lw->selected); if( entry==NULL || entry->entity==NULL) return -1; + if( entry->entity->type==MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) + return load_playlist(screen, c, entry); + if( entry->entity->type==MPD_INFO_ENTITY_TYPE_DIRECTORY ) { mpd_Directory *dir = entry->entity->info.directory; @@ -294,18 +421,24 @@ handle_select(screen_t *screen, mpd_client_t *c) if( entry->entity->type!=MPD_INFO_ENTITY_TYPE_SONG ) return -1; - entry->selected = !entry->selected; + if( entry->flags & HIGHLIGHT ) + entry->flags &= ~HIGHLIGHT; + else + entry->flags |= HIGHLIGHT; - if( entry->selected ) + if( entry->flags & HIGHLIGHT ) { if( entry->entity->type==MPD_INFO_ENTITY_TYPE_SONG ) { mpd_Song *song = entry->entity->info.song; - playlist_add_song(c, song); - - screen_status_printf(_("Adding \'%s\' to playlist\n"), - mpc_get_song_name(song)); + if( mpdclient_cmd_add(c, song) == 0 ) + { + char buf[BUFSIZE]; + + strfsong(buf, BUFSIZE, LIST_FORMAT, song); + screen_status_printf(_("Adding \'%s\' to playlist\n"), buf); + } } } else @@ -317,10 +450,10 @@ handle_select(screen_t *screen, mpd_client_t *c) if( song ) { - int index = mpc_playlist_get_song_index(c, song->file); + int index = playlist_get_index_from_file(c, song->file); - while( (index=mpc_playlist_get_song_index(c, song->file))>=0 ) - playlist_delete_song(c, index); + while( (index=playlist_get_index_from_file(c, song->file))>=0 ) + mpdclient_cmd_delete(c, index); } } } @@ -328,53 +461,64 @@ handle_select(screen_t *screen, mpd_client_t *c) } static void -file_init(WINDOW *w, int cols, int rows) +browse_init(WINDOW *w, int cols, int rows) { lw = list_window_init(w, cols, rows); } static void -file_resize(int cols, int rows) +browse_resize(int cols, int rows) { lw->cols = cols; lw->rows = rows; } static void -file_exit(void) +browse_exit(void) { + if( lw_state_list ) + { + GList *list = lw_state_list; + while( list ) + { + g_free(list->data); + list->data = NULL; + list = list->next; + } + g_list_free(lw_state_list); + lw_state_list = NULL; + + } + if( filelist ) + filelist = mpdclient_filelist_free(filelist); list_window_free(lw); } static void -file_open(screen_t *screen, mpd_client_t *c) +browse_open(screen_t *screen, mpdclient_t *c) { - if( c->filelist == NULL ) + if( filelist == NULL ) { - mpc_update_filelist(c); + filelist = mpdclient_filelist_get(c, ""); + mpdclient_install_playlist_callback(c, playlist_changed_callback); + mpdclient_install_browse_callback(c, file_changed_callback); } - mpc = c; } static void -file_close(void) +browse_close(void) { } static char * -file_title(char *str, size_t size) +browse_title(char *str, size_t size) { - char *tmp; - - tmp = utf8_to_locale(basename(mpc->cwd)); - snprintf(str, size, _("Browse: %s"), tmp); - g_free(tmp); - + snprintf(str, size, _("Browse: %s"), basename(filelist->path)); return str; } static void -file_paint(screen_t *screen, mpd_client_t *c) +browse_paint(screen_t *screen, mpdclient_t *c) { lw->clear = 1; @@ -383,12 +527,12 @@ file_paint(screen_t *screen, mpd_client_t *c) } static void -file_update(screen_t *screen, mpd_client_t *c) +browse_update(screen_t *screen, mpdclient_t *c) { - if( c->filelist_updated ) + if( filelist->updated ) { - file_paint(screen, c); - c->filelist_updated = 0; + browse_paint(screen, c); + filelist->updated = FALSE; return; } list_window_paint(lw, list_callback, (void *) c); @@ -397,12 +541,12 @@ file_update(screen_t *screen, mpd_client_t *c) static int -file_cmd(screen_t *screen, mpd_client_t *c, command_t cmd) +browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) { switch(cmd) { case CMD_PLAY: - handle_play_cmd(screen, c); + handle_enter(screen, c); return 1; case CMD_SELECT: if( handle_select(screen, c) == 0 ) @@ -415,8 +559,8 @@ file_cmd(screen_t *screen, mpd_client_t *c, command_t cmd) handle_delete(screen, c); break; case CMD_SCREEN_UPDATE: - mpc_update_filelist(c); - list_window_check_selected(lw, c->filelist_length); + filelist = mpdclient_filelist_update(c, filelist); + list_window_check_selected(lw, filelist->length); screen_status_printf(_("Screen updated!")); return 1; case CMD_LIST_FIND: @@ -424,12 +568,12 @@ file_cmd(screen_t *screen, mpd_client_t *c, command_t cmd) case CMD_LIST_FIND_NEXT: case CMD_LIST_RFIND_NEXT: return screen_find(screen, c, - lw, c->filelist_length, + lw, filelist->length, cmd, list_callback); default: break; } - return list_window_cmd(lw, c->filelist_length, cmd); + return list_window_cmd(lw, filelist->length, cmd); } @@ -440,62 +584,24 @@ get_filelist_window() } -void -file_clear_highlights(mpd_client_t *c) -{ - GList *list = g_list_first(c->filelist); - - while( list ) - { - filelist_entry_t *entry = list->data; - - entry->selected = 0; - list = list->next; - } -} - -void -file_set_highlight(mpd_client_t *c, mpd_Song *song, int highlight) -{ - GList *list = g_list_first(c->filelist); - - if( !song ) - return; - - while( list ) - { - filelist_entry_t *entry = list->data; - mpd_InfoEntity *entity = entry->entity; - if( entity && entity->type==MPD_INFO_ENTITY_TYPE_SONG ) - { - mpd_Song *song2 = entity->info.song; - - if( strcmp(song->file, song2->file) == 0 ) - { - entry->selected = highlight; - } - } - list = list->next; - } -} screen_functions_t * -get_screen_file(void) +get_screen_browse(void) { static screen_functions_t functions; memset(&functions, 0, sizeof(screen_functions_t)); - functions.init = file_init; - functions.exit = file_exit; - functions.open = file_open; - functions.close = file_close; - functions.resize = file_resize; - functions.paint = file_paint; - functions.update = file_update; - functions.cmd = file_cmd; + functions.init = browse_init; + functions.exit = browse_exit; + functions.open = browse_open; + functions.close = browse_close; + functions.resize = browse_resize; + functions.paint = browse_paint; + functions.update = browse_update; + functions.cmd = browse_cmd; functions.get_lw = get_filelist_window; - functions.get_title = file_title; + functions.get_title = browse_title; return &functions; } |