X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fscreen_file.c;h=1f39395c9d839e1c96d896609ccf054e6f3d25ac;hb=61b081d64d4135698b56f63c931da60c64511e3c;hp=05e8ad29924441607e0ffe2935353373262a4955;hpb=e4a12c7faadb9ed9ddffa6164ea27813716fdce4;p=ncmpc.git diff --git a/src/screen_file.c b/src/screen_file.c index 05e8ad2..1f39395 100644 --- a/src/screen_file.c +++ b/src/screen_file.c @@ -17,55 +17,55 @@ */ #include "config.h" -#include "ncmpc.h" +#include "i18n.h" #include "options.h" -#include "support.h" +#include "charset.h" #include "mpdclient.h" #include "command.h" #include "screen.h" #include "screen_utils.h" #include "screen_browser.h" #include "screen_play.h" -#include "gcc.h" #include #include #include #include -#include static struct screen_browser browser; static void -browse_paint(mpdclient_t *c); +browse_paint(void); static void file_repaint(void) { - browse_paint(NULL); + browse_paint(); wrefresh(browser.lw->w); } static void file_repaint_if_active(void) { - if (get_cur_mode_id() == 1) /* XXX don't use the literal number */ + if (screen_is_visible(&screen_browse)) file_repaint(); } /* the db have changed -> update the filelist */ static void -file_changed_callback(mpdclient_t *c, mpd_unused int event, - mpd_unused gpointer data) +file_changed_callback(mpdclient_t *c, G_GNUC_UNUSED int event, + G_GNUC_UNUSED gpointer data) { - D("screen_file.c> filelist_callback() [%d]\n", event); browser.filelist = mpdclient_filelist_update(c, browser.filelist); +#ifndef NCMPC_MINI sync_highlights(c, browser.filelist); +#endif list_window_check_selected(browser.lw, filelist_length(browser.filelist)); file_repaint_if_active(); } +#ifndef NCMPC_MINI /* the playlist have been updated -> fix highlights */ static void playlist_changed_callback(mpdclient_t *c, int event, gpointer data) @@ -74,12 +74,14 @@ playlist_changed_callback(mpdclient_t *c, int event, gpointer data) file_repaint_if_active(); } +#endif static int -handle_save(screen_t *screen, mpdclient_t *c) +handle_save(mpdclient_t *c) { filelist_entry_t *entry; char *defaultname = NULL; + int ret; if (browser.lw->selected >= filelist_length(browser.filelist)) return -1; @@ -93,11 +95,15 @@ handle_save(screen_t *screen, mpdclient_t *c) } } - return playlist_save(screen, c, NULL, defaultname); + defaultname = utf8_to_locale(defaultname); + ret = playlist_save(c, NULL, defaultname); + g_free(defaultname); + + return ret; } static int -handle_delete(screen_t *screen, mpdclient_t *c) +handle_delete(mpdclient_t *c) { filelist_entry_t *entry; mpd_InfoEntity *entity; @@ -115,28 +121,26 @@ handle_delete(screen_t *screen, mpdclient_t *c) entity = entry->entity; if( entity->type!=MPD_INFO_ENTITY_TYPE_PLAYLISTFILE ) { - screen_status_printf(_("You can only delete playlists!")); + screen_status_printf(_("You can only delete playlists")); screen_bell(); return -1; } plf = entity->info.playlistFile; - str = utf8_to_locale(basename(plf->path)); + str = utf8_to_locale(g_basename(plf->path)); buf = g_strdup_printf(_("Delete playlist %s [%s/%s] ? "), str, YES, NO); g_free(str); - key = tolower(screen_getch(screen->status_window.w, buf)); + key = tolower(screen_getch(screen.status_window.w, buf)); g_free(buf); - if( key==KEY_RESIZE ) - screen_resize(); if( key != YES[0] ) { - screen_status_printf(_("Aborted!")); + screen_status_printf(_("Aborted")); return 0; } - if( mpdclient_cmd_delete_playlist_utf8(c, plf->path) ) + if( mpdclient_cmd_delete_playlist(c, plf->path) ) return -1; - screen_status_printf(_("Playlist deleted!")); + screen_status_printf(_("Playlist deleted")); return 0; } @@ -144,7 +148,6 @@ static void browse_init(WINDOW *w, int cols, int rows) { browser.lw = list_window_init(w, cols, rows); - browser.lw_state = list_window_init_state(); } static void @@ -160,15 +163,16 @@ browse_exit(void) if (browser.filelist) filelist_free(browser.filelist); list_window_free(browser.lw); - list_window_free_state(browser.lw_state); } static void -browse_open(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) +browse_open(G_GNUC_UNUSED mpdclient_t *c) { if (browser.filelist == NULL) { browser.filelist = mpdclient_filelist_get(c, ""); +#ifndef NCMPC_MINI mpdclient_install_playlist_callback(c, playlist_changed_callback); +#endif mpdclient_install_browse_callback(c, file_changed_callback); } } @@ -176,80 +180,81 @@ browse_open(mpd_unused screen_t *screen, mpd_unused mpdclient_t *c) static const char * browse_title(char *str, size_t size) { - char *pathcopy; - char *parentdir; - - pathcopy = strdup(browser.filelist->path); - parentdir = dirname(pathcopy); - parentdir = basename(parentdir); + const char *path = NULL, *prev = NULL, *slash = browser.filelist->path; + char *path_locale; - if( parentdir[0] == '.' && strlen(parentdir) == 1 ) { - parentdir = NULL; + /* determine the last 2 parts of the path */ + while ((slash = strchr(slash, '/')) != NULL) { + path = prev; + prev = ++slash; } - g_snprintf(str, size, _("Browse: %s%s%s"), - parentdir ? parentdir : "", - parentdir ? "/" : "", - basename(browser.filelist->path)); - free(pathcopy); + if (path == NULL) + /* fall back to full path */ + path = browser.filelist->path; + + path_locale = utf8_to_locale(path); + g_snprintf(str, size, _("Browse: %s"), path_locale); + g_free(path_locale); return str; } static void -browse_paint(mpd_unused mpdclient_t *c) +browse_paint(void) { list_window_paint(browser.lw, browser_lw_callback, browser.filelist); } -static int -browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) +static bool +browse_cmd(mpdclient_t *c, command_t cmd) { switch(cmd) { - case CMD_PLAY: - browser_handle_enter(&browser, c); - file_repaint(); - return 1; case CMD_GO_ROOT_DIRECTORY: browser_change_directory(&browser, c, NULL, ""); file_repaint(); - return 1; + return true; case CMD_GO_PARENT_DIRECTORY: browser_change_directory(&browser, c, NULL, ".."); file_repaint(); - return 1; - case CMD_SELECT: - if (browser_handle_select(&browser, c) == 0) { - /* continue and select next item... */ - cmd = CMD_LIST_NEXT; - } - break; + return true; + + case CMD_LOCATE: + /* don't let browser_cmd() evaluate the locate command + - it's a no-op, and by the way, leads to a + segmentation fault in the current implementation */ + return false; + case CMD_DELETE: - handle_delete(screen, c); + handle_delete(c); file_repaint(); break; case CMD_SAVE_PLAYLIST: - handle_save(screen, c); + handle_save(c); break; case CMD_SCREEN_UPDATE: browser.filelist = mpdclient_filelist_update(c, browser.filelist); +#ifndef NCMPC_MINI + sync_highlights(c, browser.filelist); +#endif list_window_check_selected(browser.lw, filelist_length(browser.filelist)); file_repaint(); - - screen_status_printf(_("Screen updated!")); - return 0; + return false; case CMD_DB_UPDATE: if (c->status == NULL) - return 1; + return true; if (!c->status->updatingDb) { - if (mpdclient_cmd_db_update_utf8(c, browser.filelist->path) == 0) { - if (strcmp(browser.filelist->path, "")) - screen_status_printf(_("Database update of %s started!"), - browser.filelist->path); - else - screen_status_printf(_("Database update started!")); + if (mpdclient_cmd_db_update(c, browser.filelist->path) == 0) { + if (strcmp(browser.filelist->path, "")) { + char *path_locale = + utf8_to_locale(browser.filelist->path); + screen_status_printf(_("Database update of %s started"), + path_locale); + g_free(path_locale); + } else + screen_status_printf(_("Database update started")); /* set updatingDb to make shure the browse callback gets called * even if the updated has finished before status is updated */ @@ -257,35 +262,19 @@ browse_cmd(screen_t *screen, mpdclient_t *c, command_t cmd) } } else screen_status_printf(_("Database update running...")); - return 1; - case CMD_LIST_FIND: - case CMD_LIST_RFIND: - case CMD_LIST_FIND_NEXT: - case CMD_LIST_RFIND_NEXT: - screen_find(screen, - browser.lw, filelist_length(browser.filelist), - cmd, browser_lw_callback, - browser.filelist); - file_repaint(); - return 1; - - case CMD_MOUSE_EVENT: - if (browser_handle_mouse_event(&browser, c)) - file_repaint(); - - return 1; + return true; default: break; } - if (list_window_cmd(browser.lw, filelist_length(browser.filelist), - cmd)) { - file_repaint(); - return 1; + if (browser_cmd(&browser, c, cmd)) { + if (screen_is_visible(&screen_browse)) + file_repaint(); + return true; } - return 0; + return false; } const struct screen_functions screen_browse = { @@ -298,3 +287,43 @@ const struct screen_functions screen_browse = { .get_title = browse_title, }; +bool +screen_file_goto_song(struct mpdclient *c, const struct mpd_song *song) +{ + const char *slash, *parent; + char *allocated = NULL; + bool ret; + int i; + + assert(song != NULL); + assert(song->file != NULL); + + if (strstr(song->file, "//") != NULL) + /* an URL? */ + return false; + + /* determine the song's parent directory and go there */ + + slash = strrchr(song->file, '/'); + if (slash != NULL) + parent = allocated = g_strndup(song->file, slash - song->file); + else + parent = ""; + + ret = browser_change_directory(&browser, c, NULL, parent); + g_free(allocated); + if (!ret) + return false; + + /* select the specified song */ + + i = filelist_find_song(browser.filelist, song); + if (i < 0) + i = 0; + + list_window_set_selected(browser.lw, i); + + /* finally, switch to the file screen */ + screen_switch(&screen_browse, c); + return true; +}